/ Hex Artifact Content
Login

Artifact 06fb9b8b7c5283c62f5258e098d6d1649dde7635:


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 6c 6f 67 2e 68 22 0a 0a 2f 2a 0a 2a 2a 2a 2a  "log.h"../*.****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 20 4e 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45   NOTES ON THE DE
03a0: 53 49 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45  SIGN OF THE PAGE
03b0: 52 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  R **************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
03d0: 20 57 69 74 68 69 6e 20 74 68 69 73 20 63 6f 6d   Within this com
03e0: 6d 65 6e 74 20 62 6c 6f 63 6b 2c 20 61 20 70 61  ment block, a pa
03f0: 67 65 20 69 73 20 64 65 65 6d 65 64 20 74 6f 20  ge is deemed to 
0400: 68 61 76 65 20 62 65 65 6e 20 73 79 6e 63 65 64  have been synced
0410: 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
0420: 79 20 61 73 20 73 6f 6f 6e 20 61 73 20 69 74 20  y as soon as it 
0430: 69 73 20 77 72 69 74 74 65 6e 20 77 68 65 6e 20  is written when 
0440: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
0450: 75 73 3d 4f 46 46 2e 0a 2a 2a 20 4f 74 68 65 72  us=OFF..** Other
0460: 77 69 73 65 2c 20 74 68 65 20 70 61 67 65 20 69  wise, the page i
0470: 73 20 6e 6f 74 20 73 79 6e 63 65 64 20 75 6e 74  s not synced unt
0480: 69 6c 20 74 68 65 20 78 53 79 6e 63 20 6d 65 74  il the xSync met
0490: 68 6f 64 20 6f 66 20 74 68 65 20 56 46 53 0a 2a  hod of the VFS.*
04a0: 2a 20 69 73 20 63 61 6c 6c 65 64 20 73 75 63 63  * is called succ
04b0: 65 73 73 66 75 6c 6c 79 20 6f 6e 20 74 68 65 20  essfully on the 
04c0: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
04d0: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
04e0: 44 65 66 69 6e 69 74 69 6f 6e 3a 20 20 41 20 70  Definition:  A p
04f0: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
0500: 61 73 65 20 66 69 6c 65 20 69 73 20 73 61 69 64  ase file is said
0510: 20 74 6f 20 62 65 20 22 6f 76 65 72 77 72 69 74   to be "overwrit
0520: 65 61 62 6c 65 22 20 69 66 0a 2a 2a 20 6f 6e 65  eable" if.** one
0530: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
0540: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
0550: 75 65 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  ue about the pag
0560: 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 61  e:.** .**     (a
0570: 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  )  The original 
0580: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
0590: 61 67 65 20 61 73 20 69 74 20 77 61 73 20 61 74  age as it was at
05a0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
05b0: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 68  f.**          th
05c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
05d0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69  s been written i
05e0: 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  nto the rollback
05f0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20   journal and.** 
0600: 20 20 20 20 20 20 20 20 20 73 79 6e 63 65 64 2e           synced.
0610: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20  .** .**     (b) 
0620: 20 54 68 65 20 70 61 67 65 20 77 61 73 20 61 20   The page was a 
0630: 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61  freelist leaf pa
0640: 67 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ge at the start 
0650: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0660: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28  on..** .**     (
0670: 63 29 20 20 54 68 65 20 70 61 67 65 20 6e 75 6d  c)  The page num
0680: 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
0690: 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  han the largest 
06a0: 70 61 67 65 20 74 68 61 74 20 65 78 69 73 74 65  page that existe
06b0: 64 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  d in.**         
06c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
06d0: 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  le at the start 
06e0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
06f0: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 31 29 20 41  on..** .** (1) A
0700: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
0710: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 65  abase file is ne
0720: 76 65 72 20 6f 76 65 72 77 72 69 74 74 65 6e 20  ver overwritten 
0730: 75 6e 6c 65 73 73 20 6f 6e 65 20 6f 66 20 74 68  unless one of th
0740: 65 0a 2a 2a 20 20 20 20 20 66 6f 6c 6c 6f 77 69  e.**     followi
0750: 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 20  ng are true:.** 
0760: 0a 2a 2a 20 20 20 20 20 28 61 29 20 54 68 65 20  .**     (a) The 
0770: 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 6f 74 68  page and all oth
0780: 65 72 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  er pages on the 
0790: 73 61 6d 65 20 73 65 63 74 6f 72 20 61 72 65 20  same sector are 
07a0: 6f 76 65 72 77 72 69 74 65 61 62 6c 65 2e 0a 2a  overwriteable..*
07b0: 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20 54 68  * .**     (b) Th
07c0: 65 20 61 74 6f 6d 69 63 20 70 61 67 65 20 77 72  e atomic page wr
07d0: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
07e0: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6e 64   is enabled, and
07f0: 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 20   the entire.**  
0800: 20 20 20 20 20 20 20 74 72 61 6e 73 61 63 74 69         transacti
0810: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  on other than th
0820: 65 20 75 70 64 61 74 65 20 6f 66 20 74 68 65 20  e update of the 
0830: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 71 75  transaction sequ
0840: 65 6e 63 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  ence.**         
0850: 6e 75 6d 62 65 72 20 63 6f 6e 73 69 73 74 73 20  number consists 
0860: 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
0870: 20 63 68 61 6e 67 65 2e 0a 2a 2a 20 0a 2a 2a 20   change..** .** 
0880: 28 32 29 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  (2) The content 
0890: 6f 66 20 61 20 70 61 67 65 20 77 72 69 74 74 65  of a page writte
08a0: 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62  n into the rollb
08b0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 65 78 61 63  ack journal exac
08c0: 74 6c 79 20 6d 61 74 63 68 65 73 0a 2a 2a 20 20  tly matches.**  
08d0: 20 20 20 62 6f 74 68 20 74 68 65 20 63 6f 6e 74     both the cont
08e0: 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
08f0: 61 73 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6c  ase when the rol
0900: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 77 61  lback journal wa
0910: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 20  s written.**    
0920: 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
0930: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
0940: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
0950: 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  g of the current
0960: 0a 2a 2a 20 20 20 20 20 74 72 61 6e 73 61 63 74  .**     transact
0970: 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 33 29 20  ion..** .** (3) 
0980: 57 72 69 74 65 73 20 74 6f 20 74 68 65 20 64 61  Writes to the da
0990: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
09a0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
09b0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  ple of the page 
09c0: 73 69 7a 65 0a 2a 2a 20 20 20 20 20 69 6e 20 6c  size.**     in l
09d0: 65 6e 67 74 68 20 61 6e 64 20 61 72 65 20 61 6c  ength and are al
09e0: 69 67 6e 65 64 20 74 6f 20 61 20 70 61 67 65 20  igned to a page 
09f0: 62 6f 75 6e 64 61 72 79 2e 0a 2a 2a 20 0a 2a 2a  boundary..** .**
0a00: 20 28 34 29 20 52 65 61 64 73 20 66 72 6f 6d 20   (4) Reads from 
0a10: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
0a20: 65 20 61 72 65 20 65 69 74 68 65 72 20 61 6c 69  e are either ali
0a30: 67 6e 65 64 20 6f 6e 20 61 20 70 61 67 65 20 62  gned on a page b
0a40: 6f 75 6e 64 61 72 79 20 61 6e 64 0a 2a 2a 20 20  oundary and.**  
0a50: 20 20 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75     an integer mu
0a60: 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
0a70: 67 65 20 73 69 7a 65 20 69 6e 20 6c 65 6e 67 74  ge size in lengt
0a80: 68 20 6f 72 20 61 72 65 20 74 61 6b 65 6e 20 66  h or are taken f
0a90: 72 6f 6d 20 74 68 65 0a 2a 2a 20 20 20 20 20 66  rom the.**     f
0aa0: 69 72 73 74 20 31 30 30 20 62 79 74 65 73 20 6f  irst 100 bytes o
0ab0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
0ac0: 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 35 29 20  ile..** .** (5) 
0ad0: 41 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74 68  All writes to th
0ae0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0af0: 61 72 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72  are synced prior
0b00: 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   to the rollback
0b10: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
0b20: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2c 20 74  being deleted, t
0b30: 72 75 6e 63 61 74 65 64 2c 20 6f 72 20 7a 65 72  runcated, or zer
0b40: 6f 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 28 36 29 20  oed..** .** (6) 
0b50: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
0b60: 6e 61 6c 20 66 69 6c 65 20 69 73 20 75 73 65 64  nal file is used
0b70: 2c 20 74 68 65 6e 20 61 6c 6c 20 77 72 69 74 65  , then all write
0b80: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
0b90: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 72  e file.**     ar
0ba0: 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74  e synced prior t
0bb0: 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
0bc0: 72 6e 61 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  rnal being delet
0bd0: 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 44 65 66 69 6e  ed..** .** Defin
0be0: 69 74 69 6f 6e 3a 20 54 77 6f 20 64 61 74 61 62  ition: Two datab
0bf0: 61 73 65 73 20 28 6f 72 20 74 68 65 20 73 61 6d  ases (or the sam
0c00: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 77  e database at tw
0c10: 6f 20 70 6f 69 6e 74 73 20 69 74 20 74 69 6d 65  o points it time
0c20: 29 0a 2a 2a 20 61 72 65 20 73 61 69 64 20 74 6f  ).** are said to
0c30: 20 62 65 20 22 6c 6f 67 69 63 61 6c 6c 79 20 65   be "logically e
0c40: 71 75 69 76 61 6c 65 6e 74 22 20 69 66 20 74 68  quivalent" if th
0c50: 65 79 20 67 69 76 65 20 74 68 65 20 73 61 6d 65  ey give the same
0c60: 20 61 6e 73 77 65 72 20 74 6f 0a 2a 2a 20 61 6c   answer to.** al
0c70: 6c 20 71 75 65 72 69 65 73 2e 20 20 4e 6f 74 65  l queries.  Note
0c80: 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74   in particular t
0c90: 68 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  he the content o
0ca0: 66 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66 0a  f freelist leaf.
0cb0: 2a 2a 20 70 61 67 65 73 20 63 61 6e 20 62 65 20  ** pages can be 
0cc0: 63 68 61 6e 67 65 64 20 61 72 62 69 74 61 72 69  changed arbitari
0cd0: 6c 79 20 77 69 74 68 6f 75 74 20 65 66 66 65 63  ly without effec
0ce0: 74 69 6e 67 20 74 68 65 20 6c 6f 67 69 63 61 6c  ting the logical
0cf0: 20 65 71 75 69 76 61 6c 65 6e 63 65 0a 2a 2a 20   equivalence.** 
0d00: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
0d10: 0a 2a 2a 20 0a 2a 2a 20 28 37 29 20 41 74 20 61  .** .** (7) At a
0d20: 6e 79 20 74 69 6d 65 2c 20 69 66 20 61 6e 79 20  ny time, if any 
0d30: 73 75 62 73 65 74 2c 20 69 6e 63 6c 75 64 69 6e  subset, includin
0d40: 67 20 74 68 65 20 65 6d 70 74 79 20 73 65 74 20  g the empty set 
0d50: 61 6e 64 20 74 68 65 20 74 6f 74 61 6c 20 73 65  and the total se
0d60: 74 2c 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 65  t,.**     of the
0d70: 20 75 6e 73 79 6e 63 65 64 20 63 68 61 6e 67 65   unsynced change
0d80: 73 20 74 6f 20 61 20 72 6f 6c 6c 62 61 63 6b 20  s to a rollback 
0d90: 6a 6f 75 72 6e 61 6c 20 61 72 65 20 72 65 6d 6f  journal are remo
0da0: 76 65 64 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ved and the .** 
0db0: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 72      journal is r
0dc0: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0dd0: 72 65 73 75 6c 74 69 6e 67 20 64 61 74 61 62 61  resulting databa
0de0: 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  se file will be 
0df0: 6c 6f 67 69 63 61 6c 0a 2a 2a 20 20 20 20 20 65  logical.**     e
0e00: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
0e10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
0e20: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
0e30: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0e40: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 38 29 20 57  on..** .** (8) W
0e50: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
0e60: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
0e70: 2c 20 74 68 65 20 78 54 72 75 6e 63 61 74 65 20  , the xTruncate 
0e80: 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 56 46  method of the VF
0e90: 53 0a 2a 2a 20 20 20 20 20 69 73 20 63 61 6c 6c  S.**     is call
0ea0: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
0eb0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0ec0: 74 6f 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65  to the same size
0ed0: 20 69 74 20 77 61 73 20 61 74 0a 2a 2a 20 20 20   it was at.**   
0ee0: 20 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20    the beginning 
0ef0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0f00: 6f 6e 2e 20 20 28 49 6e 20 73 6f 6d 65 20 56 46  on.  (In some VF
0f10: 53 65 73 2c 20 74 68 65 20 78 54 72 75 6e 63 61  Ses, the xTrunca
0f20: 74 65 0a 2a 2a 20 20 20 20 20 6d 65 74 68 6f 64  te.**     method
0f30: 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 62 75 74   is a no-op, but
0f40: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 63   that does not c
0f50: 68 61 6e 67 65 20 74 68 65 20 66 61 63 74 20 74  hange the fact t
0f60: 68 65 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 2a  he SQLite will.*
0f70: 2a 20 20 20 20 20 69 6e 76 6f 6b 65 20 69 74 2e  *     invoke it.
0f80: 29 0a 2a 2a 20 0a 2a 2a 20 28 39 29 20 57 68 65  ).** .** (9) Whe
0f90: 6e 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61  never the databa
0fa0: 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 64 69 66  se file is modif
0fb0: 69 65 64 2c 20 61 74 20 6c 65 61 73 74 20 6f 6e  ied, at least on
0fc0: 65 20 62 69 74 20 69 6e 20 74 68 65 20 72 61 6e  e bit in the ran
0fd0: 67 65 0a 2a 2a 20 20 20 20 20 6f 66 20 62 79 74  ge.**     of byt
0fe0: 65 73 20 66 72 6f 6d 20 32 34 20 74 68 72 6f 75  es from 24 throu
0ff0: 67 68 20 33 39 20 69 6e 63 6c 75 73 69 76 65 20  gh 39 inclusive 
1000: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20  will be changed 
1010: 70 72 69 6f 72 20 74 6f 20 72 65 6c 65 61 73 69  prior to releasi
1020: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 45 58  ng.**     the EX
1030: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 0a 2a 2a  CLUSIVE lock..**
1040: 0a 2a 2a 20 28 31 30 29 20 54 68 65 20 70 61 74  .** (10) The pat
1050: 74 65 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20  tern of bits in 
1060: 62 79 74 65 73 20 32 34 20 74 68 72 6f 75 67 68  bytes 24 through
1070: 20 33 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65   39 shall not re
1080: 70 65 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20  peat in less.** 
1090: 20 20 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69       than one bi
10a0: 6c 6c 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f  llion transactio
10b0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41  ns..**.** (11) A
10c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
10d0: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74  s well-formed at
10e0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61   the beginning a
10f0: 6e 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  nd at the conclu
1100: 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20  sion.**      of 
1110: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
1120: 6e 2e 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e  n..**.** (12) An
1130: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1140: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
1150: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
1160: 6e 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20  n writing to.** 
1170: 20 20 20 20 20 74 68 65 20 64 61 74 61 62 61 73       the databas
1180: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31  e file..**.** (1
1190: 33 29 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b  3) A SHARED lock
11a0: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
11b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
11c0: 69 6c 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a  ile reading any.
11d0: 2a 2a 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20  **      content 
11e0: 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
11f0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 0a 2f 2a  ase file..*/../*
1200: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
1210: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
1220: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
1230: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e   off.*/.#if 0.in
1240: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
1250: 61 63 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20  ace=1;  /* True 
1260: 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e  to enable tracin
1270: 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c  g */.#define sql
1280: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
1290: 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50  printf.#define P
12a0: 41 47 45 52 54 52 41 43 45 28 58 29 20 20 20 20  AGERTRACE(X)    
12b0: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
12c0: 72 54 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65  rTrace ){ sqlite
12d0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20  3DebugPrintf X; 
12e0: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
12f0: 50 41 47 45 52 54 52 41 43 45 28 58 29 0a 23 65  PAGERTRACE(X).#e
1300: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1310: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61  following two ma
1320: 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69  cros are used wi
1330: 74 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52  thin the PAGERTR
1340: 41 43 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  ACE() macros abo
1350: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
1360: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
1370: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
1380: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
1390: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
13a0: 20 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61   struct as its a
13b0: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
13c0: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
13d0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
13e0: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
13f0: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
1400: 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20  sqlite3_file.** 
1410: 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72  struct as its ar
1420: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69  gument..*/.#defi
1430: 6e 65 20 50 41 47 45 52 49 44 28 70 29 20 28 28  ne PAGERID(p) ((
1440: 69 6e 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65  int)(p->fd)).#de
1450: 66 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49  fine FILEHANDLEI
1460: 44 28 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a  D(fd) ((int)fd).
1470: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
1480: 63 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65  cache as a whole
1490: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e   is always in on
14a0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
14b0: 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a  ng.** states:.**
14c0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f  .**   PAGER_UNLO
14d0: 43 4b 20 20 20 20 20 20 20 20 54 68 65 20 70 61  CK        The pa
14e0: 67 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ge cache is not 
14f0: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
1500: 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  g or .**        
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
1520: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
1530: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65  ase file.  There
1540: 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20   is no.**       
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1560: 64 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d  data held in mem
1570: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68  ory.  This is th
1580: 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20  e initial.**    
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a0: 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20     state..**.** 
15b0: 20 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20    PAGER_SHARED  
15c0: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
15d0: 61 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20  ache is reading 
15e0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69         Writing i
1610: 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
1620: 20 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a    There can be.*
1630: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1640: 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65          multiple
1650: 20 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69   readers accessi
1660: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
1670: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
1690: 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
16a0: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ime..**.**   PAG
16b0: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 20  ER_RESERVED     
16c0: 20 54 68 69 73 20 70 72 6f 63 65 73 73 20 68 61   This process ha
16d0: 73 20 72 65 73 65 72 76 65 64 20 74 68 65 20 64  s reserved the d
16e0: 61 74 61 62 61 73 65 20 66 6f 72 20 77 72 69 74  atabase for writ
16f0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74               but
1710: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64   has not yet mad
1720: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20  e any changes.  
1730: 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73  Only one process
1740: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1750: 20 20 20 20 20 20 20 20 20 20 61 74 20 61 20 74            at a t
1760: 69 6d 65 20 63 61 6e 20 72 65 73 65 72 76 65 20  ime can reserve 
1770: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
1780: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  he original.**  
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
17b0: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
17c0: 6d 6f 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65  modified so othe
17d0: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
17e0: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65             proce
17f0: 73 73 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62  sses may still b
1800: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e  e reading the on
1810: 2d 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20  -disk.**        
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1830: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1840: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c  .**   PAGER_EXCL
1850: 55 53 49 56 45 20 20 20 20 20 54 68 65 20 70 61  USIVE     The pa
1860: 67 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74  ge cache is writ
1870: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1880: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
1890: 20 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73             Acces
18a0: 73 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  s is exclusive. 
18b0: 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   No other proces
18c0: 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ses or.**       
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 74 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72  threads can be r
18f0: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1900: 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20  g while one.**  
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20       process is 
1930: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  writing..**.**  
1940: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
1950: 20 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d       The pager m
1960: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
1970: 74 65 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58  te from PAGER_EX
1980: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20  CLUSIVE.**      
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a0: 20 61 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79   after all dirty
19b0: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
19c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
19d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
19e0: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
19f0: 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
1a00: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
1a10: 63 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ced to.**       
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a30: 64 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72  disk. All that r
1a40: 65 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20  emains to do is 
1a50: 74 6f 20 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20  to remove or.** 
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 74 72 75 6e 63 61 74 65 20 74        truncate t
1a80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a90: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
1aa0: 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ion .**         
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
1ac0: 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e  ll be committed.
1ad0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
1ae0: 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69  cache comes up i
1af0: 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  n PAGER_UNLOCK. 
1b00: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
1b10: 61 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  a.** sqlite3Page
1b20: 72 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  rGet() occurs, t
1b30: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
1b40: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
1b50: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
1b60: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
1b70: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
1b80: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
1b90: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
1ba0: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
1bb0: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
1bc0: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
1bd0: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
1be0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1bf0: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
1c00: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
1c10: 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
1c20: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
1c30: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
1c40: 72 57 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  rWrite() can onl
1c50: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
1c60: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
1c70: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
1c80: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
1c90: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
1ca0: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
1cb0: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
1cc0: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
1cd0: 56 45 44 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52  VED.).** PAGER_R
1ce0: 45 53 45 52 56 45 44 20 6d 65 61 6e 73 20 74 68  ESERVED means th
1cf0: 61 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f  at there is an o
1d00: 70 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  pen rollback jou
1d10: 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61  rnal..** The tra
1d20: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
1d30: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
1d40: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  s before any cha
1d50: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
1d60: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1d70: 20 66 69 6c 65 2c 20 74 68 6f 75 67 68 20 77 72   file, though wr
1d80: 69 74 65 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c  ites to the roll
1d90: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
1da0: 6f 63 63 75 72 73 20 77 69 74 68 20 6a 75 73 74  occurs with just
1db0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
1dc0: 20 20 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74    After an sqlit
1dd0: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1de0: 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 50  ).** or sqlite3P
1df0: 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
1e00: 77 6f 28 29 2c 20 74 68 65 20 73 74 61 74 65 20  wo(), the state 
1e10: 63 61 6e 20 67 6f 20 62 61 63 6b 20 74 6f 20 50  can go back to P
1e20: 41 47 45 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20  AGER_SHARED,.** 
1e30: 6f 72 20 69 74 20 63 61 6e 20 73 74 61 79 20 61  or it can stay a
1e40: 74 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  t PAGER_EXCLUSIV
1e50: 45 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 65  E if we are in e
1e60: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
1e70: 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  mode..*/.#define
1e80: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
1e90: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
1ea0: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 31  ER_SHARED      1
1eb0: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48     /* same as SH
1ec0: 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  ARED_LOCK */.#de
1ed0: 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52  fine PAGER_RESER
1ee0: 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61  VED    2   /* sa
1ef0: 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c  me as RESERVED_L
1f00: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1f10: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20  AGER_EXCLUSIVE  
1f20: 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   4   /* same as 
1f30: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a  EXCLUSIVE_LOCK *
1f40: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1f50: 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f  SYNCED      5../
1f60: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
1f70: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
1f80: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
1f90: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
1fa0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
1fb0: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
1fc0: 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c  EC1(P,D,N,X,E) \
1fd0: 0a 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64  .    if( P->xCod
1fe0: 65 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28  ec && P->xCodec(
1ff0: 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29  P->pCodec,D,N,X)
2000: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65  ==0 ){ E; }.# de
2010: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
2020: 4e 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69  N,X,E,O) \.    i
2030: 66 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20  f( P->xCodec==0 
2040: 29 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d  ){ O=(char*)D; }
2050: 65 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28  else \.    if( (
2060: 4f 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f  O=(char*)(P->xCo
2070: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c  dec(P->pCodec,D,
2080: 4e 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20  N,X)))==0 ){ E; 
2090: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
20a0: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c   CODEC1(P,D,N,X,
20b0: 45 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  E)   /* NO-OP */
20c0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
20d0: 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d  (P,D,N,X,E,O) O=
20e0: 28 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a  (char*)D.#endif.
20f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
2100: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f  um allowed secto
2110: 72 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49  r size. 64KiB. I
2120: 66 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a  f the xSectorsiz
2130: 65 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72  e() method .** r
2140: 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c  eturns a value l
2150: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c  arger than this,
2160: 20 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52   then MAX_SECTOR
2170: 5f 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e  _SIZE is used in
2180: 73 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63  stead..** This c
2190: 6f 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79  ould conceivably
21a0: 20 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f   cause corruptio
21b0: 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f  n following a po
21c0: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a  wer failure on.*
21d0: 2a 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e  * such a system.
21e0: 20 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74   This is current
21f0: 6c 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74  ly an undocument
2200: 65 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65  ed limit..*/.#de
2210: 66 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f  fine MAX_SECTOR_
2220: 53 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a  SIZE 0x10000../*
2230: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
2240: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2250: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
2260: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
2270: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
2280: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
2290: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
22a0: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
22b0: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
22c0: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
22d0: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
22e0: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
22f0: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
2300: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
2310: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
2320: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
2330: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
2340: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
2350: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
2360: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
2370: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
2380: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
2390: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
23a0: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
23b0: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
23c0: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
23d0: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
23e0: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
23f0: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
2400: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
2410: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
2420: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
2430: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
2440: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
2450: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
2460: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
2470: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
2480: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
2490: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
24a0: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
24b0: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
24c0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
24d0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
24e0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
24f0: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
2500: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
2510: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
2520: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
2530: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
2540: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
2550: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
2560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2570: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
2580: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
2590: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
25a0: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
25b0: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
25c0: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25e0: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
25f0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
2600: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
2610: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
2620: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2630: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
2640: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
2650: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e  };../*.** A open
2660: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61   page cache is a
2670: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
2680: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
2690: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 65 72 72  cture..**.** err
26a0: 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67  Code.**.**   Pag
26b0: 65 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20 62  er.errCode may b
26c0: 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  e set to SQLITE_
26d0: 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f  IOERR, SQLITE_CO
26e0: 52 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 20 20 6f  RRUPT, or.**   o
26f0: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f  r SQLITE_FULL. O
2700: 6e 63 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66  nce one of the f
2710: 69 72 73 74 20 74 68 72 65 65 20 65 72 72 6f 72  irst three error
2720: 73 20 6f 63 63 75 72 73 2c 20 69 74 20 70 65 72  s occurs, it per
2730: 73 69 73 74 73 0a 2a 2a 20 20 20 61 6e 64 20 69  sists.**   and i
2740: 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 74 68  s returned as th
2750: 65 20 72 65 73 75 6c 74 20 6f 66 20 65 76 65 72  e result of ever
2760: 79 20 6d 61 6a 6f 72 20 70 61 67 65 72 20 41 50  y major pager AP
2770: 49 20 63 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20  I call.  The.** 
2780: 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 72 65    SQLITE_FULL re
2790: 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 6c 69  turn code is sli
27a0: 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74 2e  ghtly different.
27b0: 20 49 74 20 70 65 72 73 69 73 74 73 20 6f 6e 6c   It persists onl
27c0: 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 20  y until the.**  
27d0: 20 6e 65 78 74 20 73 75 63 63 65 73 73 66 75 6c   next successful
27e0: 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65 72   rollback is per
27f0: 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 70 61  formed on the pa
2800: 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c  ger cache. Also,
2810: 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 46 55 4c  .**   SQLITE_FUL
2820: 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63  L does not affec
2830: 74 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  t the sqlite3Pag
2840: 65 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69  erGet() and sqli
2850: 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  te3PagerLookup()
2860: 0a 2a 2a 20 20 20 41 50 49 73 2c 20 74 68 65 79  .**   APIs, they
2870: 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73   may still be us
2880: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
2890: 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 56 61 6c  .**.** dbSizeVal
28a0: 69 64 2c 20 64 62 53 69 7a 65 2c 20 64 62 4f 72  id, dbSize, dbOr
28b0: 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53 69  igSize, dbFileSi
28c0: 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 4d 61 6e 61 67  ze.**.**   Manag
28d0: 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ing the size of 
28e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28f0: 65 20 69 6e 20 70 61 67 65 73 20 69 73 20 61 20  e in pages is a 
2900: 6c 69 74 74 6c 65 20 63 6f 6d 70 6c 69 63 61 74  little complicat
2910: 65 64 2e 0a 2a 2a 20 20 20 54 68 65 20 76 61 72  ed..**   The var
2920: 69 61 62 6c 65 20 50 61 67 65 72 2e 64 62 53 69  iable Pager.dbSi
2930: 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ze contains the 
2940: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2950: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
2960: 65 0a 2a 2a 20 20 20 69 6d 61 67 65 20 63 75 72  e.**   image cur
2970: 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 2e  rently contains.
2980: 20 41 73 20 74 68 65 20 64 61 74 61 62 61 73 65   As the database
2990: 20 69 6d 61 67 65 20 67 72 6f 77 73 20 6f 72 20   image grows or 
29a0: 73 68 72 69 6e 6b 73 20 74 68 69 73 0a 2a 2a 20  shrinks this.** 
29b0: 20 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 70    variable is up
29c0: 64 61 74 65 64 2e 20 54 68 65 20 76 61 72 69 61  dated. The varia
29d0: 62 6c 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65  ble Pager.dbFile
29e0: 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Size contains th
29f0: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 6f 66  e number.**   of
2a00: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
2a10: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69  tabase file. Thi
2a20: 73 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65  s may be differe
2a30: 6e 74 20 66 72 6f 6d 20 50 61 67 65 72 2e 64 62  nt from Pager.db
2a40: 53 69 7a 65 0a 2a 2a 20 20 20 69 66 20 73 6f 6d  Size.**   if som
2a50: 65 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  e pages have bee
2a60: 6e 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  n appended to th
2a70: 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
2a80: 20 62 75 74 20 6e 6f 74 20 79 65 74 20 77 72 69   but not yet wri
2a90: 74 74 65 6e 0a 2a 2a 20 20 20 6f 75 74 20 66 72  tten.**   out fr
2aa0: 6f 6d 20 74 68 65 20 63 61 63 68 65 20 74 6f 20  om the cache to 
2ab0: 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20  the actual file 
2ac0: 6f 6e 20 64 69 73 6b 2e 20 4f 72 20 69 66 20 74  on disk. Or if t
2ad0: 68 65 20 69 6d 61 67 65 20 68 61 73 20 62 65 65  he image has bee
2ae0: 6e 0a 2a 2a 20 20 20 74 72 75 6e 63 61 74 65 64  n.**   truncated
2af0: 20 62 79 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   by an increment
2b00: 61 6c 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74  al-vacuum operat
2b10: 69 6f 6e 2e 20 54 68 65 20 50 61 67 65 72 2e 64  ion. The Pager.d
2b20: 62 4f 72 69 67 53 69 7a 65 20 76 61 72 69 61 62  bOrigSize variab
2b30: 6c 65 0a 2a 2a 20 20 20 63 6f 6e 74 61 69 6e 73  le.**   contains
2b40: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
2b50: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
2b60: 62 61 73 65 20 69 6d 61 67 65 20 77 68 65 6e 20  base image when 
2b70: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20  the current.**  
2b80: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
2b90: 20 6f 70 65 6e 65 64 2e 20 54 68 65 20 63 6f 6e   opened. The con
2ba0: 74 65 6e 74 73 20 6f 66 20 61 6c 6c 20 74 68 72  tents of all thr
2bb0: 65 65 20 6f 66 20 74 68 65 73 65 20 76 61 72 69  ee of these vari
2bc0: 61 62 6c 65 73 20 69 73 0a 2a 2a 20 20 20 6f 6e  ables is.**   on
2bd0: 6c 79 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  ly guaranteed to
2be0: 20 62 65 20 63 6f 72 72 65 63 74 20 69 66 20 74   be correct if t
2bf0: 68 65 20 62 6f 6f 6c 65 61 6e 20 50 61 67 65 72  he boolean Pager
2c00: 2e 64 62 53 69 7a 65 56 61 6c 69 64 20 69 73 20  .dbSizeValid is 
2c10: 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 4f  true..**.**   TO
2c20: 44 4f 3a 20 55 6e 64 65 72 20 77 68 61 74 20 63  DO: Under what c
2c30: 6f 6e 64 69 74 69 6f 6e 73 20 69 73 20 64 62 53  onditions is dbS
2c40: 69 7a 65 56 61 6c 69 64 20 73 65 74 3f 20 43 6c  izeValid set? Cl
2c50: 65 61 72 65 64 3f 0a 2a 2a 0a 2a 2a 20 63 68 61  eared?.**.** cha
2c60: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a  ngeCountDone.**.
2c70: 2a 2a 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61  **   This boolea
2c80: 6e 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  n variable is us
2c90: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
2ca0: 74 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d  that the change-
2cb0: 63 6f 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74  counter .**   (t
2cc0: 68 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72  he 4-byte header
2cd0: 20 66 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f   field at byte o
2ce0: 66 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20  ffset 24 of the 
2cf0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 69  database file) i
2d00: 73 20 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61  s .**   not upda
2d10: 74 65 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74  ted more often t
2d20: 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a  han necessary. .
2d30: 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65  **.**   It is se
2d40: 74 20 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74  t to true when t
2d50: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2d60: 72 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  r field is updat
2d70: 65 64 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20  ed, which .**   
2d80: 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
2d90: 69 66 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  if an exclusive 
2da0: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20  lock is held on 
2db0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2dc0: 65 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c  e..**   It is cl
2dd0: 65 61 72 65 64 20 28 73 65 74 20 74 6f 20 66 61  eared (set to fa
2de0: 6c 73 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e  lse) whenever an
2df0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
2e00: 69 73 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75  is .**   relinqu
2e10: 69 73 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74  ished on the dat
2e20: 61 62 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68  abase file. Each
2e30: 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74   time a transact
2e40: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
2e50: 2c 0a 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67  ,.**   The chang
2e60: 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
2e70: 69 73 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66  is inspected. If
2e80: 20 69 74 20 69 73 20 74 72 75 65 2c 20 74 68 65   it is true, the
2e90: 20 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70   work of.**   up
2ea0: 64 61 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67  dating the chang
2eb0: 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69  e-counter is omi
2ec0: 74 74 65 64 20 66 6f 72 20 74 68 65 20 63 75 72  tted for the cur
2ed0: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
2ee0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d  ..**.**   This m
2ef0: 65 63 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74  echanism means t
2f00: 68 61 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67  hat when running
2f10: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
2f20: 64 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  de, a connection
2f30: 20 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79   .**   need only
2f40: 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
2f50: 67 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c  ge-counter once,
2f60: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74   for the first t
2f70: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2f80: 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
2f90: 20 64 62 4d 6f 64 69 66 69 65 64 0a 2a 2a 0a 2a   dbModified.**.*
2fa0: 2a 20 20 20 54 68 65 20 64 62 4d 6f 64 69 66 69  *   The dbModifi
2fb0: 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 77  ed flag is set w
2fc0: 68 65 6e 65 76 65 72 20 61 20 64 61 74 61 62 61  henever a databa
2fd0: 73 65 20 70 61 67 65 20 69 73 20 64 69 72 74 69  se page is dirti
2fe0: 65 64 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63  ed..**   It is c
2ff0: 6c 65 61 72 65 64 20 61 74 20 74 68 65 20 65 6e  leared at the en
3000: 64 20 6f 66 20 65 61 63 68 20 74 72 61 6e 73 61  d of each transa
3010: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49  ction..**.**   I
3020: 74 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 63  t is used when c
3030: 6f 6d 6d 69 74 74 69 6e 67 20 6f 72 20 6f 74 68  ommitting or oth
3040: 65 72 77 69 73 65 20 65 6e 64 69 6e 67 20 61 20  erwise ending a 
3050: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 0a  transaction. If.
3060: 2a 2a 20 20 20 74 68 65 20 64 62 4d 6f 64 69 66  **   the dbModif
3070: 69 65 64 20 66 6c 61 67 20 69 73 20 63 6c 65 61  ied flag is clea
3080: 72 20 74 68 65 6e 20 6c 65 73 73 20 77 6f 72 6b  r then less work
3090: 20 68 61 73 20 74 6f 20 62 65 20 64 6f 6e 65 2e   has to be done.
30a0: 0a 2a 2a 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 53 74  .**.** journalSt
30b0: 61 72 74 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68  arted.**.**   Th
30c0: 69 73 20 66 6c 61 67 20 69 73 20 73 65 74 20 77  is flag is set w
30d0: 68 65 6e 65 76 65 72 20 74 68 65 20 74 68 65 20  henever the the 
30e0: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20  main journal is 
30f0: 6f 70 65 6e 65 64 20 61 6e 64 0a 2a 2a 20 20 20  opened and.**   
3100: 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 0a 2a  initialized.**.*
3110: 2a 20 20 20 54 68 65 20 70 6f 69 6e 74 20 6f 66  *   The point of
3120: 20 74 68 69 73 20 66 6c 61 67 20 69 73 20 74 68   this flag is th
3130: 61 74 20 69 74 20 6d 75 73 74 20 62 65 20 73 65  at it must be se
3140: 74 20 61 66 74 65 72 20 74 68 65 20 0a 2a 2a 20  t after the .** 
3150: 20 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20    first journal 
3160: 68 65 61 64 65 72 20 69 6e 20 61 20 6a 6f 75 72  header in a jour
3170: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65  nal file has bee
3180: 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  n synced to disk
3190: 2e 0a 2a 2a 20 20 20 41 66 74 65 72 20 74 68 69  ..**   After thi
31a0: 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20  s has happened, 
31b0: 6e 65 77 20 70 61 67 65 73 20 61 70 70 65 6e 64  new pages append
31c0: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
31d0: 73 65 20 0a 2a 2a 20 20 20 64 6f 20 6e 6f 74 20  se .**   do not 
31e0: 6e 65 65 64 20 74 68 65 20 50 47 48 44 52 5f 4e  need the PGHDR_N
31f0: 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 73 65  EED_SYNC flag se
3200: 74 2c 20 61 73 20 74 68 65 79 20 64 6f 20 6e 6f  t, as they do no
3210: 74 20 6e 65 65 64 0a 2a 2a 20 20 20 74 6f 20 77  t need.**   to w
3220: 61 69 74 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61  ait for a journa
3230: 6c 20 73 79 6e 63 20 62 65 66 6f 72 65 20 74 68  l sync before th
3240: 65 79 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ey can be writte
3250: 6e 20 6f 75 74 20 74 6f 0a 2a 2a 20 20 20 74 68  n out to.**   th
3260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
3270: 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 20 70 61  (see function pa
3280: 67 65 72 5f 77 72 69 74 65 28 29 29 2e 0a 2a 2a  ger_write())..**
3290: 20 20 20 0a 2a 2a 20 73 65 74 4d 61 73 74 65 72     .** setMaster
32a0: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61  .**.**   This va
32b0: 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
32c0: 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
32d0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
32e0: 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20   file name.**   
32f0: 28 69 66 20 61 6e 79 29 20 69 73 20 6f 6e 6c 79  (if any) is only
3300: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
3310: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
3320: 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65  nce..**.**   Whe
3330: 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
3340: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20  ransaction, the 
3350: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
3360: 69 6c 65 20 6e 61 6d 65 20 28 69 66 20 61 6e 79  ile name (if any
3370: 29 0a 2a 2a 20 20 20 6d 61 79 20 62 65 20 77 72  ).**   may be wr
3380: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
3390: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 69 6c  ournal file whil
33a0: 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 73  e the pager is s
33b0: 74 69 6c 6c 20 69 6e 0a 2a 2a 20 20 20 50 41 47  till in.**   PAG
33c0: 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74  ER_RESERVED stat
33d0: 65 20 28 73 65 65 20 43 6f 6d 6d 69 74 50 68 61  e (see CommitPha
33e0: 73 65 4f 6e 65 28 29 20 66 6f 72 20 74 68 65 20  seOne() for the 
33f0: 61 63 74 69 6f 6e 29 2e 20 49 74 0a 2a 2a 20 20  action). It.**  
3400: 20 74 68 65 6e 20 61 74 74 65 6d 70 74 73 20 74   then attempts t
3410: 6f 20 75 70 67 72 61 64 65 20 74 6f 20 61 6e 20  o upgrade to an 
3420: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20  exclusive lock. 
3430: 49 66 20 74 68 69 73 20 61 74 74 65 6d 70 74 0a  If this attempt.
3440: 2a 2a 20 20 20 66 61 69 6c 73 2c 20 74 68 65 6e  **   fails, then
3450: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6d 61 79   SQLITE_BUSY may
3460: 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20   be returned to 
3470: 74 68 65 20 75 73 65 72 20 61 6e 64 20 74 68 65  the user and the
3480: 20 75 73 65 72 0a 2a 2a 20 20 20 6d 61 79 20 61   user.**   may a
3490: 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d 6d 69 74  ttempt to commit
34a0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
34b0: 20 61 67 61 69 6e 20 6c 61 74 65 72 20 28 63 61   again later (ca
34c0: 6c 6c 69 6e 67 0a 2a 2a 20 20 20 43 6f 6d 6d 69  lling.**   Commi
34d0: 74 50 68 61 73 65 4f 6e 65 28 29 20 61 67 61 69  tPhaseOne() agai
34e0: 6e 29 2e 20 54 68 69 73 20 66 6c 61 67 20 69 73  n). This flag is
34f0: 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
3500: 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 20 20 6d  that the .**   m
3510: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
3520: 6d 65 20 69 73 20 6f 6e 6c 79 20 77 72 69 74 74  me is only writt
3530: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
3540: 6c 20 66 69 6c 65 20 74 68 65 20 66 69 72 73 74  l file the first
3550: 0a 2a 2a 20 20 20 74 69 6d 65 20 43 6f 6d 6d 69  .**   time Commi
3560: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
3570: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e  alled..**.** doN
3580: 6f 74 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 57  otSync.**.**   W
3590: 68 65 6e 20 65 6e 61 62 6c 65 64 2c 20 63 61 63  hen enabled, cac
35a0: 68 65 20 73 70 69 6c 6c 73 20 61 72 65 20 70 72  he spills are pr
35b0: 6f 68 69 62 69 74 65 64 20 61 6e 64 20 74 68 65  ohibited and the
35c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
35d0: 6e 6e 6f 74 0a 2a 2a 20 20 20 62 65 20 73 79 6e  nnot.**   be syn
35e0: 63 65 64 2e 20 20 54 68 69 73 20 76 61 72 69 61  ced.  This varia
35f0: 62 6c 65 20 69 73 20 73 65 74 20 61 6e 64 20 63  ble is set and c
3600: 6c 65 61 72 65 64 20 62 79 20 73 71 6c 69 74 65  leared by sqlite
3610: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 0a 2a  3PagerWrite() .*
3620: 2a 20 20 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  *   in order to 
3630: 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61  prevent a journa
3640: 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61 70 70  l sync from happ
3650: 65 6e 69 6e 67 20 69 6e 20 62 65 74 77 65 65 6e  ening in between
3660: 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61   the.**   journa
3670: 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61 67  lling of two pag
3680: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
3690: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 6e 65 65  ector..**.** nee
36a0: 64 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 54 4f  dSync.**.**   TO
36b0: 44 4f 3a 20 49 74 20 6d 69 67 68 74 20 62 65 20  DO: It might be 
36c0: 65 61 73 69 65 72 20 74 6f 20 73 65 74 20 74 68  easier to set th
36d0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 6e 20 77  is variable in w
36e0: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29  riteJournalHdr()
36f0: 0a 2a 2a 20 20 20 61 6e 64 20 77 72 69 74 65 4d  .**   and writeM
3700: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 6f  asterJournal() o
3710: 6e 6c 79 2e 20 43 68 61 6e 67 65 20 69 74 73 20  nly. Change its 
3720: 6d 65 61 6e 69 6e 67 20 74 6f 20 22 75 6e 73 79  meaning to "unsy
3730: 6e 63 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 68  nced data.**   h
3740: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
3750: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 22 2e  to the journal".
3760: 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e 4d 65 6d  .**.** subjInMem
3770: 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  ory.**.**   This
3780: 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61   is a boolean va
3790: 72 69 61 62 6c 65 2e 20 49 66 20 74 72 75 65 2c  riable. If true,
37a0: 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72   then any requir
37b0: 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  ed sub-journal.*
37c0: 2a 20 20 20 69 73 20 6f 70 65 6e 65 64 20 61 73  *   is opened as
37d0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
37e0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 66  urnal file. If f
37f0: 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 2d 6d 65  alse, then in-me
3800: 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62 2d 6a 6f  mory.**   sub-jo
3810: 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e 6c 79 20  urnals are only 
3820: 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f  used for in-memo
3830: 72 79 20 70 61 67 65 72 20 66 69 6c 65 73 2e 0a  ry pager files..
3840: 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20  */.struct Pager 
3850: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
3860: 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20  *pVfs;          
3870: 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20  /* OS functions 
3880: 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f  to use for IO */
3890: 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d  .  u8 exclusiveM
38a0: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ode;           /
38b0: 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20  * Boolean. True 
38c0: 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  if locking_mode=
38d0: 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20  =EXCLUSIVE */.  
38e0: 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20  u8 journalMode; 
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
3900: 6e 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a  n of the PAGER_J
3910: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76 61 6c  OURNALMODE_* val
3920: 75 65 73 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a  ues */.  u8 useJ
3930: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
3940: 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f       /* Use a ro
3950: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f  llback journal o
3960: 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
3970: 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20   u8 noReadlock; 
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3990: 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f  Do not bother to
39a0: 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b   obtain readlock
39b0: 73 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63  s */.  u8 noSync
39c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
39d0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e     /* Do not syn
39e0: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66  c the journal if
39f0: 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75   true */.  u8 fu
3a00: 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  llSync;         
3a10: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74         /* Do ext
3a20: 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20  ra syncs of the 
3a30: 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75  journal for robu
3a40: 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73  stness */.  u8 s
3a50: 79 6e 63 5f 66 6c 61 67 73 3b 20 20 20 20 20 20  ync_flags;      
3a60: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
3a70: 66 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  f SYNC_NORMAL or
3a80: 20 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20 20   SYNC_FULL */.  
3a90: 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20  u8 tempFile;    
3aa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
3ab0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65  Filename is a te
3ac0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a  mporary file */.
3ad0: 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20    u8 readOnly;  
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3af0: 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64   True for a read
3b00: 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
3b10: 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20  /.  u8 memDb;   
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b30: 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62  /* True to inhib
3b40: 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20  it all file I/O 
3b50: 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  */..  /* The fol
3b60: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e  lowing block con
3b70: 74 61 69 6e 73 20 74 68 6f 73 65 20 63 6c 61 73  tains those clas
3b80: 73 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 61  s members that a
3b90: 72 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20  re dynamically. 
3ba0: 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 64 75 72   ** modified dur
3bb0: 69 6e 67 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61  ing normal opera
3bc0: 74 69 6f 6e 73 2e 20 54 68 65 20 6f 74 68 65 72  tions. The other
3bd0: 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68   variables in th
3be0: 69 73 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  is structure.  *
3bf0: 2a 20 61 72 65 20 65 69 74 68 65 72 20 63 6f 6e  * are either con
3c00: 73 74 61 6e 74 20 74 68 72 6f 75 67 68 6f 75 74  stant throughout
3c10: 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66   the lifetime of
3c20: 20 74 68 65 20 70 61 67 65 72 2c 20 6f 72 20 65   the pager, or e
3c30: 6c 73 65 0a 20 20 2a 2a 20 75 73 65 64 20 74 6f  lse.  ** used to
3c40: 20 73 74 6f 72 65 20 63 6f 6e 66 69 67 75 72 61   store configura
3c50: 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 20  tion parameters 
3c60: 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65 20  that affect the 
3c70: 77 61 79 20 74 68 65 20 70 61 67 65 72 20 0a 20  way the pager . 
3c80: 20 2a 2a 20 6f 70 65 72 61 74 65 73 2e 0a 20 20   ** operates..  
3c90: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 27 73 74 61  **.  ** The 'sta
3ca0: 74 65 27 20 76 61 72 69 61 62 6c 65 20 69 73 20  te' variable is 
3cb0: 64 65 73 63 72 69 62 65 64 20 69 6e 20 6d 6f 72  described in mor
3cc0: 65 20 64 65 74 61 69 6c 20 61 6c 6f 6e 67 20 77  e detail along w
3cd0: 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 64 65 73  ith the.  ** des
3ce0: 63 72 69 70 74 69 6f 6e 73 20 6f 66 20 74 68 65  criptions of the
3cf0: 20 76 61 6c 75 65 73 20 69 74 20 6d 61 79 20 74   values it may t
3d00: 61 6b 65 20 2d 20 50 41 47 45 52 5f 55 4e 4c 4f  ake - PAGER_UNLO
3d10: 43 4b 20 65 74 63 2e 20 4d 61 6e 79 20 6f 66 20  CK etc. Many of 
3d20: 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 76  the.  ** other v
3d30: 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 69 73  ariables in this
3d40: 20 62 6c 6f 63 6b 20 61 72 65 20 64 65 73 63 72   block are descr
3d50: 69 62 65 64 20 69 6e 20 74 68 65 20 63 6f 6d 6d  ibed in the comm
3d60: 65 6e 74 20 64 69 72 65 63 74 6c 79 20 0a 20 20  ent directly .  
3d70: 2a 2a 20 61 62 6f 76 65 20 74 68 69 73 20 63 6c  ** above this cl
3d80: 61 73 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a  ass definition..
3d90: 20 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b    */.  u8 state;
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3db0: 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f     /* PAGER_UNLO
3dc0: 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45  CK, _SHARED, _RE
3dd0: 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a  SERVED, etc. */.
3de0: 20 20 75 38 20 64 62 4d 6f 64 69 66 69 65 64 3b    u8 dbModified;
3df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3e00: 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 61   True if there a
3e10: 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74  re any changes t
3e20: 6f 20 74 68 65 20 44 62 20 2a 2f 0a 20 20 75 38  o the Db */.  u8
3e30: 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20   needSync;      
3e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3e50: 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20  e if an fsync() 
3e60: 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65  is needed on the
3e70: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38   journal */.  u8
3e80: 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b   journalStarted;
3e90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3ea0: 65 20 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a  e if header of j
3eb0: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
3ec0: 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43   */.  u8 changeC
3ed0: 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20  ountDone;       
3ee0: 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69    /* Set after i
3ef0: 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
3f00: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a  change-counter *
3f10: 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72  /.  u8 setMaster
3f20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3f30: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a  /* True if a m-j
3f40: 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77   name has been w
3f50: 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a  ritten to jrnl *
3f60: 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63  /.  u8 doNotSync
3f70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3f80: 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c  /* Boolean. Whil
3f90: 65 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73  e true, do not s
3fa0: 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 2a  pill the cache *
3fb0: 2f 0a 20 20 75 38 20 64 62 53 69 7a 65 56 61 6c  /.  u8 dbSizeVal
3fc0: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
3fd0: 2f 2a 20 53 65 74 20 77 68 65 6e 20 64 62 53 69  /* Set when dbSi
3fe0: 7a 65 20 69 73 20 63 6f 72 72 65 63 74 20 2a 2f  ze is correct */
3ff0: 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f  .  u8 subjInMemo
4000: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ry;            /
4010: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e  * True to use in
4020: 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72  -memory sub-jour
4030: 6e 61 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  nals */.  Pgno d
4040: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
4050: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4060: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
4070: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67  database */.  Pg
4080: 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20  no dbOrigSize;  
4090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53            /* dbS
40a0: 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63  ize before the c
40b0: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
40c0: 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46  on */.  Pgno dbF
40d0: 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ileSize;        
40e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
40f0: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
4100: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
4110: 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20   int errCode;   
4120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4130: 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b  One of several k
4140: 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a  inds of errors *
4150: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
4160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4170: 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c  /* Pages journal
4180: 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20 6a  led since last j
4190: 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20  -header written 
41a0: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e  */.  u32 cksumIn
41b0: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
41c0: 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d   /* Quasi-random
41d0: 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20   value added to 
41e0: 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a  every checksum *
41f0: 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63 3b  /.  u32 nSubRec;
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4210: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  /* Number of rec
4220: 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ords written to 
4230: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  sub-journal */. 
4240: 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72   Bitvec *pInJour
4250: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nal;         /* 
4260: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
4270: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
4280: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
4290: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
42a0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
42b0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
42c0: 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  or database */. 
42d0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a   sqlite3_file *j
42e0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd;          /* 
42f0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
4300: 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  for main journal
4310: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
4320: 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20  le *sjfd;       
4330: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
4340: 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75  ptor for sub-jou
4350: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  rnal */.  i64 jo
4360: 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20  urnalOff;       
4370: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
4380: 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e   write offset in
4390: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
43a0: 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  e */.  i64 journ
43b0: 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20  alHdr;          
43c0: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
43d0: 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f  t to previous jo
43e0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
43f0: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a    i64 journalSiz
4400: 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a  eLimit;       /*
4410: 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20   Size limit for 
4420: 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e  persistent journ
4430: 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 50 61  al files */.  Pa
4440: 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 53  gerSavepoint *aS
4450: 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72  avepoint; /* Arr
4460: 61 79 20 6f 66 20 61 63 74 69 76 65 20 73 61 76  ay of active sav
4470: 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  epoints */.  int
4480: 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20   nSavepoint;    
4490: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
44a0: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
44b0: 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a  n aSavepoint[] *
44c0: 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65 56  /.  char dbFileV
44d0: 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20 20  ers[16];        
44e0: 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65  /* Changes whene
44f0: 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  ver database fil
4500: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75  e changes */.  u
4510: 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20  32 sectorSize;  
4520: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
4530: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
4540: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
4550: 6b 20 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78 74  k */..  u16 nExt
4560: 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ra;             
4570: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
4580: 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61  many bytes to ea
4590: 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
45a0: 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73 65  e */.  i16 nRese
45b0: 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
45c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
45d0: 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74 20  unused bytes at 
45e0: 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67 65  end of each page
45f0: 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c 61   */.  u32 vfsFla
4600: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
4610: 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 73    /* Flags for s
4620: 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
4630: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  () */.  int page
4640: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
4650: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4660: 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65   bytes in a page
4670: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e   */.  Pgno mxPgn
4680: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
4690: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c    /* Maximum all
46a0: 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65  owed size of the
46b0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
46c0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
46d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
46e0: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
46f0: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  se file */.  cha
4700: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
4710: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
4720: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
4730: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  file */.  int (*
4740: 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f  xBusyHandler)(vo
4750: 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f  id*); /* Functio
4760: 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20 62  n to call when b
4770: 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  usy */.  void *p
4780: 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 20  BusyHandlerArg; 
4790: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
47a0: 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78 42 75  argument for xBu
47b0: 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 23 69 66  syHandler */.#if
47c0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
47d0: 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73    int nHit, nMis
47e0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
47f0: 20 43 61 63 68 65 20 68 69 74 73 20 61 6e 64 20   Cache hits and 
4800: 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  missing */.  int
4810: 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b 20   nRead, nWrite; 
4820: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
4830: 62 61 73 65 20 70 61 67 65 73 20 72 65 61 64 2f  base pages read/
4840: 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69  written */.#endi
4850: 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  f.  void (*xRein
4860: 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20  iter)(DbPage*); 
4870: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
4880: 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64  tine when reload
4890: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66  ing pages */.#if
48a0: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
48b0: 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ODEC.  void *(*x
48c0: 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
48d0: 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a  d*,Pgno,int); /*
48e0: 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f   Routine for en/
48f0: 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f  decoding data */
4900: 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
4910: 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c  SizeChng)(void*,
4920: 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74  int,int); /* Not
4930: 69 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65  ify of page size
4940: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f   changes */.  vo
4950: 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29  id (*xCodecFree)
4960: 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20  (void*);        
4970: 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74       /* Destruct
4980: 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63  or for the codec
4990: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64   */.  void *pCod
49a0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
49b0: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
49c0: 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e  ent to xCodec...
49d0: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64   methods */.#end
49e0: 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53  if.  char *pTmpS
49f0: 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
4a00: 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   /* Pager.pageSi
4a10: 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
4a20: 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f  e for tmp use */
4a30: 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63  .  PCache *pPCac
4a40: 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  he;            /
4a50: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
4a60: 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a  e cache object *
4a70: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  /.  sqlite3_back
4a80: 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20  up *pBackup;    
4a90: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69  /* Pointer to li
4aa0: 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61  st of ongoing ba
4ab0: 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a  ckup processes *
4ac0: 2f 0a 20 20 4c 6f 67 20 2a 70 4c 6f 67 3b 20 20  /.  Log *pLog;  
4ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ae0: 2f 2a 20 4c 6f 67 20 75 73 65 64 20 62 79 20 22  /* Log used by "
4af0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
4b00: 22 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  " */.};../*.** T
4b10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
4b20: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f  bal variables ho
4b30: 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  ld counters used
4b40: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
4b50: 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20  purposes only.  
4b60: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
4b70: 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a  do not exist in.
4b80: 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67  ** a non-testing
4b90: 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76   build.  These v
4ba0: 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74  ariables are not
4bb0: 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f   thread-safe..*/
4bc0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
4bd0: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
4be0: 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
4bf0: 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  nt = 0;    /* Nu
4c00: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67  mber of full pag
4c10: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20  es read from DB 
4c20: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
4c30: 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
4c40: 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  nt = 0;   /* Num
4c50: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
4c60: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20  s written to DB 
4c70: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
4c80: 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
4c90: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
4ca0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69  ber of pages wri
4cb0: 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  tten to journal 
4cc0: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45  */.# define PAGE
4cd0: 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23  R_INCR(v)  v++.#
4ce0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41  else.# define PA
4cf0: 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64  GER_INCR(v).#end
4d00: 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72  if..../*.** Jour
4d10: 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20  nal files begin 
4d20: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
4d30: 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e  ng magic string.
4d40: 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61    The data.** wa
4d50: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
4d60: 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74  /dev/random.  It
4d70: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73   is used only as
4d80: 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e   a sanity check.
4d90: 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72  .**.** Since ver
4da0: 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20  sion 2.8.0, the 
4db0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
4dc0: 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e  ontains addition
4dd0: 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65  al sanity.** che
4de0: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
4df0: 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72  n.  If the power
4e00: 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65   fails while the
4e10: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
4e20: 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65  g.** written, se
4e30: 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67  mi-random garbag
4e40: 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70  e data might app
4e50: 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ear in the journ
4e60: 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72  al.** file after
4e70: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
4e80: 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d  ed.  If an attem
4e90: 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a  pt is then made.
4ea0: 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a  ** to roll the j
4eb0: 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65  ournal back, the
4ec0: 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20   database could 
4ed0: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54  be corrupted.  T
4ee0: 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  he additional.**
4ef0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
4f00: 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65   data is an atte
4f10: 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20  mpt to discover 
4f20: 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74  the garbage in t
4f30: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  he.** journal an
4f40: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a  d ignore it..**.
4f50: 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68  ** The sanity ch
4f60: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
4f70: 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a  on for the new j
4f80: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
4f90: 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33  nsists.** of a 3
4fa0: 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f  2-bit checksum o
4fb0: 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64  n each page of d
4fc0: 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73  ata.  The checks
4fd0: 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a  um covers both.*
4fe0: 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
4ff0: 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72  r and the pPager
5000: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
5010: 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65   of data for the
5020: 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63   page..** This c
5030: 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  ksum is initiali
5040: 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20  zed to a 32-bit 
5050: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61  random value tha
5060: 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  t appears in the
5070: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
5080: 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
5090: 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61   header.  The ra
50a0: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72  ndom initializer
50b0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a   is important,.*
50c0: 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67  * because garbag
50d0: 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65  e data that appe
50e0: 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ars at the end o
50f0: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  f a journal is l
5100: 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68  ikely.** data th
5110: 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f  at was once in o
5120: 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20  ther files that 
5130: 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65  have now been de
5140: 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a  leted.  If the.*
5150: 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63  * garbage data c
5160: 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f  ame from an obso
5170: 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  lete journal fil
5180: 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  e, the checksums
5190: 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72   might.** be cor
51a0: 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e  rect.  But by in
51b0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63  itializing the c
51c0: 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f  hecksum to rando
51d0: 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a  m value which.**
51e0: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f   is different fo
51f0: 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c  r every journal,
5200: 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61   we minimize tha
5210: 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t risk..*/.stati
5220: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
5230: 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61   char aJournalMa
5240: 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39  gic[] = {.  0xd9
5250: 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78  , 0xd5, 0x05, 0x
5260: 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20  f9, 0x20, 0xa1, 
5270: 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a  0x63, 0xd7,.};..
5280: 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  /*.** The size o
5290: 66 20 74 68 65 20 6f 66 20 65 61 63 68 20 70 61  f the of each pa
52a0: 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  ge record in the
52b0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65   journal is give
52c0: 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c  n by.** the foll
52d0: 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  owing macro..*/.
52e0: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
52f0: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28  PG_SZ(pPager)  (
5300: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
5310: 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54  e) + 8)../*.** T
5320: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
5330: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
5340: 70 61 67 65 72 2e 20 54 68 69 73 20 69 73 20 75  pager. This is u
5350: 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20  sually the same 
5360: 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69  .** size as a si
5370: 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
5380: 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65  . See also setSe
5390: 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23  ctorSize()..*/.#
53a0: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48  define JOURNAL_H
53b0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70  DR_SZ(pPager) (p
53c0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
53d0: 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  e)../*.** The ma
53e0: 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75  cro MEMDB is tru
53f0: 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c  e if we are deal
5400: 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d  ing with an in-m
5410: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
5420: 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73  ** We do this as
5430: 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74   a macro so that
5440: 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f   if the SQLITE_O
5450: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63  MIT_MEMORYDB mac
5460: 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68  ro is set,.** th
5470: 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42  e value of MEMDB
5480: 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74   will be a const
5490: 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70  ant and the comp
54a0: 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69  iler will optimi
54b0: 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74  ze.** out code t
54c0: 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20  hat would never 
54d0: 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64  execute..*/.#ifd
54e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
54f0: 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65  EMORYDB.# define
5500: 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23   MEMDB 0.#else.#
5510: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50   define MEMDB pP
5520: 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64  ager->memDb.#end
5530: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  if../*.** The ma
5540: 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65  ximum legal page
5550: 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31   number is (2^31
5560: 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e   - 1)..*/.#defin
5570: 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  e PAGER_MAX_PGNO
5580: 20 32 31 34 37 34 38 33 36 34 37 0a 0a 23 69 66   2147483647..#if
5590: 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a  ndef NDEBUG ./*.
55a0: 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20  ** Usage:.**.** 
55b0: 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
55c0: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
55d0: 67 65 72 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69  ger) );.*/.stati
55e0: 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67  c int assert_pag
55f0: 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a  er_state(Pager *
5600: 70 50 61 67 65 72 29 7b 0a 0a 20 20 2f 2a 20 41  pPager){..  /* A
5610: 20 74 65 6d 70 2d 66 69 6c 65 20 69 73 20 61 6c   temp-file is al
5620: 77 61 79 73 20 69 6e 20 50 41 47 45 52 5f 45 58  ways in PAGER_EX
5630: 43 4c 55 53 49 56 45 20 6f 72 20 50 41 47 45 52  CLUSIVE or PAGER
5640: 5f 53 59 4e 43 45 44 20 73 74 61 74 65 2e 20 2a  _SYNCED state. *
5650: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
5660: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20  er->tempFile==0 
5670: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
5680: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
5690: 45 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 63  E );..  /* The c
56a0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
56b0: 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20 73 65  lag is always se
56c0: 74 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73  t for temp-files
56d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
56e0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  ager->tempFile==
56f0: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61  0 || pPager->cha
5700: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a  ngeCountDone );.
5710: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
5720: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
5730: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69  urn true if it i
5740: 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77  s necessary to w
5750: 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69  rite page *pPg i
5760: 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  nto the sub-jour
5770: 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e  nal..** A page n
5780: 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74  eeds to be writt
5790: 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  en into the sub-
57a0: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65  journal if there
57b0: 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f   exists one.** o
57c0: 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65  r more open save
57d0: 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68  points for which
57e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
57f0: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c  page-number is l
5800: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
5810: 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f  l to PagerSavepo
5820: 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a  int.nOrig, and.*
5830: 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f  *   * The bit co
5840: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
5850: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
5860: 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20  s not set in.** 
5870: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
5880: 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e  nt.pInSavepoint.
5890: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
58a0: 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
58b0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
58c0: 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e  gno pgno = pPg->
58d0: 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
58e0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
58f0: 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ger;.  int i;.  
5900: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
5910: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
5920: 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61  ++){.    PagerSa
5930: 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50  vepoint *p = &pP
5940: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
5950: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  [i];.    if( p->
5960: 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30  nOrig>=pgno && 0
5970: 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  ==sqlite3BitvecT
5980: 65 73 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f  est(p->pInSavepo
5990: 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20  int, pgno) ){.  
59a0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
59b0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
59c0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
59d0: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
59e0: 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
59f0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
5a00: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
5a10: 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  nt pageInJournal
5a20: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
5a30: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69  return sqlite3Bi
5a40: 74 76 65 63 54 65 73 74 28 70 50 67 2d 3e 70 50  tvecTest(pPg->pP
5a50: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
5a60: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a  , pPg->pgno);.}.
5a70: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
5a80: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f  -bit integer fro
5a90: 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  m the given file
5aa0: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74   descriptor.  St
5ab0: 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a  ore the integer.
5ac0: 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20  ** that is read 
5ad0: 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72  in *pRes.  Retur
5ae0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
5af0: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64  verything worked
5b00: 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  , or an.** error
5b10: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
5b20: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
5b30: 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20  *.** All values 
5b40: 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69  are stored on di
5b50: 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e  sk as big-endian
5b60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5b70: 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74  read32bits(sqlit
5b80: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
5b90: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52   offset, u32 *pR
5ba0: 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  es){.  unsigned 
5bb0: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e  char ac[4];.  in
5bc0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
5bd0: 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a  Read(fd, ac, siz
5be0: 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29  eof(ac), offset)
5bf0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
5c00: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
5c10: 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  es = sqlite3Get4
5c20: 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20  byte(ac);.  }.  
5c30: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5c40: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
5c50: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
5c60: 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
5c70: 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79  in big-endian by
5c80: 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65  te order..*/.#de
5c90: 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41  fine put32bits(A
5ca0: 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34  ,B)  sqlite3Put4
5cb0: 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a  byte((u8*)A,B)..
5cc0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
5cd0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
5ce0: 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  o the given file
5cf0: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65   descriptor.  Re
5d00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
5d10: 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  * on success or 
5d20: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
5d30: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
5d40: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
5d50: 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73   int write32bits
5d60: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
5d70: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75  d, i64 offset, u
5d80: 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20  32 val){.  char 
5d90: 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69  ac[4];.  put32bi
5da0: 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72  ts(ac, val);.  r
5db0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57  eturn sqlite3OsW
5dc0: 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20  rite(fd, ac, 4, 
5dd0: 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  offset);.}../*.*
5de0: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74  * The argument t
5df0: 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20  o this macro is 
5e00: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
5e10: 72 20 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f  r (type sqlite3_
5e20: 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72  file*)..** Retur
5e30: 6e 20 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74  n 0 if it is not
5e40: 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65   open, or non-ze
5e50: 72 6f 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69  ro (but not 1) i
5e60: 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54  f it is..**.** T
5e70: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 65  his is so that e
5e80: 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62  xpressions can b
5e90: 65 20 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a  e written as:.**
5ea0: 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e  .**   if( isOpen
5eb0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
5ec0: 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65   ....**.** inste
5ed0: 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66  ad of.**.**   if
5ee0: 28 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70  ( pPager->jfd->p
5ef0: 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a  Methods ){ ....*
5f00: 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e  /.#define isOpen
5f10: 28 70 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d  (pFd) ((pFd)->pM
5f20: 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 49  ethods)../*.** I
5f30: 66 20 66 69 6c 65 20 70 46 64 20 69 73 20 6f 70  f file pFd is op
5f40: 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  en, call sqlite3
5f50: 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74  OsUnlock() on it
5f60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5f70: 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  osUnlock(sqlite3
5f80: 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20  _file *pFd, int 
5f90: 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20 21 69  eLock){.  if( !i
5fa0: 73 4f 70 65 6e 28 70 46 64 29 20 29 7b 0a 20 20  sOpen(pFd) ){.  
5fb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5fc0: 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OK;.  }.  return
5fd0: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
5fe0: 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a  (pFd, eLock);.}.
5ff0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
6000: 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20  tion determines 
6010: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
6020: 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
6030: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20  optimization.** 
6040: 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68  can be used with
6050: 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65   this pager. The
6060: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
6070: 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a  n be used if:.**
6080: 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c  .**  (a) the val
6090: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
60a0: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
60b0: 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74  istics() indicat
60c0: 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  es that.**      
60d0: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
60e0: 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61  may be written a
60f0: 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a  tomically, and.*
6100: 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65  *  (b) the value
6110: 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53   returned by OsS
6120: 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c  ectorSize() is l
6130: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
6140: 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65  l.**      to the
6150: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a   page size..**.*
6160: 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  * The optimizati
6170: 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77 61 79  on is also alway
6180: 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 65  s enabled for te
6190: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 49  mporary files. I
61a0: 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  t is.** an error
61b0: 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75   to call this fu
61c0: 6e 63 74 69 6f 6e 20 69 66 20 70 50 61 67 65 72  nction if pPager
61d0: 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e   is opened on an
61e0: 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61   in-memory.** da
61f0: 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  tabase..**.** If
6200: 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
6210: 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  n cannot be used
6220: 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e  , 0 is returned.
6230: 20 49 66 20 69 74 20 63 61 6e 20 62 65 20 75 73   If it can be us
6240: 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  ed,.** then the 
6250: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
6260: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
6270: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
6280: 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69  hen it.** contai
6290: 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61  ns rollback data
62a0: 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65   for exactly one
62b0: 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66   page..*/.#ifdef
62c0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
62d0: 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61 74  TOMIC_WRITE.stat
62e0: 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65  ic int jrnlBuffe
62f0: 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  rSize(Pager *pPa
6300: 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ger){.  assert( 
6310: 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20  !MEMDB );.  if( 
6320: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
6330: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b  e ){.    int dc;
6340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
6360: 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
6370: 74 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tics */.    int 
6380: 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20  nSector;        
6390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
63a0: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a   Sector size */.
63b0: 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20      int szPage; 
63c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63d0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69        /* Page si
63e0: 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  ze */..    asser
63f0: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
6400: 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20 64 63 20  ->fd) );.    dc 
6410: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
6420: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
6430: 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
6440: 20 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61 67    nSector = pPag
6450: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a  er->sectorSize;.
6460: 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50 61      szPage = pPa
6470: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a  ger->pageSize;..
6480: 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
6490: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
64a0: 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20  2==(512>>8));.  
64b0: 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
64c0: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d  IOCAP_ATOMIC64K=
64d0: 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20  =(65536>>8));.  
64e0: 20 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53 51    if( 0==(dc&(SQ
64f0: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
6500: 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c  C|(szPage>>8)) |
6510: 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67 65  | nSector>szPage
6520: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
6530: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n 0;.    }.  }..
6540: 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c    return JOURNAL
6550: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
6560: 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  + JOURNAL_PG_SZ(
6570: 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69  pPager);.}.#endi
6580: 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  f../*.** If SQLI
6590: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 69  TE_CHECK_PAGES i
65a0: 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 77  s defined then w
65b0: 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79  e do some sanity
65c0: 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20   checking.** on 
65d0: 74 68 65 20 63 61 63 68 65 20 75 73 69 6e 67 20  the cache using 
65e0: 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e  a hash function.
65f0: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
6600: 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e  or testing.** an
6610: 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
6620: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
6630: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f  TE_CHECK_PAGES./
6640: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32  *.** Return a 32
6650: 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65  -bit hash of the
6660: 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70   page data for p
6670: 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Page..*/.static 
6680: 75 33 32 20 70 61 67 65 72 5f 64 61 74 61 68 61  u32 pager_dataha
6690: 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e  sh(int nByte, un
66a0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61  signed char *pDa
66b0: 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20  ta){.  u32 hash 
66c0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
66d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65  for(i=0; i<nByte
66e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68  ; i++){.    hash
66f0: 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20 2b   = (hash*1039) +
6700: 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20   pData[i];.  }. 
6710: 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a   return hash;.}.
6720: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
6730: 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20  _pagehash(PgHdr 
6740: 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72  *pPage){.  retur
6750: 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  n pager_datahash
6760: 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e  (pPage->pPager->
6770: 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69 67  pageSize, (unsig
6780: 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61 67 65  ned char *)pPage
6790: 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74  ->pData);.}.stat
67a0: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73 65  ic void pager_se
67b0: 74 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72  t_pagehash(PgHdr
67c0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61 67   *pPage){.  pPag
67d0: 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  e->pageHash = pa
67e0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 61  ger_pagehash(pPa
67f0: 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ge);.}../*.** Th
6800: 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63  e CHECK_PAGE mac
6810: 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64 72  ro takes a PgHdr
6820: 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  * as an argument
6830: 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43  . If SQLITE_CHEC
6840: 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65  K_PAGES.** is de
6850: 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55  fined, and NDEBU
6860: 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  G is not defined
6870: 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  , an assert() st
6880: 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a  atement checks.*
6890: 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  * that the page 
68a0: 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79 20  is either dirty 
68b0: 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73  or still matches
68c0: 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20   the calculated 
68d0: 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64  page-hash..*/.#d
68e0: 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45  efine CHECK_PAGE
68f0: 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78 29  (x) checkPage(x)
6900: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
6910: 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  ckPage(PgHdr *pP
6920: 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
6930: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
6940: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  r;.  assert( !pP
6950: 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c 20 70  g->pageHash || p
6960: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 0a 20  Pager->errCode. 
6970: 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66 6c       || (pPg->fl
6980: 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29  ags&PGHDR_DIRTY)
6990: 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61 73   || pPg->pageHas
69a0: 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73  h==pager_pagehas
69b0: 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c  h(pPg) );.}..#el
69c0: 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72  se.#define pager
69d0: 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20  _datahash(X,Y)  
69e0: 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  0.#define pager_
69f0: 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a 23  pagehash(X)  0.#
6a00: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
6a10: 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20  E(x).#endif  /* 
6a20: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
6a30: 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  ES */../*.** Whe
6a40: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
6a50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6a60: 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
6a70: 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  er must be open.
6a80: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
6a90: 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  n attempts to re
6aa0: 61 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ad a master jour
6ab0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72  nal file name fr
6ac0: 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f  om the .** end o
6ad0: 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20  f the file and, 
6ae0: 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63  if successful, c
6af0: 6f 70 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65  opies it into me
6b00: 6d 6f 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a  mory supplied .*
6b10: 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  * by the caller.
6b20: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62   See comments ab
6b30: 6f 76 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a  ove writeMasterJ
6b40: 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65  ournal() for the
6b50: 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20   format.** used 
6b60: 74 6f 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65  to store a maste
6b70: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
6b80: 61 6d 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ame at the end o
6b90: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
6ba0: 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20  ..**.** zMaster 
6bb0: 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20  must point to a 
6bc0: 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61  buffer of at lea
6bd0: 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73  st nMaster bytes
6be0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a   allocated by.**
6bf0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69   the caller. Thi
6c00: 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69  s should be sqli
6c10: 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61  te3_vfs.mxPathna
6c20: 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20  me+1 (to ensure 
6c30: 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75  there is.** enou
6c40: 67 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74  gh space to writ
6c50: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
6c60: 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74  rnal name). If t
6c70: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
6c80: 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65  l.** name in the
6c90: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67   journal is long
6ca0: 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20  er than nMaster 
6cb0: 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67  bytes (including
6cc0: 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e   a.** nul-termin
6cd0: 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73  ator), then this
6ce0: 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69   is handled as i
6cf0: 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  f no master jour
6d00: 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65  nal name.** were
6d10: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
6d20: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
6d30: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
6d40: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
6d50: 70 72 65 73 65 6e 74 20 61 74 20 74 68 65 20 65  present at the e
6d60: 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
6d70: 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20  l.** file, then 
6d80: 69 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74  it is copied int
6d90: 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  o the buffer poi
6da0: 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74  nted to by zMast
6db0: 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72  er. A.** nul-ter
6dc0: 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20  minator byte is 
6dd0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
6de0: 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67  buffer following
6df0: 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
6e00: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
6e10: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73  ..**.** If it is
6e20: 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
6e30: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
6e40: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
6e50: 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73  present .** zMas
6e60: 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f  ter[0] is set to
6e70: 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
6e80: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
6e90: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
6ea0: 75 72 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e  urs while readin
6eb0: 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  g from the journ
6ec0: 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69  al file, an SQLi
6ed0: 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  te.** error code
6ee0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
6ef0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
6f00: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71  MasterJournal(sq
6f10: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e  lite3_file *pJrn
6f20: 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  l, char *zMaster
6f30: 2c 20 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a  , u32 nMaster){.
6f40: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
6f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6f60: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
6f70: 20 75 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20   u32 len;       
6f80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
6f90: 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f  ength in bytes o
6fa0: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
6fb0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73   name */.  i64 s
6fc0: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
6fd0: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
6fe0: 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20  ize in bytes of 
6ff0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72  journal file pJr
7000: 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  nl */.  u32 cksu
7010: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
7020: 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75     /* MJ checksu
7030: 6d 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  m value read fro
7040: 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  m journal */.  u
7050: 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  32 u;           
7060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
7070: 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
7080: 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  er */.  unsigned
7090: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
70a0: 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74     /* A buffer t
70b0: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
70c0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61   header */.  zMa
70d0: 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ster[0] = '\0';.
70e0: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
70f0: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
7100: 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c  sFileSize(pJrnl,
7110: 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a   &szJ)).   || sz
7120: 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54  J<16.   || SQLIT
7130: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
7140: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a  32bits(pJrnl, sz
7150: 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20  J-16, &len)).   
7160: 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20  || len>=nMaster 
7170: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
7180: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
7190: 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32  ts(pJrnl, szJ-12
71a0: 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c  , &cksum)).   ||
71b0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
71c0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
71d0: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
71e0: 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20  , szJ-8)).   || 
71f0: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
7200: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
7210: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
7220: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
7230: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61  sRead(pJrnl, zMa
7240: 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31  ster, len, szJ-1
7250: 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20  6-len)).  ){.   
7260: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
7270: 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65  .  /* See if the
7280: 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65   checksum matche
7290: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
72a0: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66  rnal name */.  f
72b0: 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75  or(u=0; u<len; u
72c0: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d  ++){.    cksum -
72d0: 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20  = zMaster[u];.  
72e0: 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b  }.  if( cksum ){
72f0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
7300: 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20  hecksum doesn't 
7310: 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65  add up, then one
7320: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
7330: 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20  disk sectors.   
7340: 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   ** containing t
7350: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
7360: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f  l filename is co
7370: 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65  rrupted. This me
7380: 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e  ans.    ** defin
7390: 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c  itely roll back,
73a0: 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20   so just return 
73b0: 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
73c0: 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20  port a (nul).   
73d0: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
73e0: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20  al filename..   
73f0: 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b   */.    len = 0;
7400: 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c  .  }.  zMaster[l
7410: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a  en] = '\0';.   .
7420: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7430: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
7440: 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 6f  urn the offset o
7450: 66 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f 75  f the sector bou
7460: 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d 65  ndary at or imme
7470: 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c  diately .** foll
7480: 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  owing the value 
7490: 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  in pPager->journ
74a0: 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67 20  alOff, assuming 
74b0: 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a  a sector .** siz
74c0: 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65 63  e of pPager->sec
74d0: 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a  torSize bytes..*
74e0: 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73  *.** i.e for a s
74f0: 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31  ector size of 51
7500: 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72  2:.**.**   Pager
7510: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20 20  .journalOff     
7520: 20 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c 75       Return valu
7530: 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.**   ---------
7540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
7560: 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  *   0           
7570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
7580: 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20 20 20  **   512        
7590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
75a0: 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20 20  12.**   100     
75b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75c0: 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30 20    512.**   2000 
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75e0: 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f       2048.** .*/
75f0: 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75 72  .static i64 jour
7600: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61 67  nalHdrOffset(Pag
7610: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
7620: 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  64 offset = 0;. 
7630: 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d   i64 c = pPager-
7640: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
7650: 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73  f( c ){.    offs
7660: 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52  et = ((c-1)/JOUR
7670: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
7680: 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41  r) + 1) * JOURNA
7690: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
76a0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
76b0: 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48  offset%JOURNAL_H
76c0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30  DR_SZ(pPager)==0
76d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
76e0: 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73  fset>=c );.  ass
76f0: 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c  ert( (offset-c)<
7700: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
7710: 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
7720: 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a  rn offset;.}../*
7730: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
7740: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
7750: 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  n when this func
7760: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
7770: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
7780: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  ion is a no-op i
7790: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
77a0: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
77b0: 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69  written to.** wi
77c0: 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  thin the current
77d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e   transaction (i.
77e0: 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75 72  e. if Pager.jour
77f0: 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a  nalOff==0)..**.*
7800: 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65 20  * If doTruncate 
7810: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74  is non-zero or t
7820: 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  he Pager.journal
7830: 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61 62  SizeLimit variab
7840: 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  le is.** set to 
7850: 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65  0, then truncate
7860: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7870: 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  e to zero bytes 
7880: 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77 69  in size. Otherwi
7890: 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20  se,.** zero the 
78a0: 32 38 2d 62 79 74 65 20 68 65 61 64 65 72 20 61  28-byte header a
78b0: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
78c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
78d0: 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c   In either case,
78e0: 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65   .** if the page
78f0: 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73  r is not in no-s
7900: 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74  ync mode, sync t
7910: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7920: 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20  immediately .** 
7930: 61 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f 72  after writing or
7940: 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a   truncating it..
7950: 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a  **.** If Pager.j
7960: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
7970: 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73 69  is set to a posi
7980: 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76  tive, non-zero v
7990: 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c  alue, and.** fol
79a0: 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e 63  lowing the trunc
79b0: 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67  ation or zeroing
79c0: 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
79d0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
79e0: 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   .** journal fil
79f0: 65 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c 61  e in bytes is la
7a00: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 76  rger than this v
7a10: 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e 63  alue, then trunc
7a20: 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ate the.** journ
7a30: 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65 72  al file to Pager
7a40: 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  .journalSizeLimi
7a50: 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f 75  t bytes. The jou
7a60: 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a  rnal file does.*
7a70: 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  * not need to be
7a80: 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e   synced followin
7a90: 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  g this operation
7aa0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
7ab0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
7ac0: 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e  bandon processin
7ad0: 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  g and return the
7ae0: 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   IO error code..
7af0: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
7b00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
7b10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65  */.static int ze
7b20: 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  roJournalHdr(Pag
7b30: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
7b40: 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69  doTruncate){.  i
7b50: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
7b60: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b80: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
7b90: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
7ba0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
7bb0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
7bc0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a  ->journalOff ){.
7bd0: 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20 69 4c      const i64 iL
7be0: 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  imit = pPager->j
7bf0: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b  ournalSizeLimit;
7c00: 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63      /* Local cac
7c10: 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20  he of jsl */..  
7c20: 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45 52    IOTRACE(("JZER
7c30: 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61 67  OHDR %p\n", pPag
7c40: 65 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f 54  er)).    if( doT
7c50: 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69  runcate || iLimi
7c60: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
7c70: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
7c80: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
7c90: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
7ca0: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
7cb0: 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64 72  nst char zeroHdr
7cc0: 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20  [28] = {0};.    
7cd0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
7ce0: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
7cf0: 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65  d, zeroHdr, size
7d00: 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b  of(zeroHdr), 0);
7d10: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
7d20: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
7d30: 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
7d40: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
7d50: 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
7d60: 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f  er->jfd, SQLITE_
7d70: 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50  SYNC_DATAONLY|pP
7d80: 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
7d90: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
7da0: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
7db0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
7dc0: 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20  s committed but 
7dd0: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a  the write lock .
7de0: 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
7df0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
7e00: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
7e10: 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69  size limit confi
7e20: 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a  gured for .    *
7e30: 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
7e40: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
7e50: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75   journal file cu
7e60: 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73  rrently consumes
7e70: 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61   more.    ** spa
7e80: 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d  ce than that lim
7e90: 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74  it allows for, t
7ea0: 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  runcate it now. 
7eb0: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
7ec0: 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20  .    ** to sync 
7ed0: 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69  the file followi
7ee0: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
7ef0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
7f00: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7f10: 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20  && iLimit>0 ){. 
7f20: 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20       i64 sz;.   
7f30: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
7f40: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
7f50: 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20  ->jfd, &sz);.   
7f60: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
7f70: 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69  E_OK && sz>iLimi
7f80: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
7f90: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
7fa0: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
7fb0: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
7fc0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
7fd0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
7fe0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
7ff0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
8000: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
8010: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
8020: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
8030: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
8040: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
8050: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
8060: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
8070: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
8080: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
8090: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
80a0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
80b0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
80c0: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
80d0: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
80e0: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
80f0: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
8100: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
8110: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
8120: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
8130: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
8140: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
8150: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
8160: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
8170: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
8180: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
8190: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
81a0: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
81b0: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
81c0: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
81d0: 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  al..** - 4 bytes
81e0: 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20  : Database page 
81f0: 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c  size..** .** Fol
8200: 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41  lowed by (JOURNA
8210: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
8220: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
8230: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
8240: 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  int writeJournal
8250: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
8260: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
8270: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
8280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
8290: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  urn code */.  ch
82a0: 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50  ar *zHeader = pP
82b0: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
82c0: 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
82d0: 70 61 63 65 20 75 73 65 64 20 74 6f 20 62 75 69  pace used to bui
82e0: 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  ld header */.  u
82f0: 33 32 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61  32 nHeader = pPa
8300: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20  ger->pageSize;  
8310: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75     /* Size of bu
8320: 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
8330: 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20  by zHeader */.  
8340: 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20  u32 nWrite;     
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8360: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
8370: 68 65 61 64 65 72 20 73 65 63 74 6f 72 20 77 72  header sector wr
8380: 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  itten */.  int i
8390: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
83b0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
83c0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
83d0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
83e0: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
83f0: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
8400: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28   open. */..  if(
8410: 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c   nHeader>JOURNAL
8420: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
8430: 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d  ){.    nHeader =
8440: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
8450: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
8460: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
8470: 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
8480: 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65  s and any of the
8490: 6d 20 77 65 72 65 20 63 72 65 61 74 65 64 20 0a  m were created .
84a0: 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 6d    ** since the m
84b0: 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e  ost recent journ
84c0: 61 6c 20 68 65 61 64 65 72 20 77 61 73 20 77 72  al header was wr
84d0: 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68  itten, update th
84e0: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76  e .  ** PagerSav
84f0: 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
8500: 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20  t fields now..  
8510: 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
8520: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
8530: 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
8540: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53 61   if( pPager->aSa
8550: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72  vepoint[ii].iHdr
8560: 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20  Offset==0 ){.   
8570: 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
8580: 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66  point[ii].iHdrOf
8590: 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  fset = pPager->j
85a0: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d  ournalOff;.    }
85b0: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
85c0: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
85d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
85e0: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
85f0: 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f  et(pPager);..  /
8600: 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68  * .  ** Write th
8610: 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74  e nRec Field - t
8620: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
8630: 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66  e records that f
8640: 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20  ollow this.  ** 
8650: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
8660: 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69  Normally, zero i
8670: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69  s written to thi
8680: 73 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20  s value at this 
8690: 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72  time..  ** After
86a0: 20 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65   the records are
86b0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f   added to the jo
86c0: 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a  urnal (and the j
86d0: 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a  ournal synced, .
86e0: 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d    ** if in full-
86f0: 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20  sync mode), the 
8700: 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74  zero is overwrit
8710: 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75  ten with the tru
8720: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
8730: 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79   records (see sy
8740: 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20  ncJournal())..  
8750: 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72  **.  ** A faster
8760: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20   alternative is 
8770: 74 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46  to write 0xFFFFF
8780: 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20  FFF to the nRec 
8790: 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a  field. When.  **
87a0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75   reading the jou
87b0: 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20  rnal this value 
87c0: 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20  tells SQLite to 
87d0: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a  assume that the.
87e0: 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65    ** rest of the
87f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
8800: 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67  ntains valid pag
8810: 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20  e records. This 
8820: 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20  assumption.  ** 
8830: 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73  is dangerous, as
8840: 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
8850: 63 75 72 72 65 64 20 77 68 69 6c 73 74 20 77 72  curred whilst wr
8860: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
8870: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
8880: 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f  t may contain so
8890: 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61 2e  me garbage data.
88a0: 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73   There are two s
88b0: 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68  cenarios.  ** wh
88c0: 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63 61  ere this risk ca
88d0: 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20  n be ignored:.  
88e0: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
88f0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
8900: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43   no-sync mode. C
8910: 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f  orruption can fo
8920: 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20  llow a.  **     
8930: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e  power failure in
8940: 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77 61   this case anywa
8950: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  y..  **.  **   *
8960: 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   When the SQLITE
8970: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
8980: 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ND flag is set. 
8990: 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a  This guarantees.
89a0: 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61    **     that ga
89b0: 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e 65  rbage data is ne
89c0: 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ver appended to 
89d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
89e0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
89f0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
8a00: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  fd) || pPager->n
8a10: 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20 28  oSync );.  if( (
8a20: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 20  pPager->noSync) 
8a30: 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || (pPager->jour
8a40: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
8a50: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
8a60: 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65  Y).   || (sqlite
8a70: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
8a80: 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
8a90: 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  >fd)&SQLITE_IOCA
8aa0: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a  P_SAFE_APPEND) .
8ab0: 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28    ){.    memcpy(
8ac0: 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61  zHeader, aJourna
8ad0: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
8ae0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
8af0: 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
8b00: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
8b10: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30  ournalMagic)], 0
8b20: 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65  xffffffff);.  }e
8b30: 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  lse{.    memset(
8b40: 7a 48 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65  zHeader, 0, size
8b50: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
8b60: 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  )+4);.  }..  /* 
8b70: 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b  The random check
8b80: 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65  -hash initialise
8b90: 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f  r */ .  sqlite3_
8ba0: 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
8bb0: 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f(pPager->cksumI
8bc0: 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63  nit), &pPager->c
8bd0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74  ksumInit);.  put
8be0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
8bf0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
8c00: 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72  agic)+4], pPager
8c10: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
8c20: 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64  /* The initial d
8c30: 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a  atabase size */.
8c40: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
8c50: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
8c60: 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70  rnalMagic)+8], p
8c70: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
8c80: 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73  e);.  /* The ass
8c90: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
8ca0: 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
8cb0: 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  s */.  put32bits
8cc0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
8cd0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
8ce0: 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63  12], pPager->sec
8cf0: 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  torSize);..  /* 
8d00: 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  The page size */
8d10: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
8d20: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
8d30: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c  urnalMagic)+16],
8d40: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
8d50: 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  e);..  /* Initia
8d60: 6c 69 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20  lizing the tail 
8d70: 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69 73  of the buffer is
8d80: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20   not necessary. 
8d90: 20 45 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a   Everything.  **
8da0: 20 77 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74   works find if t
8db0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d  he following mem
8dc0: 73 65 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64  set() is omitted
8dd0: 2e 20 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a  .  But initializ
8de0: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d  ing.  ** the mem
8df0: 6f 72 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c  ory prevents val
8e00: 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c  grind from compl
8e10: 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72  aining, so we ar
8e20: 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a  e willing to.  *
8e30: 2a 20 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f  * take the perfo
8e40: 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f  rmance hit..  */
8e50: 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64  .  memset(&zHead
8e60: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
8e70: 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c  alMagic)+20], 0,
8e80: 0a 20 20 20 20 20 20 20 20 20 6e 48 65 61 64 65  .         nHeade
8e90: 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  r-(sizeof(aJourn
8ea0: 61 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a  alMagic)+20));..
8eb0: 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20    /* In theory, 
8ec0: 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73  it is only neces
8ed0: 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68  sary to write th
8ee0: 65 20 32 38 20 62 79 74 65 73 20 74 68 61 74 20  e 28 bytes that 
8ef0: 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  the .  ** journa
8f00: 6c 20 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65  l header consume
8f10: 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s to the journal
8f20: 20 66 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e   file here. Then
8f30: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a   increment the .
8f40: 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e    ** Pager.journ
8f50: 61 6c 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62  alOff variable b
8f60: 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  y JOURNAL_HDR_SZ
8f70: 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78   so that the nex
8f80: 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69  t .  ** record i
8f90: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
8fa0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f   following secto
8fb0: 72 20 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70  r (leaving a gap
8fc0: 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a   in the file.  *
8fd0: 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69  * that will be i
8fe0: 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64  mplicitly filled
8ff0: 20 69 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a   in by the OS)..
9000: 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65    **.  ** Howeve
9010: 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 69  r it has been di
9020: 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e  scovered that on
9030: 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68   some systems th
9040: 69 73 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a  is pattern can .
9050: 20 20 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63    ** be signific
9060: 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61  antly slower tha
9070: 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77  n contiguously w
9080: 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74  riting data to t
9090: 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76  he file,.  ** ev
90a0: 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73  en if that means
90b0: 20 65 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74   explicitly writ
90c0: 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20  ing data to the 
90d0: 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28  block of .  ** (
90e0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
90f0: 20 32 38 29 20 62 79 74 65 73 20 74 68 61 74 20   28) bytes that 
9100: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64  will not be used
9110: 2e 20 53 6f 20 74 68 61 74 20 69 73 20 77 68 61  . So that is wha
9120: 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20  t.  ** is done. 
9130: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c  .  **.  ** The l
9140: 6f 6f 70 20 69 73 20 72 65 71 75 69 72 65 64 20  oop is required 
9150: 68 65 72 65 20 69 6e 20 63 61 73 65 20 74 68 65  here in case the
9160: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20   sector-size is 
9170: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
9180: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70  .  ** database p
9190: 61 67 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20  age size. Since 
91a0: 74 68 65 20 7a 48 65 61 64 65 72 20 62 75 66 66  the zHeader buff
91b0: 65 72 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72  er is only Pager
91c0: 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62  .pageSize.  ** b
91d0: 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f  ytes in size, mo
91e0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c  re than one call
91f0: 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69   to sqlite3OsWri
9200: 74 65 28 29 20 6d 61 79 20 62 65 20 72 65 71 75  te() may be requ
9210: 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70  ired.  ** to pop
9220: 75 6c 61 74 65 20 74 68 65 20 65 6e 74 69 72 65  ulate the entire
9230: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
9240: 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20  sector..  */ .  
9250: 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63  for(nWrite=0; rc
9260: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72  ==SQLITE_OK&&nWr
9270: 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ite<JOURNAL_HDR_
9280: 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69  SZ(pPager); nWri
9290: 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20  te+=nHeader){.  
92a0: 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
92b0: 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %p %lld %d\n", 
92c0: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
92d0: 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61  journalHdr, nHea
92e0: 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73  der)).    rc = s
92f0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
9300: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
9310: 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61  er, nHeader, pPa
9320: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
9330: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
9340: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
9350: 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   <= pPager->jour
9360: 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50  nalOff );.    pP
9370: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9380: 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d   += nHeader;.  }
9390: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
93a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
93b0: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
93c0: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
93d0: 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75  is called. A jou
93e0: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
93f0: 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  .** (JOURNAL_HDR
9400: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65  _SZ bytes) is re
9410: 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  ad from the curr
9420: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
9430: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
9440: 69 6c 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74  ile. The current
9450: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
9460: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
9470: 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61   given by.** pPa
9480: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e  ger->journalOff.
9490: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62   See comments ab
94a0: 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  ove function wri
94b0: 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66  teJournalHdr() f
94c0: 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74  or.** a descript
94d0: 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ion of the journ
94e0: 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74  al header format
94f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68  ..**.** If the h
9500: 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75  eader is read su
9510: 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52  ccessfully, *pNR
9520: 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ec is set to the
9530: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61   number of.** pa
9540: 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f  ge records follo
9550: 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72  wing this header
9560: 20 61 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73   and *pDbSize is
9570: 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65   set to the size
9580: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
9590: 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74  ase before the t
95a0: 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e  ransaction began
95b0: 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f  , in pages. Also
95c0: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
95d0: 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  nit.** is set to
95e0: 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
95f0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
9600: 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f   header. SQLITE_
9610: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
9620: 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  * in this case..
9630: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
9640: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
9650: 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63   appears to be c
9660: 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
9670: 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75  _DONE is.** retu
9680: 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20  rned and *pNRec 
9690: 61 6e 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65  and *PDbSize are
96a0: 20 75 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20   undefined.  If 
96b0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
96c0: 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ytes.** cannot b
96d0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
96e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20  journal file an 
96f0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
9700: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
9710: 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61  c int readJourna
9720: 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70  lHdr(.  Pager *p
9730: 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
9740: 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
9750: 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ject */.  int is
9760: 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e  Hot,.  i64 journ
9770: 61 6c 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  alSize,         
9780: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
9790: 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  he open journal 
97a0: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
97b0: 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20  .  u32 *pNRec,  
97c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97d0: 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65  /* OUT: Value re
97e0: 61 64 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63  ad from the nRec
97f0: 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20   field */.  u32 
9800: 2a 70 44 62 53 69 7a 65 20 20 20 20 20 20 20 20  *pDbSize        
9810: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
9820: 20 56 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e   Value of origin
9830: 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
9840: 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69   field */.){.  i
9850: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
9860: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
9870: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
9880: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d  unsigned char aM
9890: 61 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20  agic[8];     /* 
98a0: 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
98b0: 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
98c0: 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  r */.  i64 iHdrO
98d0: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
98e0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
98f0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
9900: 62 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20  being read */.. 
9910: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
9920: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
9930: 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
9940: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
9950: 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61  n. */..  /* Adva
9960: 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  nce Pager.journa
9970: 6c 4f 66 66 20 74 6f 20 74 68 65 20 73 74 61 72  lOff to the star
9980: 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65  t of the next se
9990: 63 74 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a  ctor. If the.  *
99a0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
99b0: 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20  s too small for 
99c0: 74 68 65 72 65 20 74 6f 20 62 65 20 61 20 68 65  there to be a he
99d0: 61 64 65 72 20 73 74 6f 72 65 64 20 61 74 20 74  ader stored at t
99e0: 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20  his.  ** point, 
99f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
9a00: 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  NE..  */.  pPage
9a10: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
9a20: 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
9a30: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
9a40: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9a50: 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ff+JOURNAL_HDR_S
9a60: 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72  Z(pPager) > jour
9a70: 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  nalSize ){.    r
9a80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
9a90: 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66  E;.  }.  iHdrOff
9aa0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
9ab0: 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61  alOff;..  /* Rea
9ac0: 64 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 38  d in the first 8
9ad0: 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f   bytes of the jo
9ae0: 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66  urnal header. If
9af0: 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74   they do not mat
9b00: 63 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67  ch.  ** the  mag
9b10: 69 63 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20  ic string found 
9b20: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
9b30: 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61  each journal hea
9b40: 64 65 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a  der, return.  **
9b50: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66   SQLITE_DONE. If
9b60: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
9b70: 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  urs, return an e
9b80: 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72  rror code. Other
9b90: 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65  wise,.  ** proce
9ba0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ed..  */.  if( i
9bb0: 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21  sHot || iHdrOff!
9bc0: 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
9bd0: 48 64 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Hdr ){.    rc = 
9be0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
9bf0: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
9c00: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
9c10: 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20  ), iHdrOff);.   
9c20: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
9c30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
9c40: 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  }.    if( memcmp
9c50: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
9c60: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
9c70: 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20  Magic))!=0 ){.  
9c80: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9c90: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
9ca0: 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  }..  /* Read the
9cb0: 20 66 69 72 73 74 20 74 68 72 65 65 20 33 32 2d   first three 32-
9cc0: 62 69 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  bit fields of th
9cd0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
9ce0: 3a 20 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20  : The nRec.  ** 
9cf0: 66 69 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b  field, the check
9d00: 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20  sum-initializer 
9d10: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
9d20: 20 73 69 7a 65 20 61 74 20 74 68 65 20 73 74 61   size at the sta
9d30: 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  rt.  ** of the t
9d40: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75  ransaction. Retu
9d50: 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
9d60: 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
9d70: 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20  s wrong..  */.  
9d80: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
9d90: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
9da0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
9db0: 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a  rOff+8, pNRec)).
9dc0: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
9dd0: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
9de0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
9df0: 48 64 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67  HdrOff+12, &pPag
9e00: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a  er->cksumInit)).
9e10: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
9e20: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
9e30: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
9e40: 48 64 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69  HdrOff+16, pDbSi
9e50: 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  ze)).  ){.    re
9e60: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
9e70: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
9e80: 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
9e90: 20 75 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20   u32 iPageSize; 
9ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9eb0: 20 50 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64   Page-size field
9ec0: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
9ed0: 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53  er */.    u32 iS
9ee0: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
9ef0: 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72         /* Sector
9f00: 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a  -size field of j
9f10: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
9f20: 0a 20 20 20 20 75 31 36 20 69 50 61 67 65 53 69  .    u16 iPageSi
9f30: 7a 65 31 36 3b 20 20 20 20 20 20 20 20 20 20 20  ze16;           
9f40: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 69 50 61    /* Copy of iPa
9f50: 67 65 53 69 7a 65 20 69 6e 20 31 36 2d 62 69 74  geSize in 16-bit
9f60: 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20   variable */..  
9f70: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61    /* Read the pa
9f80: 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74  ge-size and sect
9f90: 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20  or-size journal 
9fa0: 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e 20 2a  header fields. *
9fb0: 2f 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  /.    if( SQLITE
9fc0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
9fd0: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
9fe0: 64 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c 20 26  d, iHdrOff+20, &
9ff0: 69 53 65 63 74 6f 72 53 69 7a 65 29 29 0a 20 20  iSectorSize)).  
a000: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
a010: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
a020: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
a030: 48 64 72 4f 66 66 2b 32 34 2c 20 26 69 50 61 67  HdrOff+24, &iPag
a040: 65 53 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20  eSize)).    ){. 
a050: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
a060: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
a070: 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c  eck that the val
a080: 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ues read from th
a090: 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
a0a0: 73 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c  sector-size fiel
a0b0: 64 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69  ds.    ** are wi
a0c0: 74 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62  thin range. To b
a0d0: 65 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f  e 'in range', bo
a0e0: 74 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74  th values need t
a0f0: 6f 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20  o be a power.   
a100: 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74   ** of two great
a110: 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
a120: 20 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61   to 512 or 32, a
a130: 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74  nd not greater t
a140: 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a  han their .    *
a150: 2a 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d  * respective com
a160: 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75  pile time maximu
a170: 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f  m limits..    */
a180: 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69  .    if( iPageSi
a190: 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20  ze<512          
a1a0: 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74          || iSect
a1b0: 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c  orSize<32.     |
a1c0: 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49  | iPageSize>SQLI
a1d0: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
a1e0: 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e   || iSectorSize>
a1f0: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a  MAX_SECTOR_SIZE.
a200: 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53       || ((iPageS
a210: 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65  ize-1)&iPageSize
a220: 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63  )!=0   || ((iSec
a230: 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74  torSize-1)&iSect
a240: 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20  orSize)!=0 .    
a250: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
a260: 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61  he either the pa
a270: 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f  ge-size or secto
a280: 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f  r-size in the jo
a290: 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20  urnal-header is 
a2a0: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69  .      ** invali
a2b0: 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63  d, then the proc
a2c0: 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74  ess that wrote t
a2d0: 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
a2e0: 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20  r must have .   
a2f0: 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65     ** crashed be
a300: 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20  fore the header 
a310: 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74  was synced. In t
a320: 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65  his case stop re
a330: 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20  ading .      ** 
a340: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
a350: 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   here..      */.
a360: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a370: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
a380: 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
a390: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20  he page-size to 
a3a0: 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
a3b0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
a3c0: 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55  urnal. .    ** U
a3d0: 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20  se a testcase() 
a3e0: 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75  macro to make su
a3f0: 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66  re that malloc f
a400: 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20  ailure within . 
a410: 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61     ** PagerSetPa
a420: 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74  gesize() is test
a430: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
a440: 50 61 67 65 53 69 7a 65 31 36 20 3d 20 28 75 31  PageSize16 = (u1
a450: 36 29 69 50 61 67 65 53 69 7a 65 3b 0a 20 20 20  6)iPageSize;.   
a460: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
a470: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
a480: 61 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65  ager, &iPageSize
a490: 31 36 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73  16, -1);.    tes
a4a0: 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
a4b0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  E_OK );.    asse
a4c0: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
a4d0: 4b 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 31 36  K || iPageSize16
a4e0: 3d 3d 28 75 31 36 29 69 50 61 67 65 53 69 7a 65  ==(u16)iPageSize
a4f0: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   );..    /* Upda
a500: 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73  te the assumed s
a510: 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61  ector-size to ma
a520: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73  tch the value us
a530: 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68  ed by .    ** th
a540: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
a550: 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72  reated this jour
a560: 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75  nal. If this jou
a570: 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20  rnal was.    ** 
a580: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
a590: 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20  cess other than 
a5a0: 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74  this one, then t
a5b0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20  his routine.    
a5c0: 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  ** is being call
a5d0: 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70  ed from within p
a5e0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e  ager_playback().
a5f0: 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   The local value
a600: 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  .    ** of Pager
a610: 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
a620: 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
a630: 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
a640: 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ne..    */.    p
a650: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
a660: 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  e = iSectorSize;
a670: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
a680: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
a690: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
a6a0: 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
a6b0: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  c;.}.../*.** Wri
a6c0: 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  te the supplied 
a6d0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
a6e0: 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
a6f0: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
a700: 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74  ger.** pPager at
a710: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
a720: 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65  ation. The maste
a730: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
a740: 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a  ust be the last.
a750: 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e  ** thing written
a760: 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   to a journal fi
a770: 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  le. If the pager
a780: 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   is in full-sync
a790: 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f   mode, the.** jo
a7a0: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
a7b0: 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65  iptor is advance
a7c0: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  d to the next se
a7d0: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65  ctor boundary be
a7e0: 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67  fore.** anything
a7f0: 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65   is written. The
a800: 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a   format is:.**.*
a810: 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50  *   + 4 bytes: P
a820: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a  AGER_MJ_PGNO..**
a830: 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61     + N bytes: Ma
a840: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
a850: 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a  ename in utf-8..
a860: 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
a870: 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73  N (length of mas
a880: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
a890: 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75   in bytes, no nu
a8a0: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a  l-terminator)..*
a8b0: 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d  *   + 4 bytes: M
a8c0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
a8d0: 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  me checksum..** 
a8e0: 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f    + 8 bytes: aJo
a8f0: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
a900: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
a910: 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63  ournal page chec
a920: 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20  ksum is the sum 
a930: 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  of the bytes in 
a940: 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
a950: 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72  urnal name, wher
a960: 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69  e each byte is i
a970: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20  nterpreted as a 
a980: 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74  signed 8-bit int
a990: 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  eger..**.** If z
a9a0: 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c  Master is a NULL
a9b0: 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73   pointer (occurs
a9c0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61   for a single da
a9d0: 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
a9e0: 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61  on), .** this ca
a9f0: 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ll is a no-op..*
aa00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
aa10: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
aa20: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
aa30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
aa40: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
aa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa60: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
aa70: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
aa80: 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  nMaster;        
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
aaa0: 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67  Length of string
aab0: 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36   zMaster */.  i6
aac0: 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aae0: 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64  * Offset of head
aaf0: 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69  er in journal fi
ab00: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c  le */.  i64 jrnl
ab10: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
ab20: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
ab30: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   of journal file
ab40: 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33   on disk */.  u3
ab50: 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20  2 cksum = 0;    
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ab70: 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74  * Checksum of st
ab80: 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  ring zMaster */.
ab90: 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20  .  if( !zMaster 
aba0: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  || pPager->setMa
abb0: 73 74 65 72 0a 20 20 20 7c 7c 20 70 50 61 67 65  ster.   || pPage
abc0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
abd0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
abe0: 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20  E_MEMORY .   || 
abf0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
ac00: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
ac10: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b  ALMODE_OFF .  ){
ac20: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
ac30: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61  TE_OK;.  }.  pPa
ac40: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
ac50: 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   1;.  assert( is
ac60: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
ac70: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
ac80: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
ac90: 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  r <= pPager->jou
aca0: 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a  rnalOff );..  /*
acb0: 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c   Calculate the l
acc0: 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 61  ength in bytes a
acd0: 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  nd the checksum 
ace0: 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20  of zMaster */.  
acf0: 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a  for(nMaster=0; z
ad00: 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b  Master[nMaster];
ad10: 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20   nMaster++){.   
ad20: 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65   cksum += zMaste
ad30: 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a  r[nMaster];.  }.
ad40: 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c  .  /* If in full
ad50: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61  -sync mode, adva
ad60: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
ad70: 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f  disk sector befo
ad80: 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20  re writing.  ** 
ad90: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
ada0: 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73  al name. This is
adb0: 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65   in case the pre
adc0: 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74  vious page writt
add0: 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a  en to.  ** the j
ade0: 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61  ournal has alrea
adf0: 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a  dy been synced..
ae00: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
ae10: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
ae20: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
ae30: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
ae40: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
ae50: 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20  ;.  }.  iHdrOff 
ae60: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
ae70: 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74  lOff;..  /* Writ
ae80: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
ae90: 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65  rnal data to the
aea0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72   end of the jour
aeb0: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a  nal file. If.  *
aec0: 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * an error occur
aed0: 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  s, return the er
aee0: 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
aef0: 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  caller..  */.  i
af00: 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77  f( (0 != (rc = w
af10: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
af20: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c  r->jfd, iHdrOff,
af30: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
af40: 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20  Pager)))).   || 
af50: 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69  (0 != (rc = sqli
af60: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
af70: 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
af80: 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66   nMaster, iHdrOf
af90: 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  f+4))).   || (0 
afa0: 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
afb0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
afc0: 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73  , iHdrOff+4+nMas
afd0: 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a  ter, nMaster))).
afe0: 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
aff0: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
b000: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
b010: 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20  ff+4+nMaster+4, 
b020: 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28  cksum))).   || (
b030: 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74  0 != (rc = sqlit
b040: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
b050: 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d  ->jfd, aJournalM
b060: 61 67 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66  agic, 8, iHdrOff
b070: 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a  +4+nMaster+8))).
b080: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
b090: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  rc;.  }.  pPager
b0a0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
b0b0: 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a 20 20  (nMaster+20);.  
b0c0: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
b0d0: 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = !pPager->noSy
b0e0: 6e 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  nc;..  /* If the
b0f0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 70 65 72   pager is in per
b100: 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d  istent-journal m
b110: 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68  ode, then the ph
b120: 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75  ysical .  ** jou
b130: 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78  rnal-file may ex
b140: 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e  tend past the en
b150: 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d  d of the master-
b160: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a  journal name.  *
b170: 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66  * and 8 bytes of
b180: 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73 74   magic data just
b190: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
b1a0: 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20  file. This is . 
b1b0: 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65   ** dangerous be
b1c0: 63 61 75 73 65 20 74 68 65 20 63 6f 64 65 20 74  cause the code t
b1d0: 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74  o rollback a hot
b1e0: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20  -journal file.  
b1f0: 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ** will not be a
b200: 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ble to find the 
b210: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
b220: 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
b230: 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f   .  ** whether o
b240: 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
b250: 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a  l is hot. .  **.
b260: 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69    ** Easiest thi
b270: 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73  ng to do in this
b280: 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20   scenario is to 
b290: 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
b2a0: 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
b2b0: 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20  to the required 
b2c0: 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  size..  */ .  if
b2d0: 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  ( SQLITE_OK==(rc
b2e0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
b2f0: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
b300: 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20  , &jrnlSize)).  
b310: 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61   && jrnlSize>pPa
b320: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
b330: 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
b340: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
b350: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
b360: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
b370: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
b380: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  c;.}../*.** Find
b390: 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68   a page in the h
b3a0: 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ash table given 
b3b0: 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  its page number.
b3c0: 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   Return.** a poi
b3d0: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
b3e0: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   or NULL if the 
b3f0: 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
b400: 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64  s not .** alread
b410: 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  y in memory..*/.
b420: 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
b430: 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
b440: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
b450: 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
b460: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b470: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
b480: 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
b490: 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
b4a0: 73 69 62 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c  sible for a call
b4b0: 20 74 6f 20 50 63 61 63 68 65 46 65 74 63 68 28   to PcacheFetch(
b4c0: 29 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61  ) with createFla
b4d0: 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69  g==0 to.  ** fai
b4e0: 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61 74 74 65  l, since no atte
b4f0: 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  mpt to allocate 
b500: 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77  dynamic memory w
b510: 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a  ill be made..  *
b520: 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65  /.  (void)sqlite
b530: 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
b540: 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
b550: 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65  no, 0, &p);.  re
b560: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
b570: 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
b580: 72 20 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74  r is in error-st
b590: 61 74 65 2c 20 64 69 73 63 61 72 64 20 61 6c 6c  ate, discard all
b5a0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
b5b0: 2e 20 49 66 0a 2a 2a 20 74 68 65 20 70 61 67 65  . If.** the page
b5c0: 72 20 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74  r is in error-st
b5d0: 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73 20 63  ate, then this c
b5e0: 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
b5f0: 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 57 68 79 20  **.** TODO: Why 
b600: 63 61 6e 20 77 65 20 6e 6f 74 20 72 65 73 65 74  can we not reset
b610: 20 74 68 65 20 70 61 67 65 72 20 77 68 69 6c 65   the pager while
b620: 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 3f   in error state?
b630: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b640: 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65  pager_reset(Page
b650: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
b660: 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 70 50 61  ( SQLITE_OK==pPa
b670: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
b680: 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
b690: 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d  pRestart(pPager-
b6a0: 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 73  >pBackup);.    s
b6b0: 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
b6c0: 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  r(pPager->pPCach
b6d0: 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
b6e0: 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b  dbSizeValid = 0;
b6f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
b700: 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65  ee all structure
b710: 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61  s in the Pager.a
b720: 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61  Savepoint[] arra
b730: 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a  y and set both.*
b740: 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  * Pager.aSavepoi
b750: 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61  nt and Pager.nSa
b760: 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e  vepoint to zero.
b770: 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a   Close the sub-j
b780: 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20  ournal.** if it 
b790: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
b7a0: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
b7b0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
b7c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
b7d0: 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
b7e0: 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  nts(Pager *pPage
b7f0: 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20  r){.  int ii;   
b800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
b810: 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70  terator for loop
b820: 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67 65  ing through Page
b830: 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  r.aSavepoint */.
b840: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
b850: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
b860: 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71  t; ii++){.    sq
b870: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
b880: 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  oy(pPager->aSave
b890: 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76  point[ii].pInSav
b8a0: 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69  epoint);.  }.  i
b8b0: 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
b8c0: 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c  usiveMode || sql
b8d0: 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c  ite3IsMemJournal
b8e0: 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
b8f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
b900: 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  lose(pPager->sjf
b910: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
b920: 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61  3_free(pPager->a
b930: 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50  Savepoint);.  pP
b940: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
b950: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
b960: 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  nSavepoint = 0;.
b970: 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
b980: 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c = 0;.}../*.** 
b990: 53 65 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62  Set the bit numb
b9a0: 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50  er pgno in the P
b9b0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
b9c0: 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62  nSavepoint .** b
b9d0: 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70  itvecs of all op
b9e0: 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52  en savepoints. R
b9f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
ba00: 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a  if successful.**
ba10: 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   or SQLITE_NOMEM
ba20: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
ba30: 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  lure occurs..*/.
ba40: 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f  static int addTo
ba50: 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
ba60: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
ba70: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
ba80: 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
ba90: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
baa0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
bab0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
bac0: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
bad0: 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28   code */..  for(
bae0: 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d  ii=0; ii<pPager-
baf0: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
bb00: 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76  +){.    PagerSav
bb10: 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61  epoint *p = &pPa
bb20: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
bb30: 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  ii];.    if( pgn
bb40: 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20  o<=p->nOrig ){. 
bb50: 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74       rc |= sqlit
bb60: 65 33 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70  e3BitvecSet(p->p
bb70: 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e  InSavepoint, pgn
bb80: 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  o);.      testca
bb90: 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
bba0: 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73  OMEM );.      as
bbb0: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
bbc0: 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
bbd0: 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d  E_NOMEM );.    }
bbe0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
bbf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
bc00: 6e 20 74 72 75 65 20 69 66 20 74 68 69 73 20 70  n true if this p
bc10: 61 67 65 72 20 75 73 65 73 20 61 20 77 72 69 74  ager uses a writ
bc20: 65 2d 61 68 65 61 64 20 6c 6f 67 20 69 6e 73 74  e-ahead log inst
bc30: 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c  ead of the usual
bc40: 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  .** rollback jou
bc50: 72 6e 61 6c 2e 20 4f 74 68 65 72 77 69 73 65 20  rnal. Otherwise 
bc60: 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  false..*/.static
bc70: 20 69 6e 74 20 70 61 67 65 72 55 73 65 4c 6f 67   int pagerUseLog
bc80: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
bc90: 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65  .  return (pPage
bca0: 72 2d 3e 70 4c 6f 67 21 3d 30 29 3b 0a 7d 0a 0a  r->pLog!=0);.}..
bcb0: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65  /*.** Unlock the
bcc0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
bcd0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
bce0: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
bcf0: 70 61 67 65 72 0a 2a 2a 20 69 73 20 69 6e 20 65  pager.** is in e
bd00: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a  xclusive mode..*
bd10: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
bd20: 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69  r is currently i
bd30: 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64  n error state, d
bd40: 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65  iscard the conte
bd50: 6e 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65 20 63  nts of .** the c
bd60: 61 63 68 65 20 61 6e 64 20 72 65 73 65 74 20 74  ache and reset t
bd70: 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
bd80: 72 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  re internal stat
bd90: 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 0a 2a  e. If there is.*
bda0: 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61  * an open journa
bdb0: 6c 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65  l-file, then the
bdc0: 20 6e 65 78 74 20 74 69 6d 65 20 61 20 73 68 61   next time a sha
bdd0: 72 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61  red-lock is obta
bde0: 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 70  ined.** on the p
bdf0: 61 67 65 72 20 66 69 6c 65 20 28 62 79 20 74 68  ager file (by th
be00: 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
be10: 70 72 6f 63 65 73 73 29 2c 20 69 74 20 77 69 6c  process), it wil
be20: 6c 20 62 65 0a 2a 2a 20 74 72 65 61 74 65 64 20  l be.** treated 
be30: 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  as a hot-journal
be40: 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b   and rolled back
be50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
be60: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61   pager_unlock(Pa
be70: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
be80: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
be90: 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
bea0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
beb0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f  E_OK;          /
bec0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
bed0: 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20  ..    /* Always 
bee0: 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  close the journa
bef0: 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70  l file when drop
bf00: 70 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ping the databas
bf10: 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2a 20 4f  e lock..    ** O
bf20: 74 68 65 72 77 69 73 65 2c 20 61 6e 6f 74 68 65  therwise, anothe
bf30: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  r connection wit
bf40: 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64  h journal_mode=d
bf50: 65 6c 65 74 65 20 6d 69 67 68 74 0a 20 20 20 20  elete might.    
bf60: 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 66 69  ** delete the fi
bf70: 6c 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  le out from unde
bf80: 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  r us..    */.   
bf90: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
bfa0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
bfb0: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
bfc0: 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
bfd0: 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  InJournal);.    
bfe0: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
bff0: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65  al = 0;.    rele
c000: 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
c010: 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f  (pPager);..    /
c020: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  * If the file is
c030: 20 75 6e 6c 6f 63 6b 65 64 2c 20 73 6f 6d 65 62   unlocked, someb
c040: 6f 64 79 20 65 6c 73 65 20 6d 69 67 68 74 20 63  ody else might c
c050: 68 61 6e 67 65 20 69 74 2e 20 54 68 65 0a 20 20  hange it. The.  
c060: 20 20 2a 2a 20 76 61 6c 75 65 73 20 73 74 6f 72    ** values stor
c070: 65 64 20 69 6e 20 50 61 67 65 72 2e 64 62 53 69  ed in Pager.dbSi
c080: 7a 65 20 65 74 63 2e 20 6d 69 67 68 74 20 62 65  ze etc. might be
c090: 63 6f 6d 65 20 69 6e 76 61 6c 69 64 20 69 66 0a  come invalid if.
c0a0: 20 20 20 20 2a 2a 20 74 68 69 73 20 68 61 70 70      ** this happ
c0b0: 65 6e 73 2e 20 20 4f 6e 65 20 63 61 6e 20 61 72  ens.  One can ar
c0c0: 67 75 65 20 74 68 61 74 20 74 68 69 73 20 64 6f  gue that this do
c0d0: 65 73 6e 27 74 20 6e 65 65 64 20 74 6f 20 62 65  esn't need to be
c0e0: 20 63 6c 65 61 72 65 64 0a 20 20 20 20 2a 2a 20   cleared.    ** 
c0f0: 75 6e 74 69 6c 20 74 68 65 20 63 68 61 6e 67 65  until the change
c100: 2d 63 6f 75 6e 74 65 72 20 63 68 65 63 6b 20 66  -counter check f
c110: 61 69 6c 73 20 69 6e 20 50 61 67 65 72 53 68 61  ails in PagerSha
c120: 72 65 64 4c 6f 63 6b 28 29 2e 0a 20 20 20 20 2a  redLock()..    *
c130: 2a 20 43 6c 65 61 72 69 6e 67 20 74 68 65 20 70  * Clearing the p
c140: 61 67 65 20 73 69 7a 65 20 63 61 63 68 65 20 68  age size cache h
c150: 65 72 65 20 69 73 20 62 65 69 6e 67 20 63 6f 6e  ere is being con
c160: 73 65 72 76 61 74 69 76 65 2e 0a 20 20 20 20 2a  servative..    *
c170: 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  /.    pPager->db
c180: 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 0a  SizeValid = 0;..
c190: 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
c1a0: 4c 6f 67 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Log(pPager) ){. 
c1b0: 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 43       sqlite3LogC
c1c0: 6c 6f 73 65 53 6e 61 70 73 68 6f 74 28 70 50 61  loseSnapshot(pPa
c1d0: 67 65 72 2d 3e 70 4c 6f 67 29 3b 0a 20 20 20 20  ger->pLog);.    
c1e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
c1f0: 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  = osUnlock(pPage
c200: 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
c210: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
c220: 63 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  c ){.      pPage
c230: 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  r->errCode = rc;
c240: 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41  .    }.    IOTRA
c250: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e  CE(("UNLOCK %p\n
c260: 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20  ", pPager))..   
c270: 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72   /* If Pager.err
c280: 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65  Code is set, the
c290: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
c2a0: 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e   pager cache can
c2b0: 6e 6f 74 20 62 65 0a 20 20 20 20 2a 2a 20 74 72  not be.    ** tr
c2c0: 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20  usted. Now that 
c2d0: 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 69  the pager file i
c2e0: 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20  s unlocked, the 
c2f0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
c300: 20 20 20 20 2a 2a 20 63 61 63 68 65 20 63 61 6e      ** cache can
c310: 20 62 65 20 64 69 73 63 61 72 64 65 64 20 61 6e   be discarded an
c320: 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
c330: 20 73 61 66 65 6c 79 20 63 6c 65 61 72 65 64 2e   safely cleared.
c340: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
c350: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
c360: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  ){.      if( rc=
c370: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c380: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
c390: 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f  rCode = SQLITE_O
c3a0: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
c3b0: 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
c3c0: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ger);.    }..   
c3d0: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
c3e0: 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
c3f0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
c400: 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
c410: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f      pPager->dbMo
c420: 64 69 66 69 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  dified = 0;.  }.
c430: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
c440: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  nction should be
c450: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
c460: 49 4f 45 52 52 2c 20 43 4f 52 52 55 50 54 20 6f  IOERR, CORRUPT o
c470: 72 20 46 55 4c 4c 20 65 72 72 6f 72 0a 2a 2a 20  r FULL error.** 
c480: 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72 72 65  may have occurre
c490: 64 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67  d. The first arg
c4a0: 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
c4b0: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20  er to the pager 
c4c0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 74  .** structure, t
c4d0: 68 65 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72  he second the er
c4e0: 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74  ror-code about t
c4f0: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
c500: 20 61 20 70 61 67 65 72 20 0a 2a 2a 20 41 50 49   a pager .** API
c510: 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76   function. The v
c520: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
c530: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73   a copy of the s
c540: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 0a  econd argument .
c550: 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ** to this funct
c560: 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ion. .**.** If t
c570: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
c580: 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45  nt is SQLITE_IOE
c590: 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
c5a0: 50 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  PT, or SQLITE_FU
c5b0: 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20  LL.** the error 
c5c0: 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65  becomes persiste
c5d0: 6e 74 2e 20 55 6e 74 69 6c 20 74 68 65 20 70 65  nt. Until the pe
c5e0: 72 73 69 73 74 65 6e 20 65 72 72 6f 72 20 69 73  rsisten error is
c5f0: 20 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62   cleared,.** sub
c600: 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c  sequent API call
c610: 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 20  s on this Pager 
c620: 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
c630: 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
c640: 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e   .** error code.
c650: 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73 74  .**.** A persist
c660: 65 6e 74 20 65 72 72 6f 72 20 69 6e 64 69 63 61  ent error indica
c670: 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  tes that the con
c680: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
c690: 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e  er-cache .** can
c6a0: 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
c6b0: 54 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62  This state can b
c6c0: 65 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d  e cleared by com
c6d0: 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69  pletely discardi
c6e0: 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ng .** the conte
c6f0: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
c700: 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61  -cache. If a tra
c710: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74  nsaction was act
c720: 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ive when.** the 
c730: 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
c740: 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20   occurred, then 
c750: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
c760: 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a  rnal may need.**
c770: 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20   to be replayed 
c780: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
c790: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
c7a0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
c7b0: 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61   if.** it were a
c7c0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a   hot-journal)..*
c7d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
c7e0: 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a  er_error(Pager *
c7f0: 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b  pPager, int rc){
c800: 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20  .  int rc2 = rc 
c810: 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74  & 0xff;.  assert
c820: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
c830: 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  || !MEMDB );.  a
c840: 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 70 50  ssert(.       pP
c850: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
c860: 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20  QLITE_FULL ||.  
c870: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
c880: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
c890: 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67 65  ||.       (pPage
c8a0: 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66  r->errCode & 0xf
c8b0: 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  f)==SQLITE_IOERR
c8c0: 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 32 3d  .  );.  if( rc2=
c8d0: 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20  =SQLITE_FULL || 
c8e0: 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  rc2==SQLITE_IOER
c8f0: 52 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  R ){.    pPager-
c900: 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
c910: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
c920: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  }../*.** Execute
c930: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61   a rollback if a
c940: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
c950: 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63  active and unloc
c960: 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  k the .** databa
c970: 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  se file. .**.** 
c980: 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  If the pager has
c990: 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
c9a0: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
c9b0: 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  , do not attempt
c9c0: 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63   .** the rollbac
c9d0: 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  k at this time. 
c9e0: 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75  Instead, pager_u
c9f0: 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65  nlock() is calle
ca00: 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74  d. The.** call t
ca10: 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  o pager_unlock()
ca20: 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c   will discard al
ca30: 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  l in-memory page
ca40: 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65  s, unlock.** the
ca50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
ca60: 6e 64 20 63 6c 65 61 72 20 74 68 65 20 65 72 72  nd clear the err
ca70: 6f 72 20 73 74 61 74 65 2e 20 49 66 20 74 68 69  or state. If thi
ca80: 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20  s means that.** 
ca90: 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a  there is a hot-j
caa0: 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74  ournal left in t
cab0: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
cac0: 74 68 65 20 6e 65 78 74 20 63 6f 6e 6e 65 63 74  the next connect
cad0: 69 6f 6e 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e  ion.** to obtain
cae0: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
caf0: 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68 69  n the pager (whi
cb00: 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f  ch may be this o
cb10: 6e 65 29 20 77 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c  ne) will.** roll
cb20: 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20   it back..**.** 
cb30: 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  If the pager has
cb40: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 6e 74   not already ent
cb50: 65 72 65 64 20 74 68 65 20 65 72 72 6f 72 20 73  ered the error s
cb60: 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49 4f 20  tate, but an IO 
cb70: 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72  or.** malloc err
cb80: 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
cb90: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65   a rollback, the
cba0: 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74 73 65  n this will itse
cbb0: 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74 68 65  lf cause .** the
cbc0: 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20   pager to enter 
cbd0: 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
cbe0: 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65 20 63   Which will be c
cbf0: 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a 2a 2a  leared by the.**
cc00: 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
cc10: 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65 73 63  nlock(), as desc
cc20: 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a  ribed above..*/.
cc30: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
cc40: 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
cc50: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
cc60: 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
cc70: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
cc80: 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 73  _OK && pPager->s
cc90: 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
cca0: 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69  RVED ){.    sqli
ccb0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
ccc0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69  lloc();.    sqli
ccd0: 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
cce0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71  (pPager);.    sq
ccf0: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
cd00: 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 70 61  lloc();.  }.  pa
cd10: 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
cd20: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  r);.}../*.** Thi
cd30: 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61  s routine ends a
cd40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20   transaction. A 
cd50: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75  transaction is u
cd60: 73 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20  sually ended by 
cd70: 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d  .** either a COM
cd80: 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43  MIT or a ROLLBAC
cd90: 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69  K operation. Thi
cda0: 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65  s routine may be
cdb0: 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65   called .** afte
cdc0: 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  r rollback of a 
cdd0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20  hot-journal, or 
cde0: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
cdf0: 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67  rs while opening
ce00: 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
ce10: 66 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20  file or writing 
ce20: 74 68 65 20 76 65 72 79 20 66 69 72 73 74 20 6a  the very first j
ce30: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66  ournal-header of
ce40: 20 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74   a.** database t
ce50: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a  ransaction..** .
ce60: 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
ce70: 69 73 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52  is in PAGER_SHAR
ce80: 45 44 20 6f 72 20 50 41 47 45 52 5f 55 4e 4c 4f  ED or PAGER_UNLO
ce90: 43 4b 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  CK state when th
cea0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
ceb0: 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
cec0: 20 6e 6f 2d 6f 70 20 28 72 65 74 75 72 6e 73 20   no-op (returns 
ced0: 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a  SQLITE_OK)..**.*
cee0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79  * Otherwise, any
cef0: 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
cf00: 74 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e  ts are released.
cf10: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
cf20: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
cf30: 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22  en, then it is "
cf40: 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65  finalized". Once
cf50: 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66   a journal .** f
cf60: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e  ile has been fin
cf70: 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74  alized it is not
cf80: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
cf90: 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b   it to roll back
cfa0: 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69   a .** transacti
cfb0: 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20  on. Nor will it 
cfc0: 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  be considered to
cfd0: 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   be a hot-journa
cfe0: 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20  l by this.** or 
cff0: 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62 61  any other databa
d000: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45  se connection. E
d010: 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75  xactly how a jou
d020: 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65  rnal is finalize
d030: 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20  d.** depends on 
d040: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
d050: 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
d060: 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
d070: 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65   mode and.** the
d080: 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c   current journal
d090: 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75  -mode (Pager.jou
d0a0: 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c  rnalMode value),
d0b0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
d0c0: 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
d0d0: 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20  ==MEMORY.**     
d0e0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  Journal file des
d0f0: 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c  criptor is simpl
d100: 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64  y closed. This d
d110: 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20  estroys an .**  
d120: 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75     in-memory jou
d130: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  rnal..**.**   jo
d140: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43  urnalMode==TRUNC
d150: 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ATE.**     Journ
d160: 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  al file is trunc
d170: 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74  ated to zero byt
d180: 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
d190: 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
d1a0: 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20  =PERSIST.**     
d1b0: 54 68 65 20 66 69 72 73 74 20 32 38 20 62 79 74  The first 28 byt
d1c0: 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  es of the journa
d1d0: 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65  l file are zeroe
d1e0: 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61  d. This invalida
d1f0: 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  tes.**     the f
d200: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
d210: 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c  der in the file,
d220: 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65   and hence the e
d230: 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ntire journal.**
d240: 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e       file. An in
d250: 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69  valid journal fi
d260: 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c  le cannot be rol
d270: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
d280: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44    journalMode==D
d290: 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65  ELETE.**     The
d2a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
d2b0: 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65   closed and dele
d2c0: 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ted using sqlite
d2d0: 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a  3OsDelete()..**.
d2e0: 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70 61  **     If the pa
d2f0: 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
d300: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
d310: 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66  , this method of
d320: 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20   finalizing.**  
d330: 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66     the journal f
d340: 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73 65  ile is never use
d350: 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74  d. Instead, if t
d360: 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69  he journalMode i
d370: 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20  s.**     DELETE 
d380: 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
d390: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
d3a0: 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64  de, the method d
d3b0: 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a  escribed under.*
d3c0: 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  *     journalMod
d3d0: 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75 73  e==PERSIST is us
d3e0: 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
d3f0: 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72  * After the jour
d400: 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  nal is finalized
d410: 2c 20 69 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20  , if running in 
d420: 6e 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 6d 6f  non-exclusive mo
d430: 64 65 2c 20 74 68 65 0a 2a 2a 20 70 61 67 65 72  de, the.** pager
d440: 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f   moves to PAGER_
d450: 53 48 41 52 45 44 20 73 74 61 74 65 20 28 61 6e  SHARED state (an
d460: 64 20 64 6f 77 6e 67 72 61 64 65 73 20 74 68 65  d downgrades the
d470: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 2a 2a 20   lock on the.** 
d480: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 63  database file ac
d490: 63 6f 72 64 69 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a  cordingly)..**.*
d4a0: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
d4b0: 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
d4c0: 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20  lusive mode and 
d4d0: 69 73 20 69 6e 20 50 41 47 45 52 5f 53 59 4e 43  is in PAGER_SYNC
d4e0: 45 44 20 73 74 61 74 65 2c 0a 2a 2a 20 69 74 20  ED state,.** it 
d4f0: 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f 45  moves to PAGER_E
d500: 58 43 4c 55 53 49 56 45 2e 20 4e 6f 20 6c 6f 63  XCLUSIVE. No loc
d510: 6b 73 20 61 72 65 20 64 6f 77 6e 67 72 61 64 65  ks are downgrade
d520: 64 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  d when running i
d530: 6e 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6d  n.** exclusive m
d540: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ode..**.** SQLIT
d550: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
d560: 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
d570: 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  urs. If an error
d580: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a   occurs during.*
d590: 2a 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20  * any of the IO 
d5a0: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69  operations to fi
d5b0: 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
d5c0: 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63  al file or unloc
d5d0: 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
d5e0: 65 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  e then the IO er
d5f0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
d600: 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
d610: 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65  . If the .** ope
d620: 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69  ration to finali
d630: 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
d640: 69 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  ile fails, then 
d650: 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a  the code still.*
d660: 2a 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63  * tries to unloc
d670: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
d680: 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78  ile if not in ex
d690: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66  clusive mode. If
d6a0: 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f   the.** unlock o
d6b0: 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61  peration fails a
d6c0: 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65  s well, then the
d6d0: 20 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64   first error cod
d6e0: 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20  e related.** to 
d6f0: 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20  the first error 
d700: 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65  encountered (the
d710: 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a   journal finaliz
d720: 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a  ation one) is.**
d730: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
d740: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
d750: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50  nd_transaction(P
d760: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
d770: 74 20 68 61 73 4d 61 73 74 65 72 29 7b 0a 20 20  t hasMaster){.  
d780: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d790: 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72 72 6f  OK;      /* Erro
d7a0: 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72  r code from jour
d7b0: 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e  nal finalization
d7c0: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
d7d0: 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
d7e0: 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f  _OK;     /* Erro
d7f0: 72 20 63 6f 64 65 20 66 72 6f 6d 20 64 62 20 66  r code from db f
d800: 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  ile unlock opera
d810: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 70  tion */..  if( p
d820: 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
d830: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
d840: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d850: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  _OK;.  }.  relea
d860: 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
d870: 70 50 61 67 65 72 29 3b 0a 0a 20 20 61 73 73 65  pPager);..  asse
d880: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
d890: 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  r->jfd) || pPage
d8a0: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
d8b0: 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e   );.  if( isOpen
d8c0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
d8d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61  .    assert( !pa
d8e0: 67 65 72 55 73 65 4c 6f 67 28 70 50 61 67 65 72  gerUseLog(pPager
d8f0: 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  ) );..    /* Fin
d900: 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
d910: 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  l file. */.    i
d920: 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a  f( sqlite3IsMemJ
d930: 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
d940: 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fd) ){.      ass
d950: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
d960: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
d970: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
d980: 52 59 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  RY );.      sqli
d990: 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
d9a0: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c  r->jfd);.    }el
d9b0: 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
d9c0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
d9d0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
d9e0: 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20  UNCATE ){.      
d9f0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
da00: 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
da10: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
da20: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _OK;.      }else
da30: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
da40: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
da50: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
da60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
da70: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
da80: 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
da90: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
daa0: 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65  rted = 0;.    }e
dab0: 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
dac0: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20  exclusiveMode . 
dad0: 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a      || pPager->j
dae0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
daf0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
db00: 52 53 49 53 54 0a 20 20 20 20 29 7b 0a 20 20 20  RSIST.    ){.   
db10: 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72     rc = zeroJour
db20: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68  nalHdr(pPager, h
db30: 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  asMaster);.     
db40: 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
db50: 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
db60: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
db70: 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
db80: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
db90: 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65  rted = 0;.    }e
dba0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  lse{.      /* Th
dbb0: 69 73 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65  is branch may be
dbc0: 20 65 78 65 63 75 74 65 64 20 77 69 74 68 20 50   executed with P
dbd0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ager.journalMode
dbe0: 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20  ==MEMORY if.    
dbf0: 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e    ** a hot-journ
dc00: 61 6c 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c  al was just roll
dc10: 65 64 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73  ed back. In this
dc20: 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61   case the journa
dc30: 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  l.      ** file 
dc40: 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64  should be closed
dc50: 20 61 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66   and deleted. If
dc60: 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
dc70: 20 77 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20   writes to.     
dc80: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
dc90: 20 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64   file, it will d
dca0: 6f 20 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e  o so using an in
dcb0: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
dcc0: 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
dcd0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
dce0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
dcf0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
dd00: 44 45 4c 45 54 45 20 0a 20 20 20 20 20 20 20 20  DELETE .        
dd10: 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
dd20: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
dd30: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
dd40: 4f 52 59 20 0a 20 20 20 20 20 20 20 20 20 20 20  ORY .           
dd50: 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
dd60: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
dd70: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
dd80: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71       );.      sq
dd90: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
dda0: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
ddb0: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
ddc0: 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
ddd0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
dde0: 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
ddf0: 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
de00: 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
de10: 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66   }.    }..#ifdef
de20: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
de30: 47 45 53 0a 20 20 20 20 73 71 6c 69 74 65 33 50  GES.    sqlite3P
de40: 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74  cacheIterateDirt
de50: 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  y(pPager->pPCach
de60: 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67  e, pager_set_pag
de70: 65 68 61 73 68 29 3b 0a 23 65 6e 64 69 66 0a 20  ehash);.#endif. 
de80: 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76   }.  sqlite3Bitv
de90: 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
dea0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
deb0: 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
dec0: 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  nal = 0;.  pPage
ded0: 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73  r->nRec = 0;.  s
dee0: 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
def0: 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
df00: 61 63 68 65 29 3b 0a 0a 20 20 69 66 28 20 70 61  ache);..  if( pa
df10: 67 65 72 55 73 65 4c 6f 67 28 70 50 61 67 65 72  gerUseLog(pPager
df20: 29 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 73  ) ){.    rc2 = s
df30: 71 6c 69 74 65 33 4c 6f 67 57 72 69 74 65 4c 6f  qlite3LogWriteLo
df40: 63 6b 28 70 50 61 67 65 72 2d 3e 70 4c 6f 67 2c  ck(pPager->pLog,
df50: 20 30 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   0);.    pPager-
df60: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
df70: 48 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69  HARED;.  }else i
df80: 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
df90: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
dfa0: 20 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28   rc2 = osUnlock(
dfb0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52  pPager->fd, SHAR
dfc0: 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50  ED_LOCK);.    pP
dfd0: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
dfe0: 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
dff0: 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
e000: 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d  untDone = 0;.  }
e010: 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
e020: 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59  >state==PAGER_SY
e030: 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67  NCED ){.    pPag
e040: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
e050: 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d  R_EXCLUSIVE;.  }
e060: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
e070: 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  ster = 0;.  pPag
e080: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
e090: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f  ;.  pPager->dbMo
e0a0: 64 69 66 69 65 64 20 3d 20 30 3b 0a 0a 20 20 2f  dified = 0;..  /
e0b0: 2a 20 54 4f 44 4f 3a 20 49 73 20 74 68 69 73 20  * TODO: Is this 
e0c0: 6f 70 74 69 6d 61 6c 3f 20 57 68 79 20 69 73 20  optimal? Why is 
e0d0: 74 68 65 20 64 62 20 73 69 7a 65 20 69 6e 76 61  the db size inva
e0e0: 6c 69 64 61 74 65 64 20 68 65 72 65 20 0a 20 20  lidated here .  
e0f0: 2a 2a 20 77 68 65 6e 20 74 68 65 20 64 61 74 61  ** when the data
e100: 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
e110: 20 75 6e 6c 6f 63 6b 65 64 3f 20 2a 2f 0a 20 20   unlocked? */.  
e120: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
e130: 7a 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ze = 0;.  sqlite
e140: 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28  3PcacheTruncate(
e150: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
e160: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
e170: 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29  ;.  if( !MEMDB )
e180: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
e190: 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20  SizeValid = 0;. 
e1a0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63   }..  return (rc
e1b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a  ==SQLITE_OK?rc2:
e1c0: 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  rc);.}../*.** Pa
e1d0: 72 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75  rameter aData mu
e1e0: 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  st point to a bu
e1f0: 66 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e  ffer of pPager->
e200: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a  pageSize bytes.*
e210: 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75  * of data. Compu
e220: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
e230: 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f  checksum based o
e240: 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nt the contents 
e250: 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20  of the .** page 
e260: 6f 66 20 64 61 74 61 20 61 6e 64 20 74 68 65 20  of data and the 
e270: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
e280: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
e290: 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  it..**.** This i
e2a0: 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65  s not a real che
e2b0: 63 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61  cksum. It is rea
e2c0: 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d  lly just the sum
e2d0: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64   of the .** rand
e2e0: 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  om initial value
e2f0: 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   (pPager->cksumI
e300: 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79 20 32  nit) and every 2
e310: 30 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20  00th byte.** of 
e320: 74 68 65 20 70 61 67 65 20 64 61 74 61 2c 20 73  the page data, s
e330: 74 61 72 74 69 6e 67 20 77 69 74 68 20 62 79 74  tarting with byt
e340: 65 20 6f 66 66 73 65 74 20 28 70 50 61 67 65 72  e offset (pPager
e350: 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e  ->pageSize%200).
e360: 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69 73  .** Each byte is
e370: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
e380: 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65  an 8-bit unsigne
e390: 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a  d integer..**.**
e3a0: 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f   Changing the fo
e3b0: 72 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f  rmula used to co
e3c0: 6d 70 75 74 65 20 74 68 69 73 20 63 68 65 63 6b  mpute this check
e3d0: 73 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61  sum results in a
e3e0: 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n.** incompatibl
e3f0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
e400: 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormat..**.** If 
e410: 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69  journal corrupti
e420: 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f  on occurs due to
e430: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
e440: 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c  , the most likel
e450: 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69  y .** scenario i
e460: 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
e470: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
e480: 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
e490: 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49  e changed. .** I
e4a0: 74 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c  t is much less l
e4b0: 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
e4c0: 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
e4d0: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
e4e0: 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
e4f0: 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
e500: 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
e510: 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
e520: 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
e530: 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
e540: 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
e550: 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
e560: 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
e570: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  on..*/.static u3
e580: 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61  2 pager_cksum(Pa
e590: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
e5a0: 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20  st u8 *aData){. 
e5b0: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61   u32 cksum = pPa
e5c0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20  ger->cksumInit; 
e5d0: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
e5e0: 73 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74  sum value to ret
e5f0: 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  urn */.  int i =
e600: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
e610: 65 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20 20  e-200;          
e620: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
e630: 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20  */.  while( i>0 
e640: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
e650: 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20  aData[i];.    i 
e660: 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65  -= 200;.  }.  re
e670: 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f  turn cksum;.}../
e680: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67  *.** Read a sing
e690: 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74  le page from eit
e6a0: 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  her the journal 
e6b0: 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a  file (if isMainJ
e6c0: 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72  rnl==1) or.** fr
e6d0: 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
e6e0: 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e  al (if isMainJrn
e6f0: 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61  l==0) and playba
e700: 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a  ck that page..**
e710: 20 54 68 65 20 70 61 67 65 20 62 65 67 69 6e 73   The page begins
e720: 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66   at offset *pOff
e730: 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  set into the fil
e740: 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a  e. The *pOffset.
e750: 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72  ** value is incr
e760: 65 61 73 65 64 20 74 6f 20 74 68 65 20 73 74 61  eased to the sta
e770: 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70  rt of the next p
e780: 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  age in the journ
e790: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  al..**.** The is
e7a0: 4d 61 69 6e 4a 72 6e 6c 20 66 6c 61 67 20 69 73  MainJrnl flag is
e7b0: 20 74 72 75 65 20 69 66 20 74 68 69 73 20 69 73   true if this is
e7c0: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
e7d0: 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a  ck journal and.*
e7e0: 2a 20 66 61 6c 73 65 20 66 6f 72 20 74 68 65 20  * false for the 
e7f0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
e800: 6c 2e 20 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c  l.  The main rol
e810: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73  lback journal us
e820: 65 73 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 73 20  es.** checksums 
e830: 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  - the statement 
e840: 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
e850: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
e860: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
e870: 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65  e page record re
e880: 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
e890: 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
e8a0: 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
e8b0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  n the current va
e8c0: 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53  lue of Pager.dbS
e8d0: 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61  ize, then playba
e8e0: 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64  ck is.** skipped
e8f0: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69   and SQLITE_OK i
e900: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
e910: 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f  * If pDone is no
e920: 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20  t NULL, then it 
e930: 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70  is a record of p
e940: 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61  ages that have a
e950: 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70  lready.** been p
e960: 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20  layed back.  If 
e970: 74 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66  the page at *pOf
e980: 66 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79  fset has already
e990: 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
e9a0: 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72  k.** (if the cor
e9b0: 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65  responding pDone
e9c0: 20 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65   bit is set) the
e9d0: 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62  n skip the playb
e9e0: 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ack..** Make sur
e9f0: 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20  e the pDone bit 
ea00: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
ea10: 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61   the *pOffset pa
ea20: 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69  ge is set.** pri
ea30: 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e  or to returning.
ea40: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
ea50: 67 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63  ge record is suc
ea60: 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66  cessfully read f
ea70: 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
ea80: 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e  urnal file.** an
ea90: 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74  d played back, t
eaa0: 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  hen SQLITE_OK is
eab0: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
eac0: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
ead0: 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e  .** while readin
eae0: 67 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f  g the record fro
eaf0: 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
eb00: 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c  nal file or whil
eb10: 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20  e writing.** to 
eb20: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
eb30: 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  e, then the IO e
eb40: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
eb50: 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a  urned. If data.*
eb60: 2a 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  * is successfull
eb70: 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  y read from the 
eb80: 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
eb90: 6c 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74  le but appears t
eba0: 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65  o be.** corrupte
ebb0: 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
ebc0: 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61  s returned. Data
ebd0: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63   is considered c
ebe0: 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74  orrupted in.** t
ebf0: 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  wo circumstances
ec00: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20  :.** .**   * If 
ec10: 74 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d  the record page-
ec20: 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61  number is illega
ec30: 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a  l (0 or PAGER_MJ
ec40: 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20  _PGNO), or.**   
ec50: 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
ec60: 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
ec70: 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
ec80: 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  in journal file.
ec90: 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63  **     and the c
eca0: 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f  hecksum field do
ecb0: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
ecc0: 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e   record content.
ecd0: 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f  .**.** Neither o
ece0: 66 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e  f these two scen
ecf0: 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62  arios are possib
ed00: 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65  le during a save
ed10: 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a  point rollback..
ed20: 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73  **.** If this is
ed30: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
ed40: 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f  lback, then memo
ed50: 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62  ry may have to b
ed60: 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a  e dynamically.**
ed70: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
ed80: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20  is function. If 
ed90: 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
eda0: 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69   and an allocati
edb0: 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c  on fails,.** SQL
edc0: 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
edd0: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
ede0: 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
edf0: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20  ack_one_page(.  
ee00: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ee20: 20 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67   The pager being
ee30: 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a   played back */.
ee40: 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20    i64 *pOffset, 
ee50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee60: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63  /* Offset of rec
ee70: 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ord to playback 
ee80: 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
ee90: 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ne,             
eea0: 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20     /* Bitvec of 
eeb0: 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c  pages already pl
eec0: 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  ayed back */.  i
eed0: 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20  nt isMainJrnl,  
eee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eef0: 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61  1 -> main journa
ef00: 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72  l. 0 -> sub-jour
ef10: 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  nal. */.  int is
ef20: 53 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 20  Savepnt         
ef30: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
ef40: 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20  for a savepoint 
ef50: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20  rollback */.){. 
ef60: 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
ef70: 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20   *pPg;          
ef80: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
ef90: 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
efa0: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
efb0: 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
efc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
efd0: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
efe0: 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75  of a page in jou
eff0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
f000: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
f010: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
f020: 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e  sum used for san
f030: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a  ity checking */.
f040: 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20    char *aData;  
f050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f060: 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f  /* Temporary sto
f070: 72 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67  rage for the pag
f080: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
f090: 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20  ile *jfd;       
f0a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
f0b0: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
f0c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
f0d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63   */.  int isSync
f0e0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
f0f0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
f100: 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73  ournal page is s
f110: 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  ynced */..  asse
f120: 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26  rt( (isMainJrnl&
f130: 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  ~1)==0 );      /
f140: 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20  * isMainJrnl is 
f150: 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
f160: 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e  rt( (isSavepnt&~
f170: 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f  1)==0 );       /
f180: 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30  * isSavepnt is 0
f190: 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
f1a0: 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c  t( isMainJrnl ||
f1b0: 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a   pDone );     /*
f1c0: 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73   pDone always us
f1d0: 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61  ed on sub-journa
f1e0: 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ls */.  assert( 
f1f0: 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f  isSavepnt || pDo
f200: 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44  ne==0 );   /* pD
f210: 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f  one never used o
f220: 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20  n non-savepoint 
f230: 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50  */..  aData = pP
f240: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
f250: 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61  .  assert( aData
f260: 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   );         /* T
f270: 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74  emp storage must
f280: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
f290: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
f2a0: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70  .  /* Read the p
f2b0: 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70  age number and p
f2c0: 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68  age data from th
f2d0: 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62  e journal or sub
f2e0: 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69  -journal.  ** fi
f2f0: 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  le. Return an er
f300: 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
f310: 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20  caller if an IO 
f320: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20  error occurs..  
f330: 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69  */.  jfd = isMai
f340: 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e  nJrnl ? pPager->
f350: 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a  jfd : pPager->sj
f360: 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33  fd;.  rc = read3
f370: 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66  2bits(jfd, *pOff
f380: 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69  set, &pgno);.  i
f390: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f3a0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
f3b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
f3c0: 61 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61  ad(jfd, (u8*)aDa
f3d0: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
f3e0: 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29  Size, (*pOffset)
f3f0: 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  +4);.  if( rc!=S
f400: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
f410: 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74  n rc;.  *pOffset
f420: 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
f430: 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69  Size + 4 + isMai
f440: 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53  nJrnl*4;..  /* S
f450: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
f460: 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
f470: 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
f480: 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
f490: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
f4a0: 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
f4b0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
f4c0: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
f4d0: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
f4e0: 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
f4f0: 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
f500: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
f510: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
f520: 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
f530: 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
f540: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
f550: 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
f560: 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
f570: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
f580: 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
f590: 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
f5a0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
f5b0: 73 65 72 74 28 20 21 69 73 53 61 76 65 70 6e 74  sert( !isSavepnt
f5c0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
f5d0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
f5e0: 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f    if( pgno>(Pgno
f5f0: 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
f600: 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
f610: 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f  Test(pDone, pgno
f620: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
f630: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
f640: 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
f650: 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  ){.    rc = read
f660: 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f  32bits(jfd, (*pO
f670: 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d  ffset)-4, &cksum
f680: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
f690: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
f6a0: 66 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26  f( !isSavepnt &&
f6b0: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
f6c0: 67 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29  ger, (u8*)aData)
f6d0: 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20  !=cksum ){.     
f6e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
f6f0: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
f700: 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20 28    if( pDone && (
f710: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
f720: 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e  ecSet(pDone, pgn
f730: 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  o))!=SQLITE_OK )
f740: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
f750: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
f760: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
f770: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c  AGER_RESERVED ||
f780: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
f790: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
f7a0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
f7b0: 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53 45  pager is in RESE
f7c0: 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e  RVED state, then
f7d0: 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
f7e0: 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20   copy of this.  
f7f0: 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70  ** page in the p
f800: 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74  ager cache. In t
f810: 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70  his case just up
f820: 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
f830: 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74  ache,.  ** not t
f840: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
f850: 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65  . The page is le
f860: 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20  ft marked dirty 
f870: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
f880: 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70  **.  ** An excep
f890: 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76  tion to the abov
f8a0: 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64  e rule: If the d
f8b0: 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f  atabase is in no
f8c0: 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20  -sync mode.  ** 
f8d0: 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f  and a page is mo
f8e0: 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e  ved during an in
f8f0: 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
f900: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
f910: 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69  ay.  ** not be i
f920: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
f930: 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d  e. Later: if a m
f940: 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72  alloc() or IO er
f950: 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  ror occurs.  ** 
f960: 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67  during a Movepag
f970: 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74  e() call, then t
f980: 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  he page may not 
f990: 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a  be in the cache.
f9a0: 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20    ** either. So 
f9b0: 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  the condition de
f9c0: 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61  scribed in the a
f9d0: 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69  bove paragraph i
f9e0: 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72  s not.  ** asser
f9f0: 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  t()able..  **.  
fa00: 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49  ** If in EXCLUSI
fa10: 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77  VE state, then w
fa20: 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  e update the pag
fa30: 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65  er cache if it e
fa40: 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74  xists.  ** and t
fa50: 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68  he main file. Th
fa60: 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d  e page is then m
fa70: 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e  arked not dirty.
fa80: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65  .  **.  ** Ticke
fa90: 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74  t #1171:  The st
faa0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
fab0: 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61  might contain pa
fac0: 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20  ge content that 
fad0: 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e  is.  ** differen
fae0: 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  t from the page 
faf0: 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73  content at the s
fb00: 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
fb10: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  saction..  ** Th
fb20: 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61  is occurs when a
fb30: 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64   page is changed
fb40: 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
fb50: 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65  art of a stateme
fb60: 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61  nt.  ** then cha
fb70: 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69  nged again withi
fb80: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e  n the statement.
fb90: 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62    When rolling b
fba0: 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20  ack such a.  ** 
fbb0: 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73  statement we mus
fbc0: 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  t not write to t
fbd0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
fbe0: 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b  base unless we k
fbf0: 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72  now.  ** for cer
fc00: 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e  tain that origin
fc10: 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
fc20: 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f   are synced into
fc30: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
fc40: 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
fc50: 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70    Otherwise, a p
fc60: 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20  ower loss might 
fc70: 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64  leave modified d
fc80: 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ata in the.  ** 
fc90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
fca0: 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69  thout an entry i
fcb0: 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
fcc0: 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a  ournal that can.
fcd0: 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65    ** restore the
fce0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73   database to its
fcf0: 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20   original form. 
fd00: 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20   Two conditions 
fd10: 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74  must be.  ** met
fd20: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
fd30: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
fd40: 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64  files. (1) the d
fd50: 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a  atabase must be.
fd60: 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32    ** locked.  (2
fd70: 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
fd80: 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
fd90: 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c   content is full
fda0: 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e  y synced.  ** in
fdb0: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
fdc0: 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  l either because
fdd0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
fde0: 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73   in cache or els
fdf0: 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
fe00: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
fe10: 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20  dSync==0..  **. 
fe20: 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20   ** 2008-04-14: 
fe30: 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67   When attempting
fe40: 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72   to vacuum a cor
fe50: 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
fe60: 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70  le, it.  ** is p
fe70: 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20  ossible to fail 
fe80: 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61  a statement on a
fe90: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 64   database that d
fea0: 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73  oes not yet exis
feb0: 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61  t..  ** Do not a
fec0: 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
fed0: 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  if database file
fee0: 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20   has never been 
fef0: 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  opened..  */.  p
ff00: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
ff10: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
ff20: 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c  .  assert( pPg |
ff30: 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 50 41  | !MEMDB );.  PA
ff40: 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42  GERTRACE(("PLAYB
ff50: 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68  ACK %d page %d h
ff60: 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c  ash(%08x) %s\n",
ff70: 0a 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45  .           PAGE
ff80: 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
ff90: 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  o, pager_datahas
ffa0: 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  h(pPager->pageSi
ffb0: 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c  ze, (u8*)aData),
ffc0: 0a 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d  .           (isM
ffd0: 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f  ainJrnl?"main-jo
ffe0: 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72  urnal":"sub-jour
fff0: 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66  nal").  ));.  if
10000 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a  ( isMainJrnl ){.
10010 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70      isSynced = p
10020 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c  Pager->noSync ||
10030 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50   (*pOffset <= pP
10040 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
10050 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10060 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d  isSynced = (pPg=
10070 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66  =0 || 0==(pPg->f
10080 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45  lags & PGHDR_NEE
10090 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20  D_SYNC));.  }.  
100a0 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61  if( (pPager->sta
100b0 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
100c0 49 56 45 29 0a 20 20 20 26 26 20 69 73 4f 70 65  IVE).   && isOpe
100d0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20  n(pPager->fd).  
100e0 20 26 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29   && isSynced.  )
100f0 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d  {.    i64 ofst =
10100 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
10110 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
10120 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21  .    testcase( !
10130 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 50 67  isSavepnt && pPg
10140 21 3d 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61  !=0 && (pPg->fla
10150 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
10160 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20 20 72 63  NC)!=0 );.    rc
10170 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
10180 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75  e(pPager->fd, (u
10190 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72  8*)aData, pPager
101a0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74  ->pageSize, ofst
101b0 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  );.    if( pgno>
101c0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
101d0 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  ze ){.      pPag
101e0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
101f0 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20   pgno;.    }.   
10200 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61   if( pPager->pBa
10210 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f  ckup ){.      CO
10220 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44 61  DEC1(pPager, aDa
10230 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d  ta, pgno, 3, rc=
10240 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
10250 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
10260 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
10270 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20  >pBackup, pgno, 
10280 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20  (u8*)aData);.   
10290 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
102a0 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37  , aData, pgno, 7
102b0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
102c0 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  M, aData);.    }
102d0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73  .  }else if( !is
102e0 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d  MainJrnl && pPg=
102f0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
10300 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61  this is a rollba
10310 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e  ck of a savepoin
10320 74 20 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e  t and data was n
10330 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ot written to.  
10340 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
10350 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  e and the page i
10360 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c  s not in-memory,
10370 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65   there is a pote
10380 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f  ntial.    ** pro
10390 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70  blem. When the p
103a0 61 67 65 20 69 73 20 6e 65 78 74 20 66 65 74 63  age is next fetc
103b0 68 65 64 20 62 79 20 74 68 65 20 62 2d 74 72 65  hed by the b-tre
103c0 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20  e layer, it .   
103d0 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64   ** will be read
103e0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
103f0 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d  se file, which m
10400 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
10410 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74   .    ** current
10420 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
10430 20 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75   There are a cou
10440 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74  ple of different
10450 20 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68   ways this can h
10460 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71  appen. All are q
10470 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63  uite.    ** obsc
10480 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e  ure. When runnin
10490 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  g in synchronous
104a0 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20   mode, this can 
104b0 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20  only happen .   
104c0 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20   ** if the page 
104d0 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  is on the free-l
104e0 69 73 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ist at the start
104f0 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
10500 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
10510 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e   populated, then
10520 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c   moved using sql
10530 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
10540 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
10550 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  ** The solution 
10560 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d  is to add an in-
10570 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74  memory page to t
10580 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
10590 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64  ing.    ** the d
105a0 61 74 61 20 6a 75 73 74 20 72 65 61 64 20 66 72  ata just read fr
105b0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
105c0 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67  al. Mark the pag
105d0 65 20 61 73 20 64 69 72 74 79 20 0a 20 20 20 20  e as dirty .    
105e0 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70 61  ** and if the pa
105f0 67 65 72 20 72 65 71 75 69 72 65 73 20 61 20 6a  ger requires a j
10600 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65  ournal-sync, the
10610 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  n mark the page 
10620 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69  as .    ** requi
10630 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ring a journal-s
10640 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69 73  ync before it is
10650 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f   written..    */
10660 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 53  .    assert( isS
10670 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 69 66  avepnt );.    if
10680 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  ( (rc = sqlite3P
10690 61 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67  agerAcquire(pPag
106a0 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20  er, pgno, &pPg, 
106b0 31 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  1))!=SQLITE_OK )
106c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
106d0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  c;.    }.    pPg
106e0 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44  ->flags &= ~PGHD
106f0 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20  R_NEED_READ;.   
10700 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
10710 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
10720 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  }.  if( pPg ){. 
10730 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68     /* No page sh
10740 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70  ould ever be exp
10750 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62  licitly rolled b
10760 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75  ack that is in u
10770 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a  se, except.    *
10780 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69  * for page 1 whi
10790 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73  ch is held in us
107a0 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65  e in order to ke
107b0 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  ep the lock on t
107c0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
107d0 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76  se active. Howev
107e0 65 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d  er such a page m
107f0 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ay be rolled bac
10800 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20  k as a result.  
10810 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72    ** of an inter
10820 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74  nal error result
10830 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61  ing in an automa
10840 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  tic call to.    
10850 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  ** sqlite3PagerR
10860 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a  ollback()..    *
10870 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74  /.    void *pDat
10880 61 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70  a;.    pData = p
10890 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d  Pg->pData;.    m
108a0 65 6d 63 70 79 28 70 44 61 74 61 2c 20 28 75 38  emcpy(pData, (u8
108b0 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  *)aData, pPager-
108c0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
108d0 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
108e0 72 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20  r(pPg);.    if( 
108f0 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21  isMainJrnl && (!
10900 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f  isSavepnt || *pO
10910 66 66 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a  ffset<=pPager->j
10920 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20  ournalHdr) ){.  
10930 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
10940 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70  ntents of this p
10950 61 67 65 20 77 65 72 65 20 6a 75 73 74 20 72 65  age were just re
10960 73 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20  stored from the 
10970 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a  main .      ** j
10980 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
10990 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75  n its content mu
109a0 73 74 20 62 65 20 61 73 20 74 68 65 79 20 77 65  st be as they we
109b0 72 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20  re when the .   
109c0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
109d0 6e 20 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e  n was first open
109e0 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
109f0 20 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65   we can mark the
10a00 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61   page.      ** a
10a10 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74  s clean, since t
10a20 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20  here will be no 
10a30 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 69 74  need to write it
10a40 20 6f 75 74 20 74 6f 20 74 68 65 0a 20 20 20 20   out to the.    
10a50 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20    ** database.. 
10a60 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
10a70 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 65 78   There is one ex
10a80 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  ception to this 
10a90 72 75 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67  rule. If the pag
10aa0 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  e is being rolle
10ab0 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20  d.      ** back 
10ac0 61 73 20 70 61 72 74 20 6f 66 20 61 20 73 61 76  as part of a sav
10ad0 65 70 6f 69 6e 74 20 28 6f 72 20 73 74 61 74 65  epoint (or state
10ae0 6d 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66  ment) rollback f
10af0 72 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a  rom an .      **
10b00 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f   unsynced portio
10b10 6e 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  n of the main jo
10b20 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
10b30 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 0a   it is not safe.
10b40 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b        ** to mark
10b50 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
10b60 61 6e 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  an. This is beca
10b70 75 73 65 20 6d 61 72 6b 69 6e 67 20 74 68 65 20  use marking the 
10b80 70 61 67 65 20 61 73 0a 20 20 20 20 20 20 2a 2a  page as.      **
10b90 20 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61   clean will clea
10ba0 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  r the PGHDR_NEED
10bb0 5f 53 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63  _SYNC flag. Sinc
10bc0 65 20 74 68 65 20 70 61 67 65 20 69 73 0a 20 20  e the page is.  
10bd0 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 69      ** already i
10be0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
10bf0 6c 65 20 28 72 65 63 6f 72 64 65 64 20 69 6e 20  le (recorded in 
10c00 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
10c10 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74  ) and.      ** t
10c20 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
10c30 4e 43 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  NC flag is clear
10c40 65 64 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  ed, if the page 
10c50 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  is written to.  
10c60 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74      ** again wit
10c70 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
10c80 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65  tion, it will be
10c90 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
10ca0 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68   but.      ** th
10cb0 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
10cc0 43 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20  C flag will not 
10cd0 62 65 20 73 65 74 2e 20 49 74 20 63 6f 75 6c 64  be set. It could
10ce0 20 74 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c   then potentiall
10cf0 79 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 77 72  y.      ** be wr
10d00 69 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74  itten out into t
10d10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10d20 20 62 65 66 6f 72 65 20 69 74 73 20 6a 6f 75 72   before its jour
10d30 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  nal file.      *
10d40 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 73 79 6e  * segment is syn
10d50 63 65 64 2e 20 49 66 20 61 20 63 72 61 73 68 20  ced. If a crash 
10d60 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6f 72  occurs during or
10d70 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c   following this,
10d80 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
10d90 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61  se corruption ma
10da0 79 20 65 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a  y ensue..      *
10db0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  /.      sqlite3P
10dc0 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70  cacheMakeClean(p
10dd0 50 67 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  Pg);.    }.#ifde
10de0 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
10df0 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
10e00 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
10e10 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
10e20 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74  ndif.    /* If t
10e30 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20  his was page 1, 
10e40 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65  then restore the
10e50 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
10e60 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20  dbFileVers..    
10e70 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72  ** Do this befor
10e80 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20  e any decoding. 
10e90 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  */.    if( pgno=
10ea0 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  =1 ){.      memc
10eb0 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
10ec0 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70  leVers, &((u8*)p
10ed0 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66  Data)[24],sizeof
10ee0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
10ef0 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ers));.    }..  
10f00 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20    /* Decode the 
10f10 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66  page just read f
10f20 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20  rom disk */.    
10f30 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
10f40 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
10f50 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   3, rc=SQLITE_NO
10f60 4d 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  MEM);.    sqlite
10f70 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70  3PcacheRelease(p
10f80 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Pg);.  }.  retur
10f90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
10fa0 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
10fb0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
10fc0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
10fd0 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
10fe0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
10ff0 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
11000 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11010 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
11020 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
11030 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
11040 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
11050 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
11060 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
11070 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
11080 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
11090 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41  f it is..**.** A
110a0 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20  rgument zMaster 
110b0 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67  may point to Pag
110c0 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f  er.pTmpSpace. So
110d0 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20   that buffer is 
110e0 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  not .** availabl
110f0 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e  e for use within
11100 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
11110 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73  **.** When a mas
11120 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11130 20 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20   is created, it 
11140 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
11150 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20  h the names .** 
11160 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68  of all of its ch
11170 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e  ild journals, on
11180 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c  e after another,
11190 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74   formatted as ut
111a0 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20  f-8 .** encoded 
111b0 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66  text. The end of
111c0 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   each child jour
111d0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b  nal file is mark
111e0 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75  ed with a .** nu
111f0 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
11200 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74  e (0x00). i.e. t
11210 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
11220 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ts of a master j
11230 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66  ournal.** file f
11240 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
11250 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64   involving two d
11260 61 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62  atabases might b
11270 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d  e:.**.**   "/hom
11280 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72  e/bill/a.db-jour
11290 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c  nal\x00/home/bil
112a0 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/b.db-journal\x
112b0 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74  00".**.** A mast
112c0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
112d0 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65  may only be dele
112e0 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20  ted once all of 
112f0 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f  its child .** jo
11300 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e  urnals have been
11310 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
11320 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
11330 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74  n reads the cont
11340 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ents of the mast
11350 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er-journal file 
11360 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  into .** memory 
11370 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67  and loops throug
11380 68 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68  h each of the ch
11390 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ild journal name
113a0 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63  s. For.** each c
113b0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  hild journal, it
113c0 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a   checks if:.**.*
113d0 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69  *   * if the chi
113e0 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  ld journal exist
113f0 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20  s, and if so.** 
11400 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64    * if the child
11410 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
11420 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
11430 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11440 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61  .**     file zMa
11450 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ster.**.** If a 
11460 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61  child journal ca
11470 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20  n be found that 
11480 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20  matches both of 
11490 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20  the criteria.** 
114a0 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63  above, this func
114b0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74  tion returns wit
114c0 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
114d0 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ing. Otherwise, 
114e0 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68  if.** no such ch
114f0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ild journal can 
11500 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a  be found, file z
11510 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65  Master is delete
11520 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69  d from.** the fi
11530 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20  le-system using 
11540 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
11550 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  )..**.** If an I
11560 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74  O error within t
11570 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e  his function, an
11580 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
11590 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a  eturned. This.**
115a0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
115b0 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61  tes memory by ca
115c0 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c  lling sqlite3Mal
115d0 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c  loc(). If an all
115e0 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73  ocation.** fails
115f0 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
11600 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
11610 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20  rwise, if no IO 
11620 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  or malloc errors
11630 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49   .** occur, SQLI
11640 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
11650 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54  d..**.** TODO: T
11660 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
11670 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20  ocates a single 
11680 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20  block of memory 
11690 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65  to load.** the e
116a0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
116b0 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
116c0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
116d0 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f  could be.** a co
116e0 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65  uple of kilobyte
116f0 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74  s or so - potent
11700 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61  ially larger tha
11710 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73  n the page .** s
11720 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
11730 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74  nt pager_delmast
11740 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
11750 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
11760 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  aster){.  sqlite
11770 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
11780 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
11790 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
117a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
117b0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
117c0 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
117d0 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27  r;    /* Malloc'
117e0 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  d master-journal
117f0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
11800 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
11810 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20  le *pJournal;   
11820 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c  /* Malloc'd chil
11830 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  d-journal file d
11840 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63  escriptor */.  c
11850 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72  har *zMasterJour
11860 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74  nal = 0; /* Cont
11870 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ents of master j
11880 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
11890 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72   i64 nMasterJour
118a0 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  nal;       /* Si
118b0 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ze of master jou
118c0 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  rnal file */..  
118d0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
118e0 65 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70  e for both the p
118f0 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73  Journal and pMas
11900 74 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  ter file descrip
11910 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75  tors..  ** If su
11920 63 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74  ccessful, open t
11930 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
11940 6c 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69  l file for readi
11950 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74  ng..  */.  pMast
11960 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  er = (sqlite3_fi
11970 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  le *)sqlite3Mall
11980 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f  ocZero(pVfs->szO
11990 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a  sFile * 2);.  pJ
119a0 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65  ournal = (sqlite
119b0 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a  3_file *)(((u8 *
119c0 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73  )pMaster) + pVfs
119d0 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69  ->szOsFile);.  i
119e0 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20  f( !pMaster ){. 
119f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
11a00 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
11a10 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
11a20 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs = (SQLITE_OPE
11a30 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
11a40 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
11a50 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d  URNAL);.    rc =
11a60 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
11a70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d  Vfs, zMaster, pM
11a80 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29  aster, flags, 0)
11a90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
11aa0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
11ab0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
11ac0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
11ad0 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65  sFileSize(pMaste
11ae0 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  r, &nMasterJourn
11af0 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  al);.  if( rc!=S
11b00 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
11b10 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
11b20 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75    if( nMasterJou
11b30 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68  rnal>0 ){.    ch
11b40 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20  ar *zJournal;.  
11b50 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50    char *zMasterP
11b60 74 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  tr = 0;.    int 
11b70 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66  nMasterPtr = pVf
11b80 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
11b90 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68  ..    /* Load th
11ba0 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
11bb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
11bc0 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
11bd0 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c   from.    ** sql
11be0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e  ite3_malloc() an
11bf0 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  d pointed to by 
11c00 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20  zMasterJournal. 
11c10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73  .    */.    zMas
11c20 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  terJournal = sql
11c30 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74 29  ite3Malloc((int)
11c40 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b  nMasterJournal +
11c50 20 6e 4d 61 73 74 65 72 50 74 72 20 2b 20 31 29   nMasterPtr + 1)
11c60 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74  ;.    if( !zMast
11c70 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
11c80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
11c90 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
11ca0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
11cb0 20 20 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65      }.    zMaste
11cc0 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a  rPtr = &zMasterJ
11cd0 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f  ournal[nMasterJo
11ce0 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 20 20 72 63  urnal+1];.    rc
11cf0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
11d00 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65  (pMaster, zMaste
11d10 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e  rJournal, (int)n
11d20 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30  MasterJournal, 0
11d30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
11d40 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
11d50 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
11d60 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61     zMasterJourna
11d70 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l[nMasterJournal
11d80 5d 20 3d 20 30 3b 0a 0a 20 20 20 20 7a 4a 6f 75  ] = 0;..    zJou
11d90 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f  rnal = zMasterJo
11da0 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65  urnal;.    while
11db0 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73  ( (zJournal-zMas
11dc0 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73  terJournal)<nMas
11dd0 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
11de0 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a      int exists;.
11df0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
11e00 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
11e10 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54   zJournal, SQLIT
11e20 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
11e30 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 20   &exists);.     
11e40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11e50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
11e60 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
11e70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11e80 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20  if( exists ){.  
11e90 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
11ea0 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69  the journals poi
11eb0 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d  nted to by the m
11ec0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78  aster journal ex
11ed0 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ists..        **
11ee0 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65   Open it and che
11ef0 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20  ck if it points 
11f00 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  at the master jo
11f10 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20  urnal. If.      
11f20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20    ** so, return 
11f30 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67  without deleting
11f40 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11f50 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
11f60 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
11f70 20 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   c;.        int 
11f80 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
11f90 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
11fa0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
11fb0 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20  OURNAL);.       
11fc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
11fd0 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e  pen(pVfs, zJourn
11fe0 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c  al, pJournal, fl
11ff0 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ags, 0);.       
12000 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12010 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
12020 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
12030 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
12040 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64         rc = read
12050 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a  MasterJournal(pJ
12060 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50  ournal, zMasterP
12070 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b  tr, nMasterPtr);
12080 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12090 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c  OsClose(pJournal
120a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
120b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
120c0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
120d0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
120e0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
120f0 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b   c = zMasterPtr[
12100 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28  0]!=0 && strcmp(
12110 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73  zMasterPtr, zMas
12120 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  ter)==0;.       
12130 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20   if( c ){.      
12140 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61      /* We have a
12150 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64   match. Do not d
12160 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
12170 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
12180 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  /.          goto
12190 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
121a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
121b0 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c  }.      zJournal
121c0 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c   += (sqlite3Strl
121d0 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31  en30(zJournal)+1
121e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  );.    }.  }.  .
121f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
12200 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
12210 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61  ster, 0);..delma
12220 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20  ster_out:.  if( 
12230 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
12240 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
12250 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ee(zMasterJourna
12260 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20  l);.  }  .  if( 
12270 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73  pMaster ){.    s
12280 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d  qlite3OsClose(pM
12290 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65  aster);.    asse
122a0 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75  rt( !isOpen(pJou
122b0 72 6e 61 6c 29 20 29 3b 0a 20 20 7d 0a 20 20 73  rnal) );.  }.  s
122c0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73  qlite3_free(pMas
122d0 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
122e0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
122f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
12300 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ed to change the
12310 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   actual size of 
12320 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
12330 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
12340 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f  e-system. This o
12350 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e  nly happens when
12360 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
12370 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72  ansaction,.** or
12380 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
12390 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63  transaction (inc
123a0 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62  luding rolling b
123b0 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
123c0 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  l)..**.** If the
123d0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
123e0 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c  ile is not open,
123f0 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65   or an exclusive
12400 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a 2a 2a 20   lock is not.** 
12410 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74  held, this funct
12420 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
12430 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 73  Otherwise, the s
12440 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
12450 69 73 0a 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f  is.** changed to
12460 20 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e 50   nPage pages (nP
12470 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  age*pPager->page
12480 53 69 7a 65 20 62 79 74 65 73 29 2e 20 49 66 20  Size bytes). If 
12490 74 68 65 20 66 69 6c 65 0a 2a 2a 20 6f 6e 20 64  the file.** on d
124a0 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79  isk is currently
124b0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61   larger than nPa
124c0 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75  ge pages, then u
124d0 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54  se the VFS.** xT
124e0 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64  runcate() method
124f0 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e   to truncate it.
12500 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69  .**.** Or, it mi
12510 67 68 74 20 6d 69 67 68 74 20 62 65 20 74 68 65  ght might be the
12520 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66   case that the f
12530 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73  ile on disk is s
12540 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20  maller than .** 
12550 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d  nPage pages. Som
12560 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
12570 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  em implementatio
12580 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75  ns can get confu
12590 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74  sed if .** you t
125a0 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61  ry to truncate a
125b0 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69   file to some si
125c0 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65  ze that is large
125d0 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75  r than it .** cu
125e0 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64  rrently is, so d
125f0 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20  etect this case 
12600 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67  and write a sing
12610 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20  le zero byte to 
12620 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74  .** the end of t
12630 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74  he new file inst
12640 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ead..**.** If su
12650 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
12660 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
12670 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
12680 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e  s while modifyin
12690 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  g.** the databas
126a0 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74  e file, return t
126b0 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  he error code to
126c0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
126d0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
126e0 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
126f0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
12700 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
12710 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
12720 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
12730 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
12740 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
12750 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 69 36  r->fd) ){.    i6
12760 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e  4 currentSize, n
12770 65 77 53 69 7a 65 3b 0a 20 20 20 20 2f 2a 20 54  ewSize;.    /* T
12780 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20  ODO: Is it safe 
12790 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62 46  to use Pager.dbF
127a0 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f  ileSize here? */
127b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
127c0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
127d0 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74  er->fd, &current
127e0 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69  Size);.    newSi
127f0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
12800 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65  eSize*(i64)nPage
12810 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
12820 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65  LITE_OK && curre
12830 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20  ntSize!=newSize 
12840 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75 72  ){.      if( cur
12850 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65  rentSize>newSize
12860 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
12870 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
12880 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e  te(pPager->fd, n
12890 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  ewSize);.      }
128a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
128b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
128c0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 22 22  e(pPager->fd, ""
128d0 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29 3b  , 1, newSize-1);
128e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
128f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12900 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
12910 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
12920 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a   nPage;.      }.
12930 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
12940 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12950 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Set the value of
12960 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   the Pager.secto
12970 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66  rSize variable f
12980 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
12990 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74  pager based on t
129a0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
129b0 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72  d by the xSector
129c0 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f  Size method.** o
129d0 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  f the open datab
129e0 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65  ase file. The se
129f0 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
12a00 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a 20  e used used .** 
12a10 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
12a20 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d   size and alignm
12a30 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  ent of journal h
12a40 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61  eader and .** ma
12a50 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
12a60 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72 65  nters within cre
12a70 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ated journal fil
12a80 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65  es..**.** For te
12a90 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68  mporary files th
12aa0 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
12ab0 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79  or size is alway
12ac0 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a  s 512 bytes..**.
12ad0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f  ** Otherwise, fo
12ae0 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20  r non-temporary 
12af0 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63  files, the effec
12b00 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
12b10 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   is.** the value
12b20 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
12b30 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d   xSectorSize() m
12b40 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70  ethod rounded up
12b50 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20   to 32 if.** it 
12b60 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c  is less than 32,
12b70 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e   or rounded down
12b80 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53   to MAX_SECTOR_S
12b90 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20  IZE if it.** is 
12ba0 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58  greater than MAX
12bb0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f  _SECTOR_SIZE..*/
12bc0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
12bd0 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72  SectorSize(Pager
12be0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
12bf0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
12c00 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
12c10 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a  r->tempFile );..
12c20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
12c30 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 2f  empFile ){.    /
12c40 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f  * Sector size do
12c50 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72  esn't matter for
12c60 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
12c70 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65  . Also, the file
12c80 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20  .    ** may not 
12c90 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
12ca0 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63   yet, in which c
12cb0 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72  ase the OsSector
12cc0 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61  Size().    ** ca
12cd0 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74  ll will segfault
12ce0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
12cf0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
12d00 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
12d10 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  rSize(pPager->fd
12d20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
12d30 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c  ger->sectorSize<
12d40 33 32 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  32 ){.    pPager
12d50 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35  ->sectorSize = 5
12d60 31 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  12;.  }.  if( pP
12d70 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
12d80 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
12d90 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
12da0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e  MAX_SECTOR_SIZE>
12db0 3d 35 31 32 20 29 3b 0a 20 20 20 20 70 50 61 67  =512 );.    pPag
12dc0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
12dd0 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
12de0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
12df0 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
12e00 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
12e10 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
12e20 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
12e30 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
12e40 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
12e50 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
12e60 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
12e70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
12e80 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
12e90 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38  : .**.**  (1)  8
12ea0 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41   byte prefix.  A
12eb0 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61   copy of aJourna
12ec0 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32  lMagic[]..**  (2
12ed0 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
12ee0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
12ef0 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
12f00 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72   of valid page r
12f10 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20  ecords.**       
12f20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
12f30 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
12f40 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
12f50 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  en compute the.*
12f60 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f  *       number o
12f70 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  f page records f
12f80 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
12f90 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34  size..**  (3)  4
12fa0 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
12fb0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
12fc0 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
12fd0 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  lue for the .** 
12fe0 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65        sanity che
12ff0 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20  cksum..**  (4)  
13000 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
13010 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
13020 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74  er of pages to t
13030 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20  runcate the.**  
13040 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f       database to
13050 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
13060 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62  ck..**  (5)  4 b
13070 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
13080 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
13090 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  the sector size.
130a0 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20    The header.** 
130b0 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61        is this ma
130c0 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ny bytes in size
130d0 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74  ..**  (6)  4 byt
130e0 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
130f0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
13100 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20  e page size..** 
13110 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69   (7)  zero paddi
13120 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65  ng out to the ne
13130 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a  xt sector size..
13140 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72  **  (8)  Zero or
13150 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
13160 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
13170 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
13180 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
13190 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
131a0 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
131b0 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
131c0 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
131d0 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
131e0 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
131f0 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
13200 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
13210 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
13220 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  7 items above..*
13230 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
13240 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
13250 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
13260 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 8th item..**.*
13270 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
13280 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
13290 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
132a0 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
132b0 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
132c0 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
132d0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
132e0 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
132f0 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
13300 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
13310 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
13320 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
13330 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
13340 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
13350 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
13360 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
13370 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
13380 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
13390 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
133a0 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
133b0 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
133c0 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
133d0 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
133e0 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
133f0 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
13400 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
13410 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
13420 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
13430 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
13440 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
13450 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
13460 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
13470 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
13480 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
13490 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
134a0 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
134b0 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
134c0 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
134d0 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
134e0 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
134f0 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
13500 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
13510 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
13520 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
13530 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
13540 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
13550 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
13560 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
13570 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
13580 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
13590 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
135a0 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
135b0 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
135c0 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
135d0 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
135e0 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
135f0 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
13600 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
13610 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
13620 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
13630 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
13640 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
13650 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
13660 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
13670 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
13680 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
13690 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
136a0 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
136b0 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
136c0 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
136d0 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
136e0 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
136f0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
13700 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
13710 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
13720 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
13730 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
13740 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
13750 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
13760 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
13770 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
13780 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
13790 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
137a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74  .**.** The isHot
137b0 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63   parameter indic
137c0 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72 65  ates that we are
137d0 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62   trying to rollb
137e0 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ack a journal.**
137f0 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 61   that might be a
13800 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f   hot journal.  O
13810 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  r, it could be t
13820 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
13830 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64  is .** preserved
13840 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52   because of JOUR
13850 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
13860 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  or JOURNALMODE_T
13870 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74  RUNCATE..** If t
13880 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c  he journal reall
13890 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20  y is hot, reset 
138a0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
138b0 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a  prior rolling.**
138c0 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e   back any conten
138d0 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  t.  If the journ
138e0 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72  al is merely per
138f0 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65  sistent, no rese
13900 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a  t is.** needed..
13910 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
13920 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  ger_playback(Pag
13930 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
13940 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65  isHot){.  sqlite
13950 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
13960 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36  ager->pVfs;.  i6
13970 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
13980 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
13990 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
139a0 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
139b0 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20   u32 nRec;      
139c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
139d0 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69  ber of Records i
139e0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
139f0 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
13a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
13a10 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
13a20 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  nter */.  Pgno m
13a30 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xPg = 0;        
13a40 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
13a50 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20  e original file 
13a60 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  in pages */.  in
13a70 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
13a80 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
13a90 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f   code of a subro
13aa0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
13ab0 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  es = 1;         
13ac0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
13ad0 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
13ae0 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20  OsAccess() */.  
13af0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
13b00 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  0;       /* Name
13b10 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
13b20 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a  al file if any *
13b30 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65  /.  int needPage
13b40 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  rReset;      /* 
13b50 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70 61  True to reset pa
13b60 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73  ge prior to firs
13b70 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20  t page rollback 
13b80 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
13b90 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
13ba0 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
13bb0 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20  journal.  Abort 
13bc0 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68  early if.  ** th
13bd0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70  e journal is emp
13be0 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ty..  */.  asser
13bf0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
13c00 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d  ->jfd) );.  rc =
13c10 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
13c20 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
13c30 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
13c40 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a  =SQLITE_OK || sz
13c50 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  J==0 ){.    goto
13c60 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
13c70 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
13c80 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
13c90 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a   name from the j
13ca0 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
13cb0 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49   present..  ** I
13cc0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
13cd0 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
13ce0 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74  specified, but t
13cf0 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20  he file is not. 
13d00 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64   ** present on d
13d10 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  isk, then the jo
13d20 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74  urnal is not hot
13d30 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65   and does not ne
13d40 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c  ed to be.  ** pl
13d50 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a  ayed back..  **.
13d60 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e    ** TODO: Techn
13d70 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  ically the follo
13d80 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72  wing is an error
13d90 20 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75   because it assu
13da0 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75  mes that.  ** bu
13db0 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53  ffer Pager.pTmpS
13dc0 70 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e  pace is (mxPathn
13dd0 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20  ame+1) bytes or 
13de0 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61  larger. i.e. tha
13df0 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e  t.  ** (pPager->
13e00 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67  pageSize >= pPag
13e10 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
13e20 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f  name+1). Using o
13e30 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20  s_unix.c,.  **  
13e40 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31  mxPathname is 51
13e50 32 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20  2, which is the 
13e60 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69  same as the mini
13e70 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61  mum allowable va
13e80 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67  lue.  ** for pag
13e90 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d  eSize..  */.  zM
13ea0 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  aster = pPager->
13eb0 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20  pTmpSpace;.  rc 
13ec0 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
13ed0 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
13ee0 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
13ef0 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
13f00 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d  me+1);.  if( rc=
13f10 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d  =SQLITE_OK && zM
13f20 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20  aster[0] ){.    
13f30 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
13f40 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
13f50 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
13f60 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b  S_EXISTS, &res);
13f70 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d  .  }.  zMaster =
13f80 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   0;.  if( rc!=SQ
13f90 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20  LITE_OK || !res 
13fa0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
13fb0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20  playback;.  }.  
13fc0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13fd0 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61  ff = 0;.  needPa
13fe0 67 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74  gerReset = isHot
13ff0 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  ;..  /* This loo
14000 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74  p terminates eit
14010 68 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a  her when a readJ
14020 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a  ournalHdr() or .
14030 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62    ** pager_playb
14040 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63  ack_one_page() c
14050 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49  all returns SQLI
14060 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f  TE_DONE or an IO
14070 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63   error .  ** occ
14080 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69  urs. .  */.  whi
14090 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20  le( 1 ){.    /* 
140a0 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f  Read the next jo
140b0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f  urnal header fro
140c0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
140d0 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  le.  If there ar
140e0 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f  e.    ** not eno
140f0 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69  ugh bytes left i
14100 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
14110 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74  le for a complet
14120 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20  e header, or.   
14130 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70   ** it is corrup
14140 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63  ted, then a proc
14150 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c  ess must of fail
14160 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
14170 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73   it..    ** This
14180 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69   indicates nothi
14190 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f  ng more needs to
141a0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
141b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
141c0 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
141d0 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20 73  pPager, isHot, s
141e0 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67  zJ, &nRec, &mxPg
141f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
14200 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20  QLITE_OK ){ .   
14210 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14220 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
14230 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
14240 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14250 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
14260 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
14270 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66   If nRec is 0xff
14280 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69  ffffff, then thi
14290 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72  s journal was cr
142a0 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
142b0 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e  ss.    ** workin
142c0 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  g in no-sync mod
142d0 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  e. This means th
142e0 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  at the rest of t
142f0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
14300 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20  * file consists 
14310 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20  of pages, there 
14320 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72  are no more jour
14330 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d  nal headers. Com
14340 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  pute.    ** the 
14350 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61  value of nRec ba
14360 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75  sed on this assu
14370 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mption..    */. 
14380 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66     if( nRec==0xf
14390 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20  fffffff ){.     
143a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
143b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
143c0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
143d0 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65  er) );.      nRe
143e0 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
143f0 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
14400 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c  pPager))/JOURNAL
14410 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
14420 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
14430 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20  f nRec is 0 and 
14440 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73  this rollback is
14450 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
14460 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69  n created by thi
14470 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  s.    ** process
14480 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20   and if this is 
14490 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72  the final header
144a0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   in the journal,
144b0 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20   then it means. 
144c0 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20     ** that this 
144d0 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  part of the jour
144e0 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69  nal was being fi
144f0 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74  lled but has not
14500 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a   yet been.    **
14510 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
14520 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75    Compute the nu
14530 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62 61  mber of pages ba
14540 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69  sed on the remai
14550 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65  ning.    ** size
14560 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   of the file..  
14570 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
14580 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68  third term of th
14590 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65 64  e test was added
145a0 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23   to fix ticket #
145b0 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65  2565..    ** Whe
145c0 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  n rolling back a
145d0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52   hot journal, nR
145e0 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65 61  ec==0 always mea
145f0 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ns that the next
14600 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66  .    ** chunk of
14610 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e   the journal con
14620 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65 73  tains zero pages
14630 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
14640 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20  ck.  But.    ** 
14650 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c  when doing a ROL
14660 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e 52  LBACK and the nR
14670 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20 74  ec==0 chunk is t
14680 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e  he last chunk in
14690 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  .    ** the jour
146a0 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  nal, it means th
146b0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  at the journal m
146c0 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64 64  ight contain add
146d0 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70  itional.    ** p
146e0 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  ages that need t
146f0 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
14700 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e 75   and that the nu
14710 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20  mber of pages . 
14720 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20     ** should be 
14730 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20 6f  computed based o
14740 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
14750 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  le size..    */.
14760 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20      if( nRec==0 
14770 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20  && !isHot &&.   
14780 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
14790 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
147a0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
147b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
147c0 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63  ff ){.      nRec
147d0 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20   = (int)((szJ - 
147e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
147f0 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47  ff) / JOURNAL_PG
14800 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
14810 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
14820 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
14830 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f   header read fro
14840 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  m the journal, t
14850 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20  runcate the.    
14860 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
14870 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
14880 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20  ginal size..    
14890 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
148a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
148b0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
148c0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
148d0 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
148e0 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29  te(pPager, mxPg)
148f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
14900 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14910 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
14920 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  ayback;.      }.
14930 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
14940 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20  Size = mxPg;.   
14950 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   }..    /* Copy 
14960 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
14970 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ut of the journa
14980 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
14990 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61  the .    ** data
149a0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72  base file and/or
149b0 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20 20   page cache..   
149c0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b   */.    for(u=0;
149d0 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20   u<nRec; u++){. 
149e0 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61 67       if( needPag
149f0 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20  erReset ){.     
14a00 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
14a10 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
14a20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d  needPagerReset =
14a30 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
14a40 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
14a50 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
14a60 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a  Pager,&pPager->j
14a70 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29  ournalOff,0,1,0)
14a80 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
14a90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14aa0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
14ab0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
14ac0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
14ad0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
14ae0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14af0 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20  ff = szJ;.      
14b00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14b10 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
14b20 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
14b30 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
14b40 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
14b50 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
14b60 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d 70   truncated, simp
14b70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20  ly stop reading 
14b80 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  and.          **
14b90 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20   processing the 
14ba0 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69  journal. This mi
14bb0 67 68 74 20 68 61 70 70 65 6e 20 69 66 20 74 68  ght happen if th
14bc0 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20  e journal was.  
14bd0 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63          ** not c
14be0 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74 65  ompletely writte
14bf0 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72 69  n and synced pri
14c00 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20 20  or to a crash.  
14c10 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  In that.        
14c20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20 64    ** case, the d
14c30 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 68  atabase should h
14c40 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20 77  ave never been w
14c50 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20 20  ritten in the.  
14c60 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74          ** first
14c70 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73 20   place so it is 
14c80 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62 61  OK to simply aba
14c90 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  ndon the rollbac
14ca0 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  k. */.          
14cb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14cc0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
14cd0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
14ce0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14cf0 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61        /* If we a
14d00 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c  re unable to rol
14d10 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64 20  lback, quit and 
14d20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
14d30 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
14d40 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63  de.  This will c
14d50 61 75 73 65 20 74 68 65 20 70 61 67 65 72 20 74  ause the pager t
14d60 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f  o enter the erro
14d70 72 20 73 74 61 74 65 0a 20 20 20 20 20 20 20 20  r state.        
14d80 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20    ** so that no 
14d90 66 75 72 74 68 65 72 20 68 61 72 6d 20 77 69 6c  further harm wil
14da0 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72 68  l be done.  Perh
14db0 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20 20  aps the next.   
14dc0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
14dd0 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20  s to come along 
14de0 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20  will be able to 
14df0 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61 74  rollback the dat
14e00 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20  abase..         
14e10 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f   */.          go
14e20 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
14e30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14e40 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
14e50 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20  *NOTREACHED*/.  
14e60 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e  assert( 0 );..en
14e70 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a  d_playback:.  /*
14e80 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c   Following a rol
14e90 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62  lback, the datab
14ea0 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
14eb0 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f  be back in its o
14ec0 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61  riginal.  ** sta
14ed0 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  te prior to the 
14ee0 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
14ef0 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76  nsaction, so inv
14f00 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c  oke the.  ** SQL
14f10 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
14f20 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74  HANGED file-cont
14f30 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69  rol method to di
14f40 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61  sable the.  ** a
14f50 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68  ssertion that th
14f60 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
14f70 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69  unter was modifi
14f80 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
14f90 74 28 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66  t(.    pPager->f
14fa0 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20 7c  d->pMethods==0 |
14fb0 7c 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  |.    sqlite3OsF
14fc0 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65  ileControl(pPage
14fd0 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e  r->fd,SQLITE_FCN
14fe0 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c  TL_DB_UNCHANGED,
14ff0 30 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  0)>=SQLITE_OK.  
15000 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
15010 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70   playback is hap
15020 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63  pening automatic
15030 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74  ally as a result
15040 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20   of an IO or .  
15050 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20  ** malloc error 
15060 74 68 61 74 20 6f 63 63 75 72 72 65 64 20 61 66  that occurred af
15070 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ter the change-c
15080 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
15090 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66  ed but .  ** bef
150a0 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
150b0 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65  ion was committe
150c0 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e  d, then the chan
150d0 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a  ge-counter .  **
150e0 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61   modification ma
150f0 79 20 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e  y just have been
15100 20 72 65 76 65 72 74 65 64 2e 20 49 66 20 74 68   reverted. If th
15110 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78  is happens in ex
15120 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f  clusive .  ** mo
15130 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75  de, then subsequ
15140 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent transactions
15150 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68   performed by th
15160 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c  e connection wil
15170 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74  l not.  ** updat
15180 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
15190 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69  nter at all. Thi
151a0 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61  s may lead to ca
151b0 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63  che inconsistenc
151c0 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20  y.  ** problems 
151d0 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73  for other proces
151e0 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e  ses at some poin
151f0 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  t in the future.
15200 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69   So, just.  ** i
15210 6e 20 63 61 73 65 20 74 68 69 73 20 68 61 73 20  n case this has 
15220 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20  happened, clear 
15230 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  the changeCountD
15240 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20  one flag now..  
15250 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  */.  pPager->cha
15260 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
15270 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
15280 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
15290 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61  TE_OK ){.    zMa
152a0 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
152b0 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63  TmpSpace;.    rc
152c0 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
152d0 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
152e0 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
152f0 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
15300 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74  ame+1);.    test
15310 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
15320 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
15330 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
15340 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  & pPager->noSync
15350 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ==0 && pPager->s
15360 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
15370 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72 63 20  USIVE ){.    rc 
15380 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
15390 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
153a0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
153b0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
153c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
153d0 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26 26  er->noSync==0 &&
153e0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
153f0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
15400 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
15410 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
15420 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  ->fd, pPager->sy
15430 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20  nc_flags);.  }. 
15440 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15450 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
15460 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
15470 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61  tion(pPager, zMa
15480 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a  ster[0]!='\0');.
15490 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
154a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
154b0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
154c0 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
154d0 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20  r[0] && res ){. 
154e0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
154f0 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  as a master jour
15500 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75  nal and this rou
15510 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
15520 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a   success,.    **
15530 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f   see if it is po
15540 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
15550 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
15560 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nal..    */.    
15570 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61  rc = pager_delma
15580 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61  ster(pPager, zMa
15590 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63  ster);.    testc
155a0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
155b0 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OK );.  }..  /* 
155c0 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  The Pager.sector
155d0 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
155e0 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61  y have been upda
155f0 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e  ted while rollin
15600 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f  g.  ** back a jo
15610 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79  urnal created by
15620 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20   a process with 
15630 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63 74  a different sect
15640 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c  or size.  ** val
15650 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20  ue. Reset it to 
15660 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75  the correct valu
15670 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
15680 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65  ss..  */.  setSe
15690 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
156a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
156b0 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  .../*.** Read th
156c0 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61  e content for pa
156d0 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68  ge pPg out of th
156e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
156f0 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67  and into .** pPg
15700 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72 65  ->pData. A share
15710 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65  d lock or greate
15720 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f  r must be held o
15730 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  n the database.*
15740 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  * file before th
15750 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
15760 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
15770 70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c 20  page 1 is read, 
15780 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  then the value o
15790 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  f Pager.dbFileVe
157a0 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a  rs[] is set to.*
157b0 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  * the value read
157c0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
157d0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
157e0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
157f0 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49  curs, then the I
15800 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  O error is retur
15810 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
15820 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  r..** Otherwise,
15830 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
15840 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
15850 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65  c int readDbPage
15860 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
15870 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
15880 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20  pPg->pPager; /* 
15890 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73  Pager object ass
158a0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67  ociated with pag
158b0 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  e pPg */.  Pgno 
158c0 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  pgno = pPg->pgno
158d0 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20  ;       /* Page 
158e0 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a  number to read *
158f0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
15900 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
15910 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
15920 2a 2f 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74  */.  i64 iOffset
15930 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15940 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
15950 20 6f 66 20 66 69 6c 65 20 74 6f 20 72 65 61 64   of file to read
15960 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
15970 73 49 6e 4c 6f 67 20 3d 20 30 3b 20 20 20 20 20  sInLog = 0;     
15980 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
15990 69 66 20 70 61 67 65 20 69 73 20 69 6e 20 6c 6f  if page is in lo
159a0 67 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73  g file */..  ass
159b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
159c0 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
159d0 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   && !MEMDB );.  
159e0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
159f0 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20  Pager->fd) );.. 
15a00 20 69 66 28 20 4e 45 56 45 52 28 21 69 73 4f 70   if( NEVER(!isOp
15a10 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20  en(pPager->fd)) 
15a20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
15a30 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
15a40 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50  );.    memset(pP
15a50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61  g->pData, 0, pPa
15a60 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
15a70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15a80 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  E_OK;.  }..  if(
15a90 20 70 61 67 65 72 55 73 65 4c 6f 67 28 70 50 61   pagerUseLog(pPa
15aa0 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ger) ){.    /* T
15ab0 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20 70  ry to pull the p
15ac0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72 69  age from the wri
15ad0 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f  te-ahead log. */
15ae0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15af0 33 4c 6f 67 52 65 61 64 28 70 50 61 67 65 72 2d  3LogRead(pPager-
15b00 3e 70 4c 6f 67 2c 20 70 67 6e 6f 2c 20 26 69 73  >pLog, pgno, &is
15b10 49 6e 4c 6f 67 2c 20 70 50 67 2d 3e 70 44 61 74  InLog, pPg->pDat
15b20 61 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  a);.  }.  if( rc
15b30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
15b40 69 73 49 6e 4c 6f 67 20 29 7b 0a 20 20 20 20 69  isInLog ){.    i
15b50 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  Offset = (pgno-1
15b60 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
15b70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  ageSize;.    rc 
15b80 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
15b90 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d  pPager->fd, pPg-
15ba0 3e 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  >pData, pPager->
15bb0 70 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 73 65  pageSize, iOffse
15bc0 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
15bd0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
15be0 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
15bf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15c00 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
15c10 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
15c20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
15c30 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64 20   /* If the read 
15c40 69 73 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c  is unsuccessful,
15c50 20 73 65 74 20 74 68 65 20 64 62 46 69 6c 65 56   set the dbFileV
15c60 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69  ers[] to somethi
15c70 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ng.      ** that
15c80 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61   will never be a
15c90 20 76 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73   valid file vers
15ca0 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73  ion.  dbFileVers
15cb0 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20  [] is a copy.   
15cc0 20 20 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32     ** of bytes 2
15cd0 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74  4..39 of the dat
15ce0 61 62 61 73 65 2e 20 20 42 79 74 65 73 20 32 38  abase.  Bytes 28
15cf0 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61  ..31 should alwa
15d00 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a  ys be.      ** z
15d10 65 72 6f 2e 20 20 42 79 74 65 73 20 33 32 2e 2e  ero.  Bytes 32..
15d20 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 20 73 68  35 and 35..39 sh
15d30 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d  ould be page num
15d40 62 65 72 73 20 77 68 69 63 68 20 61 72 65 0a 20  bers which are. 
15d50 20 20 20 20 20 2a 2a 20 6e 65 76 65 72 20 30 78       ** never 0x
15d60 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69  ffffffff.  So fi
15d70 6c 6c 69 6e 67 20 70 50 61 67 65 72 2d 3e 64 62  lling pPager->db
15d80 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20  FileVers[] with 
15d90 61 6c 6c 20 30 78 66 66 0a 20 20 20 20 20 20 2a  all 0xff.      *
15da0 2a 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73  * bytes should s
15db0 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a  uffice..      **
15dc0 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e  .      ** For an
15dd0 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62   encrypted datab
15de0 61 73 65 2c 20 74 68 65 20 73 69 74 75 61 74 69  ase, the situati
15df0 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c  on is more compl
15e00 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20  ex:  bytes.     
15e10 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68   ** 24..39 of th
15e20 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  e database are w
15e30 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74  hite noise.  But
15e40 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
15e50 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69   of.      ** whi
15e60 74 65 20 6e 6f 69 73 69 6e 67 20 65 71 75 61 6c  te noising equal
15e70 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66 20  ing 16 bytes of 
15e80 30 78 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e  0xff is vanishin
15e90 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20  gly small so.   
15ea0 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20     ** we should 
15eb0 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20  still be ok..   
15ec0 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73     */.      mems
15ed0 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  et(pPager->dbFil
15ee0 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a  eVers, 0xff, siz
15ef0 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
15f00 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65  leVers));.    }e
15f10 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64  lse{.      u8 *d
15f20 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75  bFileVers = &((u
15f30 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32  8*)pPg->pData)[2
15f40 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  4];.      memcpy
15f50 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
15f60 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
15f70 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
15f80 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
15f90 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43     }.  }.  CODEC
15fa0 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  1(pPager, pPg->p
15fb0 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
15fc0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
15fd0 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  );..  PAGER_INCR
15fe0 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72  (sqlite3_pager_r
15ff0 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  eaddb_count);.  
16000 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
16010 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54  r->nRead);.  IOT
16020 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25  RACE(("PGIN %p %
16030 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
16040 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41  no));.  PAGERTRA
16050 43 45 28 28 22 46 45 54 43 48 20 25 64 20 70 61  CE(("FETCH %d pa
16060 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
16070 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
16080 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
16090 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
160a0 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29  _pagehash(pPg)))
160b0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
160c0 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  }..static int pa
160d0 67 65 72 52 6f 6c 6c 62 61 63 6b 4c 6f 67 28 50  gerRollbackLog(P
160e0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
160f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16100 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70 4c  _OK;.  PgHdr *pL
16110 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ist = sqlite3Pca
16120 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
16130 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
16140 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
16150 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  = pPager->dbOrig
16160 53 69 7a 65 3b 0a 20 20 77 68 69 6c 65 28 20 70  Size;.  while( p
16170 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49  List && rc==SQLI
16180 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48  TE_OK ){.    PgH
16190 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73  dr *pNext = pLis
161a0 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 69  t->pDirty;.    i
161b0 66 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  f( sqlite3Pcache
161c0 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4c 69  PageRefcount(pLi
161d0 73 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  st)==0 ){.      
161e0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
161f0 75 70 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74  up(pPager, pList
16200 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 73  ->pgno);.      s
16210 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
16220 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c  (pList);.    }el
16230 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  se{.      rc = r
16240 65 61 64 44 62 50 61 67 65 28 70 4c 69 73 74 29  eadDbPage(pList)
16250 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
16260 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16270 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
16280 69 6e 69 74 65 72 28 70 4c 69 73 74 29 3b 0a 20  initer(pList);. 
16290 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
162a0 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a   pList = pNext;.
162b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
162c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
162d0 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61  ck savepoint pSa
162e0 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20  vepoint. Or, if 
162f0 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c  pSavepoint==NULL
16300 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a  , then playback.
16310 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ** the entire ma
16320 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
16330 65 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76  e. The case pSav
16340 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63  epoint==NULL occ
16350 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52  urs when .** a R
16360 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61  OLLBACK TO comma
16370 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  nd is invoked on
16380 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61   a SAVEPOINT tha
16390 74 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  t is a transacti
163a0 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  on .** savepoint
163b0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61  ..**.** When pSa
163c0 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e  vepoint is not N
163d0 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e  ULL (meaning a n
163e0 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  on-transaction s
163f0 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20  avepoint is .** 
16400 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
16410 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  k), then the rol
16420 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f  lback consists o
16430 66 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74  f up to three st
16440 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d  ages,.** perform
16450 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
16460 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a  specified:.**.**
16470 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70     * Pages are p
16480 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
16490 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
164a0 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74   starting at byt
164b0 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20  e.**     offset 
164c0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
164d0 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69  Offset and conti
164e0 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20  nuing to .**    
164f0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
16500 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74  iHdrOffset, or t
16510 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
16520 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   main journal.**
16530 20 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67       file if Pag
16540 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
16550 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a  Offset is zero..
16560 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67  **.**   * If Pag
16570 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
16580 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65  Offset is not ze
16590 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  ro, then pages a
165a0 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20  re played.**    
165b0 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66   back starting f
165c0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
165d0 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65  header immediate
165e0 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a  ly following .**
165f0 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
16600 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74  int.iHdrOffset t
16610 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
16620 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
16630 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61  le..**.**   * Pa
16640 67 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61  ges are then pla
16650 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
16660 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  e sub-journal fi
16670 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20  le, starting.** 
16680 20 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67      with the Pag
16690 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62  erSavepoint.iSub
166a0 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  Rec and continui
166b0 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ng to the end of
166c0 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72  .**     the jour
166d0 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
166e0 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72  Throughout the r
166f0 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c  ollback process,
16700 20 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67   each time a pag
16710 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  e is rolled back
16720 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70  , the.** corresp
16730 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
16740 74 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74  t in a bitvec st
16750 72 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c  ructure (variabl
16760 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a  e pDone in the.*
16770 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
16780 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73   below). This is
16790 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
167a0 74 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f  that a page is o
167b0 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61  nly.** rolled ba
167c0 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
167d0 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65  e it is encounte
167e0 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f  red in either jo
167f0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
16800 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55  pSavepoint is NU
16810 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  LL, then pages a
16820 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62  re only played b
16830 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
16840 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  n.** journal fil
16850 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  e. There is no n
16860 65 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63  eed for a bitvec
16870 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
16880 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63  *.** In either c
16890 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79  ase, before play
168a0 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74  back commences t
168b0 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20  he Pager.dbSize 
168c0 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72  variable.** is r
168d0 65 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75  eset to the valu
168e0 65 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61  e that it held a
168f0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
16900 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a  he savepoint .**
16910 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e   (or transaction
16920 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20  ). No page with 
16930 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72  a page-number gr
16940 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20  eater than this 
16950 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79  value.** is play
16960 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20  ed back. If one 
16970 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
16980 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70  t is simply skip
16990 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ped..*/.static i
169a0 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  nt pagerPlayback
169b0 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
169c0 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61  *pPager, PagerSa
169d0 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f  vepoint *pSavepo
169e0 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b  int){.  i64 szJ;
169f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a00 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69   /* Effective si
16a10 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ze of the main j
16a20 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
16a30 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
16a40 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66       /* End of f
16a50 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20  irst segment of 
16a60 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63  main-journal rec
16a70 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ords */.  int rc
16a80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
16a90 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
16aa0 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
16ab0 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Done = 0;       
16ac0 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73  /* Bitvec to ens
16ad0 75 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64  ure pages played
16ae0 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20   back only once 
16af0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
16b00 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
16b10 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20  ER_SHARED );..  
16b20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69  /* Allocate a bi
16b30 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73  tvec to use to s
16b40 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20  tore the set of 
16b50 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
16b60 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65  k */.  if( pSave
16b70 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f  point ){.    pDo
16b80 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  ne = sqlite3Bitv
16b90 65 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f  ecCreate(pSavepo
16ba0 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20  int->nOrig);.   
16bb0 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20   if( !pDone ){. 
16bc0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16bd0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
16be0 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
16bf0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
16c00 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75  back to the valu
16c10 65 20 69 74 20 77 61 73 20 62 65 66 6f 72 65 20  e it was before 
16c20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20  the savepoint . 
16c30 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74   ** being revert
16c40 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20  ed was opened.. 
16c50 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
16c60 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e  Size = pSavepoin
16c70 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
16c80 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e  nOrig : pPager->
16c90 64 62 4f 72 69 67 53 69 7a 65 3b 0a 0a 20 20 69  dbOrigSize;..  i
16ca0 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20 26  f( !pSavepoint &
16cb0 26 20 70 61 67 65 72 55 73 65 4c 6f 67 28 70 50  & pagerUseLog(pP
16cc0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74  ager) ){.    ret
16cd0 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  urn pagerRollbac
16ce0 6b 4c 6f 67 28 70 50 61 67 65 72 29 3b 0a 20 20  kLog(pPager);.  
16cf0 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67  }..  /* Use pPag
16d00 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61  er->journalOff a
16d10 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  s the effective 
16d20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e  size of the main
16d30 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a   rollback.  ** j
16d40 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74  ournal.  The act
16d50 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62  ual file might b
16d60 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  e larger than th
16d70 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52  is in.  ** PAGER
16d80 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
16d90 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a  NCATE or PAGER_J
16da0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
16db0 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e  ST.  But anythin
16dc0 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67  g.  ** past pPag
16dd0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69  er->journalOff i
16de0 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20  s off-limits to 
16df0 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d  us..  */.  szJ =
16e00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
16e10 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Off;.  assert( p
16e20 61 67 65 72 55 73 65 4c 6f 67 28 70 50 61 67 65  agerUseLog(pPage
16e30 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20  r)==0 || szJ==0 
16e40 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62  );..  /* Begin b
16e50 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72  y rolling back r
16e60 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
16e70 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
16e80 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61  rting at.  ** Pa
16e90 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66  gerSavepoint.iOf
16ea0 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75  fset and continu
16eb0 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ing to the next 
16ec0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
16ed0 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74    ** There might
16ee0 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74   be records in t
16ef0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
16f00 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67 65  that have a page
16f10 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65   number.  ** gre
16f20 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ater than the cu
16f30 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 73  rrent database s
16f40 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53  ize (pPager->dbS
16f50 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20  ize) but those. 
16f60 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70   ** will be skip
16f70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ped automaticall
16f80 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61 64  y.  Pages are ad
16f90 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20  ded to pDone as 
16fa0 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c  they.  ** are pl
16fb0 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a  ayed back..  */.
16fc0 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
16fd0 20 26 26 20 21 70 61 67 65 72 55 73 65 4c 6f 67   && !pagerUseLog
16fe0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
16ff0 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70  iHdrOff = pSavep
17000 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74  oint->iHdrOffset
17010 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   ? pSavepoint->i
17020 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b  HdrOffset : szJ;
17030 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
17040 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70  rnalOff = pSavep
17050 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20  oint->iOffset;. 
17060 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
17070 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
17080 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48  r->journalOff<iH
17090 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72  drOff ){.      r
170a0 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
170b0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
170c0 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75  er, &pPager->jou
170d0 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20  rnalOff, pDone, 
170e0 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 1);.    }.   
170f0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
17100 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65  ITE_DONE );.  }e
17110 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
17120 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
17130 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69  .  }..  /* Conti
17140 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  nue rolling back
17150 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66 20   records out of 
17160 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
17170 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a   starting at.  *
17180 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  * the first jour
17190 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e 20  nal header seen 
171a0 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75  and continuing u
171b0 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63 74 69  ntil the effecti
171c0 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74  ve end.  ** of t
171d0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
171e0 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20  file.  Continue 
171f0 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72  to skip out-of-r
17200 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a 20  ange pages and. 
17210 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64 64   ** continue add
17220 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65 64  ing pages rolled
17230 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a   back to pDone..
17240 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63    */.  while( rc
17250 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
17260 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
17270 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32  f<szJ ){.    u32
17280 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
17290 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
172a0 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63  */.    u32 nJRec
172b0 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d   = 0;     /* Num
172c0 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52  ber of Journal R
172d0 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33  ecords */.    u3
172e0 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20  2 dummy;.    rc 
172f0 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
17300 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c  (pPager, 0, szJ,
17310 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29   &nJRec, &dummy)
17320 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
17330 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
17340 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
17350 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75  The "pPager->jou
17360 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
17370 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
17380 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
17390 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74 20  ff".    ** test 
173a0 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74 69  is related to ti
173b0 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65 65  cket #2565.  See
173c0 20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20   the discussion 
173d0 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61  in the.    ** pa
173e0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 66  ger_playback() f
173f0 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69  unction for addi
17400 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
17410 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
17420 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20  f( nJRec==0 .   
17430 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
17440 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
17450 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
17460 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
17470 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ff.    ){.      
17480 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28 73  nJRec = (u32)((s
17490 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
174a0 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c  rnalOff)/JOURNAL
174b0 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
174c0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
174d0 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
174e0 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26  OK && ii<nJRec &
174f0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
17500 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b  lOff<szJ; ii++){
17510 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
17520 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
17530 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61  age(pPager, &pPa
17540 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
17550 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20   pDone, 1, 1);. 
17560 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
17570 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
17580 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
17590 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
175a0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
175b0 61 6c 4f 66 66 3d 3d 73 7a 4a 20 29 3b 0a 0a 20  alOff==szJ );.. 
175c0 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f   /* Finally,  ro
175d0 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f  llback pages fro
175e0 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
175f0 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20 77 65  l.  Page that we
17600 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73  re.  ** previous
17610 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f  ly rolled back o
17620 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ut of the main j
17630 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20  ournal (and are 
17640 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a  hence in pDone).
17650 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
17660 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61  pped.  Out-of-ra
17670 6e 67 65 20 70 61 67 65 73 20 61 72 65 20 61 6c  nge pages are al
17680 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  so skipped..  */
17690 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
176a0 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b  t ){.    u32 ii;
176b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
176c0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
176d0 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
176e0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62  pSavepoint->iSub
176f0 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  Rec*(4+pPager->p
17700 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 66 6f  ageSize);.    fo
17710 72 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d  r(ii=pSavepoint-
17720 3e 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51  >iSubRec; rc==SQ
17730 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50  LITE_OK && ii<pP
17740 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69  ager->nSubRec; i
17750 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
17760 72 74 28 20 6f 66 66 73 65 74 3d 3d 69 69 2a 28  rt( offset==ii*(
17770 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
17780 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ze) );.      rc 
17790 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
177a0 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
177b0 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65  , &offset, pDone
177c0 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 1);.    }. 
177d0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
177e0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
177f0 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  }..  sqlite3Bitv
17800 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65 29  ecDestroy(pDone)
17810 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
17820 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
17830 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
17840 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 72 65 74  = szJ;.  }.  ret
17850 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17860 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
17870 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  mum number of in
17880 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68  -memory pages th
17890 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  at are allowed..
178a0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
178b0 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
178c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
178d0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73  int mxPage){.  s
178e0 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 43  qlite3PcacheSetC
178f0 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d  achesize(pPager-
17900 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65  >pPCache, mxPage
17910 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75  );.}../*.** Adju
17920 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73  st the robustnes
17930 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
17940 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20  e to damage due 
17950 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a  to OS crashes.**
17960 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
17970 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74  es by changing t
17980 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e  he number of syn
17990 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69  cs()s when writi
179a0 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  ng.** the rollba
179b0 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  ck journal.  The
179c0 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76  re are three lev
179d0 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46  els:.**.**    OF
179e0 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  F       sqlite3O
179f0 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72  sSync() is never
17a00 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69   called.  This i
17a10 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a  s the default.**
17a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
17a30 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20  r temporary and 
17a40 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e  transient files.
17a50 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c  .**.**    NORMAL
17a60 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
17a70 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62  is synced once b
17a80 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
17a90 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
17aa0 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
17ab0 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  se.  This is nor
17ac0 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70  mally adequate p
17ad0 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a  rotection, but.*
17ae0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
17af0 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c  t is theoretical
17b00 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f  ly possible, tho
17b10 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c  ugh very unlikel
17b20 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  y,.**           
17b30 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65     that an inope
17b40 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c  rtune power fail
17b50 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20  ure could leave 
17b60 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  the journal.**  
17b70 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61              in a
17b80 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75   state which wou
17b90 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20  ld cause damage 
17ba0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
17bb0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
17bc0 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65  when it is rolle
17bd0 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
17be0 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a   FULL      The j
17bf0 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
17c00 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72   twice before wr
17c10 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
17c20 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
17c30 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68    database (with
17c40 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
17c50 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74   information - t
17c60 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a  he nRec field.**
17c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
17c80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
17c90 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74  der - being writ
17ca0 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74  ten in between t
17cb0 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20  he two.**       
17cc0 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20         syncs).  
17cd0 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61  If we assume tha
17ce0 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20  t writing a.**  
17cf0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67              sing
17d00 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69  le disk sector i
17d10 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74  s atomic, then t
17d20 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65  his mode provide
17d30 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
17d40 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74    assurance that
17d50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c   the journal wil
17d60 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  l not be corrupt
17d70 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  ed to the.**    
17d80 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20            point 
17d90 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67  of causing damag
17da0 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
17db0 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
17dc0 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63  k..**.** Numeric
17dd0 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74   values associat
17de0 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74  ed with these st
17df0 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c  ates are OFF==1,
17e00 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e   NORMAL=2,.** an
17e10 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66  d FULL=3..*/.#if
17e20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17e30 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76  _PAGER_PRAGMAS.v
17e40 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
17e50 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 50  SetSafetyLevel(P
17e60 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
17e70 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 62 46 75  t level, int bFu
17e80 6c 6c 46 73 79 6e 63 29 7b 0a 20 20 70 50 61 67  llFsync){.  pPag
17e90 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c  er->noSync =  (l
17ea0 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65  evel==1 || pPage
17eb0 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a  r->tempFile) ?1:
17ec0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  0;.  pPager->ful
17ed0 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d  lSync = (level==
17ee0 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  3 && !pPager->te
17ef0 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20  mpFile) ?1:0;.  
17f00 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
17f10 67 73 20 3d 20 28 62 46 75 6c 6c 46 73 79 6e 63  gs = (bFullFsync
17f20 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  ?SQLITE_SYNC_FUL
17f30 4c 3a 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  L:SQLITE_SYNC_NO
17f40 52 4d 41 4c 29 3b 0a 20 20 69 66 28 20 70 50 61  RMAL);.  if( pPa
17f50 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50  ger->noSync ) pP
17f60 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
17f70 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
17f80 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
17f90 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
17fa0 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  e is incremented
17fb0 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69   whenever the li
17fc0 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74  brary.** attempt
17fd0 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  s to open a temp
17fe0 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69  orary file.  Thi
17ff0 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
18000 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   used for.** tes
18010 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
18020 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66  s only.  .*/.#if
18030 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
18040 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
18050 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  temp_count = 0;.
18060 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70  #endif../*.** Op
18070 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
18080 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  ile..**.** Write
18090 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
180a0 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65  ptor into *pFile
180b0 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
180c0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a  OK on success .*
180d0 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
180e0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
180f0 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69   fail. The OS wi
18100 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
18110 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20   .** delete the 
18120 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77  temporary file w
18130 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
18140 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
18150 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
18160 56 46 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28  VFS layer xOpen(
18170 29 20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65  ) call are those
18180 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79   specified.** by
18190 20 70 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c   parameter vfsFl
181a0 61 67 73 20 4f 52 65 64 20 77 69 74 68 20 74 68  ags ORed with th
181b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
181c0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
181d0 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20  EN_READWRITE.** 
181e0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
181f0 43 52 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51  CREATE.**     SQ
18200 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
18210 49 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  IVE.**     SQLIT
18220 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
18230 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LOSE.*/.static i
18240 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70  nt pagerOpentemp
18250 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
18260 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  r,        /* The
18270 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   pager object */
18280 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
18290 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74  *pFile,  /* Writ
182a0 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
182b0 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20  iptor here */.  
182c0 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20  int vfsFlags    
182d0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
182e0 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
182f0 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20   the VFS */.){. 
18300 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
18310 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
18320 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66   code */..#ifdef
18330 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
18340 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
18350 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65  count++;  /* Use
18360 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
18370 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20  d analysis only 
18380 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73  */.#endif..  vfs
18390 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45  Flags |=  SQLITE
183a0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
183b0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
183c0 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  EATE |.         
183d0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
183e0 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54  XCLUSIVE | SQLIT
183f0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
18400 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c  LOSE;.  rc = sql
18410 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65  ite3OsOpen(pPage
18420 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c  r->pVfs, 0, pFil
18430 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b  e, vfsFlags, 0);
18440 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
18450 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
18460 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72  en(pFile) );.  r
18470 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
18480 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20  ** Set the busy 
18490 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
184a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
184b0 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75  r invokes the bu
184c0 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71  sy-handler if sq
184d0 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65  lite3OsLock() re
184e0 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
184f0 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e  _BUSY when tryin
18500 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  g to upgrade fro
18510 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53  m no-lock to a S
18520 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f  HARED lock,.** o
18530 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f  r when trying to
18540 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20   upgrade from a 
18550 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f  RESERVED lock to
18560 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a   an EXCLUSIVE .*
18570 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20  * lock. It does 
18580 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65  *not* invoke the
18590 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68   busy handler wh
185a0 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f  en upgrading fro
185b0 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52  m.** SHARED to R
185c0 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e  ESERVED, or when
185d0 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20   upgrading from 
185e0 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53  SHARED to EXCLUS
185f0 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63  IVE.** (which oc
18600 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d  curs during hot-
18610 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
18620 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a  ). Summary:.**.*
18630 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20  *   Transition  
18640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18650 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20        | Invokes 
18660 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20  xBusyHandler.** 
18670 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
18680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
186a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
186b0 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e  NO_LOCK       ->
186c0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20   SHARED_LOCK    
186d0 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41    | Yes.**   SHA
186e0 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45  RED_LOCK   -> RE
186f0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c  SERVED_LOCK    |
18700 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f   No.**   SHARED_
18710 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53  LOCK   -> EXCLUS
18720 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a  IVE_LOCK   | No.
18730 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f  **   RESERVED_LO
18740 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f  CK -> EXCLUSIVE_
18750 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a  LOCK   | Yes.**.
18760 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79 2d 68  ** If the busy-h
18770 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
18780 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
18790 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a  , the lock is .*
187a0 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20 69 74  * retried. If it
187b0 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74   returns zero, t
187c0 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42  hen the SQLITE_B
187d0 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20  USY error is.** 
187e0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
187f0 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61  caller of the pa
18800 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ger API function
18810 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
18820 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
18830 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70  dler(.  Pager *p
18840 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
18850 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18860 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
18870 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e    int (*xBusyHan
18880 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20  dler)(void *),  
18890 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
188a0 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65  r to busy-handle
188b0 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  r function */.  
188c0 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
188d0 65 72 41 72 67 20 20 20 20 20 20 20 20 20 20 20  erArg           
188e0 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
188f0 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73   to pass to xBus
18900 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20 20  yHandler */.){  
18910 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  .  pPager->xBusy
18920 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48  Handler = xBusyH
18930 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72  andler;.  pPager
18940 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
18950 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72  g = pBusyHandler
18960 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Arg;.}../*.** Re
18970 70 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e 74  port the current
18980 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 6e   page size and n
18990 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
189a0 64 20 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20  d bytes back.** 
189b0 74 6f 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f  to the codec..*/
189c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
189d0 41 53 5f 43 4f 44 45 43 0a 73 74 61 74 69 63 20  AS_CODEC.static 
189e0 76 6f 69 64 20 70 61 67 65 72 52 65 70 6f 72 74  void pagerReport
189f0 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
18a00 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
18a10 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e  r->xCodecSizeChn
18a20 67 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  g ){.    pPager-
18a30 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 28  >xCodecSizeChng(
18a40 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20  pPager->pCodec, 
18a50 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
18a60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18a70 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
18a80 74 29 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72  t)pPager->nReser
18a90 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  ve);.  }.}.#else
18aa0 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 52  .# define pagerR
18ab0 65 70 6f 72 74 53 69 7a 65 28 58 29 20 20 20 20  eportSize(X)    
18ac0 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20   /* No-op if we 
18ad0 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61  do not support a
18ae0 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66   codec */.#endif
18af0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
18b00 68 65 20 70 61 67 65 20 73 69 7a 65 20 75 73 65  he page size use
18b10 64 20 62 79 20 74 68 65 20 50 61 67 65 72 20 6f  d by the Pager o
18b20 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70  bject. The new p
18b30 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20  age size .** is 
18b40 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65  passed in *pPage
18b50 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Size..**.** If t
18b60 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
18b70 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 77  he error state w
18b80 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
18b90 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a  n is called, it.
18ba0 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54  ** is a no-op. T
18bb0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
18bc0 64 20 69 73 20 74 68 65 20 65 72 72 6f 72 20 73  d is the error s
18bd0 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  tate error code 
18be0 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66  (i.e. .** one of
18bf0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53   SQLITE_IOERR, S
18c00 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 6f 72  QLITE_CORRUPT or
18c10 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a   SQLITE_FULL)..*
18c20 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
18c30 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
18c40 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
18c50 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20  :.**.**   * the 
18c60 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 28 76  new page size (v
18c70 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69  alue of *pPageSi
18c80 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28 61 20  ze) is valid (a 
18c90 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66  power .**     of
18ca0 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32   two between 512
18cb0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f   and SQLITE_MAX_
18cc0 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75  PAGE_SIZE, inclu
18cd0 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  sive), and.**.**
18ce0 20 20 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e     * there are n
18cf0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  o outstanding pa
18d00 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61  ge references, a
18d10 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  nd.**.**   * the
18d20 20 64 61 74 61 62 61 73 65 20 69 73 20 65 69 74   database is eit
18d30 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65  her not an in-me
18d40 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 6f 72  mory database or
18d50 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e   it is.**     an
18d60 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
18d70 61 73 65 20 74 68 61 74 20 63 75 72 72 65 6e 74  ase that current
18d80 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a  ly consists of z
18d90 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a  ero pages..**.**
18da0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   then the pager 
18db0 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65  object page size
18dc0 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67   is set to *pPag
18dd0 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eSize..**.** If 
18de0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
18df0 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74   changed, then t
18e00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65  his function use
18e10 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  s sqlite3PagerMa
18e20 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62  lloc() .** to ob
18e30 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72  tain a new Pager
18e40 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65  .pTmpSpace buffe
18e50 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63  r. If this alloc
18e60 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a  ation attempt .*
18e70 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f  * fails, SQLITE_
18e80 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
18e90 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 73  d and the page s
18ea0 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68  ize remains unch
18eb0 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c  anged. .** In al
18ec0 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53  l other cases, S
18ed0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
18ee0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
18ef0 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
18f00 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74  not changed, eit
18f10 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20  her because one 
18f20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65  of the enumerate
18f30 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20  d.** conditions 
18f40 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75  above is not tru
18f50 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 61 73  e, the pager was
18f60 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   in error state 
18f70 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e  when this.** fun
18f80 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
18f90 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  , or because the
18fa0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
18fb0 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65  on attempt faile
18fc0 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61  d, .** then *pPa
18fd0 67 65 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  geSize is set to
18fe0 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e   the old, retain
18ff0 65 64 20 70 61 67 65 20 73 69 7a 65 20 62 65 66  ed page size bef
19000 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
19010 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
19020 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61  erSetPagesize(Pa
19030 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75 31 36  ger *pPager, u16
19040 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74   *pPageSize, int
19050 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e   nReserve){.  in
19060 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65  t rc = pPager->e
19070 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 72  rrCode;..  if( r
19080 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19090 20 20 20 20 75 31 36 20 70 61 67 65 53 69 7a 65      u16 pageSize
190a0 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20   = *pPageSize;. 
190b0 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53     assert( pageS
190c0 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53  ize==0 || (pageS
190d0 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65  ize>=512 && page
190e0 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
190f0 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20  _PAGE_SIZE) );. 
19100 20 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e     if( (pPager->
19110 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67  memDb==0 || pPag
19120 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20  er->dbSize==0). 
19130 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63      && sqlite3Pc
19140 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
19150 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
19160 20 0a 20 20 20 20 20 26 26 20 70 61 67 65 53 69   .     && pageSi
19170 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d  ze && pageSize!=
19180 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
19190 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63   .    ){.      c
191a0 68 61 72 20 2a 70 4e 65 77 20 3d 20 28 63 68 61  har *pNew = (cha
191b0 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d  r *)sqlite3PageM
191c0 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b  alloc(pageSize);
191d0 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77  .      if( !pNew
191e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
191f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
19200 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19210 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
19220 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
19230 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
19240 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
19250 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
19260 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54  eFree(pPager->pT
19270 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20  mpSpace);.      
19280 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70    pPager->pTmpSp
19290 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ace = pNew;.    
192a0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
192b0 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 50 61  eSetPageSize(pPa
192c0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
192d0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
192e0 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 50 61 67  .    }.    *pPag
192f0 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70 50 61  eSize = (u16)pPa
19300 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
19310 20 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c     if( nReserve<
19320 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70  0 ) nReserve = p
19330 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b  Pager->nReserve;
19340 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65  .    assert( nRe
19350 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73  serve>=0 && nRes
19360 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20  erve<1000 );.   
19370 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
19380 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76  e = (i16)nReserv
19390 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f  e;.    pagerRepo
193a0 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  rtSize(pPager);.
193b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
193c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
193d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
193e0 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67  e "temporary pag
193f0 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69  e" buffer held i
19400 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20  nternally.** by 
19410 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73  the pager.  This
19420 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61   is a buffer tha
19430 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20  t is big enough 
19440 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65  to hold the.** e
19450 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
19460 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
19470 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69  .  This buffer i
19480 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  s used internall
19490 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c  y.** during roll
194a0 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65  back and will be
194b0 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65   overwritten whe
194c0 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  never a rollback
194d0 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74  .** occurs.  But
194e0 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61   other modules a
194f0 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69  re free to use i
19500 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61  t too, as long a
19510 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b  s.** no rollback
19520 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e  s are happening.
19530 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
19540 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
19550 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
19560 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
19570 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f  >pTmpSpace;.}../
19580 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
19590 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  set the maximum 
195a0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
195b0 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73  unt if mxPage is
195c0 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d   positive. .** M
195d0 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
195e0 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f  f mxPage is zero
195f0 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41   or negative.  A
19600 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20  nd never reduce 
19610 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70  the.** maximum p
19620 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  age count below 
19630 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
19640 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
19650 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ..**.** Regardle
19660 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ss of mxPage, re
19670 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
19680 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
19690 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
196a0 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
196b0 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
196c0 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
196d0 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20  .  int nPage;.  
196e0 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a  if( mxPage>0 ){.
196f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
19700 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  no = mxPage;.  }
19710 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
19720 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
19730 20 26 6e 50 61 67 65 29 3b 0a 20 20 61 73 73 65   &nPage);.  asse
19740 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  rt( pPager->mxPg
19750 6e 6f 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 72  no>=nPage );.  r
19760 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78  eturn pPager->mx
19770 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Pgno;.}../*.** T
19780 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74  he following set
19790 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65   of routines are
197a0 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65   used to disable
197b0 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a   the simulated.*
197c0 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68  * I/O error mech
197d0 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f  anism.  These ro
197e0 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
197f0 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74  to avoid simulat
19800 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20  ed.** errors in 
19810 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20  places where we 
19820 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
19830 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  t errors..**.** 
19840 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f  Unless -DSQLITE_
19850 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20  TEST=1 is used, 
19860 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  these routines a
19870 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a  re all no-ops.**
19880 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f   and generate no
19890 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66   code..*/.#ifdef
198a0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74   SQLITE_TEST.ext
198b0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
198c0 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
198d0 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ;.extern int sql
198e0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69  ite3_io_error_hi
198f0 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  t;.static int sa
19900 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69  ved_cnt;.void di
19910 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
19920 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
19930 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73  .  saved_cnt = s
19940 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
19950 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74  pending;.  sqlit
19960 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
19970 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64  ing = -1;.}.void
19980 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
19990 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
199a0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ){.  sqlite3_io_
199b0 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
199c0 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c  saved_cnt;.}.#el
199d0 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61  se.# define disa
199e0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
199f0 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69  _errors().# defi
19a00 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  ne enable_simula
19a10 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
19a20 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
19a30 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62  ad the first N b
19a40 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65  ytes from the be
19a50 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66  ginning of the f
19a60 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a  ile into memory.
19a70 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f  ** that pDest po
19a80 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20  ints to. .**.** 
19a90 49 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73  If the pager was
19aa0 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61   opened on a tra
19ab0 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69  nsient file (zFi
19ac0 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a  lename==""), or.
19ad0 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66  ** opened on a f
19ae0 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20  ile less than N 
19af0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
19b00 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
19b10 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e   is.** zeroed an
19b20 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
19b30 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e  rned. The ration
19b40 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73 20  ale for this is 
19b50 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75  that this .** fu
19b60 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
19b70 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20  o read database 
19b80 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e  headers, and a n
19b90 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a  ew transient or.
19ba0 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61  ** zero sized da
19bb0 74 61 62 61 73 65 20 68 61 73 20 61 20 68 65 61  tabase has a hea
19bc0 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74  der than consist
19bd0 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65  s entirely of ze
19be0 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  roes..**.** If a
19bf0 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72  ny IO error apar
19c00 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f  t from SQLITE_IO
19c10 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69  ERR_SHORT_READ i
19c20 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a  s encountered,.*
19c30 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  * the error code
19c40 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
19c50 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74  the caller and t
19c60 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
19c70 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66  he.** output buf
19c80 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  fer undefined..*
19c90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
19ca0 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
19cb0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
19cc0 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20  int N, unsigned 
19cd0 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20  char *pDest){.  
19ce0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
19cf0 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65  OK;.  memset(pDe
19d00 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73  st, 0, N);.  ass
19d10 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
19d20 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
19d30 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
19d40 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
19d50 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49  er->fd) ){.    I
19d60 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25  OTRACE(("DBHDR %
19d70 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  p 0 %d\n", pPage
19d80 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20  r, N)).    rc = 
19d90 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
19da0 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c  ager->fd, pDest,
19db0 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   N, 0);.    if( 
19dc0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
19dd0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
19de0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
19df0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
19e00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19e10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
19e20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
19e30 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
19e40 61 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63  abase file assoc
19e50 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20 70  iated .** with p
19e60 50 61 67 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c  Pager. Normally,
19e70 20 74 68 69 73 20 69 73 20 63 61 6c 63 75 6c 61   this is calcula
19e80 74 65 64 20 61 73 20 28 3c 64 62 20 66 69 6c 65  ted as (<db file
19e90 20 73 69 7a 65 3e 2f 3c 70 61 67 65 2d 73 69 7a   size>/<page-siz
19ea0 65 3e 29 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c  e>)..** However,
19eb0 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
19ec0 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70  between 1 and <p
19ed0 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20  age-size> bytes 
19ee0 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a  in size, then .*
19ef0 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64  * this is consid
19f00 65 72 65 64 20 61 20 31 20 70 61 67 65 20 66 69  ered a 1 page fi
19f10 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
19f20 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 72 72   pager is in err
19f30 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  or state when th
19f40 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
19f50 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a  alled, then the.
19f60 2a 2a 20 65 72 72 6f 72 20 73 74 61 74 65 20 65  ** error state e
19f70 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
19f80 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67  urned and *pnPag
19f90 65 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  e left unchanged
19fa0 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20  . Or,.** if the 
19fb0 66 69 6c 65 20 73 79 73 74 65 6d 20 68 61 73 20  file system has 
19fc0 74 6f 20 62 65 20 71 75 65 72 69 65 64 20 66 6f  to be queried fo
19fd0 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  r the size of th
19fe0 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68  e file and.** th
19ff0 65 20 71 75 65 72 79 20 61 74 74 65 6d 70 74 20  e query attempt 
1a000 72 65 74 75 72 6e 73 20 61 6e 20 49 4f 20 65 72  returns an IO er
1a010 72 6f 72 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  ror, the IO erro
1a020 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1a030 65 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50 61 67  ed.** and *pnPag
1a040 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e  e is left unchan
1a050 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ged..**.** Other
1a060 77 69 73 65 2c 20 69 66 20 65 76 65 72 79 74 68  wise, if everyth
1a070 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
1a080 6c 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  l, then SQLITE_O
1a090 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
1a0a0 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20   and *pnPage is 
1a0b0 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
1a0c0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
1a0d0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69  e database..*/.i
1a0e0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  nt sqlite3PagerP
1a0f0 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
1a100 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50  pPager, int *pnP
1a110 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61  age){.  Pgno nPa
1a120 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ge = 0;         
1a130 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
1a140 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65  turn via *pnPage
1a150 20 2a 2f 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d   */..  /* Determ
1a160 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ine the number o
1a170 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66  f pages in the f
1a180 69 6c 65 2e 20 53 74 6f 72 65 20 74 68 69 73 20  ile. Store this 
1a190 69 6e 20 6e 50 61 67 65 2e 20 2a 2f 0a 20 20 69  in nPage. */.  i
1a1a0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
1a1b0 65 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 6e 50  eValid ){.    nP
1a1c0 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  age = pPager->db
1a1d0 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Size;.  }else{. 
1a1e0 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20     int rc;      
1a1f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
1a200 72 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ror returned by 
1a210 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a  OsFileSize() */.
1a220 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20      i64 n = 0;  
1a230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1a240 69 6c 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  ile size in byte
1a250 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  s returned by Os
1a260 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 0a 20  FileSize() */.. 
1a270 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65 4c     if( pagerUseL
1a280 6f 67 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  og(pPager) ){.  
1a290 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 44 62      sqlite3LogDb
1a2a0 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 4c 6f  size(pPager->pLo
1a2b0 67 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  g, &nPage);.    
1a2c0 7d 0a 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65  }..    if( nPage
1a2d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
1a2e0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1a2f0 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
1a300 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
1a310 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28       if( isOpen(
1a320 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
1a330 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
1a340 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
1a350 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
1a360 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 20 29  ager->fd, &n)) )
1a370 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65  {.          page
1a380 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
1a390 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rc);.          r
1a3a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1a3b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1a3c0 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70    if( n>0 && n<p
1a3d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1a3e0 29 7b 0a 20 20 20 20 20 20 20 20 6e 50 61 67 65  ){.        nPage
1a3f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
1a400 65 7b 0a 20 20 20 20 20 20 20 20 6e 50 61 67 65  e{.        nPage
1a410 20 3d 20 28 50 67 6e 6f 29 28 6e 20 2f 20 70 50   = (Pgno)(n / pP
1a420 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1a430 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a440 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
1a450 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
1a460 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
1a470 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
1a480 67 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ge;.      pPager
1a490 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e  ->dbFileSize = n
1a4a0 50 61 67 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Page;.      pPag
1a4b0 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
1a4c0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
1a4d0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72    /* If the curr
1a4e0 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ent number of pa
1a4f0 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ges in the file 
1a500 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1a510 74 68 65 20 0a 20 20 2a 2a 20 63 6f 6e 66 69 67  the .  ** config
1a520 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67  ured maximum pag
1a530 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65  er number, incre
1a540 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20  ase the allowed 
1a550 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68  limit so.  ** th
1a560 61 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20  at the file can 
1a570 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20  be read..  */.  
1a580 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72  if( nPage>pPager
1a590 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
1a5a0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
1a5b0 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20   (Pgno)nPage;.  
1a5c0 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
1a5d0 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20  output variable 
1a5e0 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
1a5f0 45 5f 4f 4b 20 2a 2f 0a 20 20 2a 70 6e 50 61 67  E_OK */.  *pnPag
1a600 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74  e = nPage;.  ret
1a610 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1a620 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  .../*.** Try to 
1a630 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66  obtain a lock of
1a640 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f   type locktype o
1a650 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1a660 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d  ile. If.** a sim
1a670 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72 20  ilar or greater 
1a680 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
1a690 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74  held, this funct
1a6a0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a  ion is a no-op.*
1a6b0 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  * (returning SQL
1a6c0 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65  ITE_OK immediate
1a6d0 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ly)..**.** Other
1a6e0 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f  wise, attempt to
1a6f0 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b   obtain the lock
1a700 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
1a710 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a  Lock(). Invoke .
1a720 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ** the busy call
1a730 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b  back if the lock
1a740 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f   is currently no
1a750 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70  t available. Rep
1a760 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68  eat .** until th
1a770 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
1a780 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72  returns false or
1a790 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d   until the attem
1a7a0 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e  pt to .** obtain
1a7b0 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65   the lock succee
1a7c0 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ds..**.** Return
1a7d0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
1a7e0 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72  ccess and an err
1a7f0 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61  or code if we ca
1a800 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74  nnot obtain.** t
1a810 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20  he lock. If the 
1a820 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
1a830 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73   successfully, s
1a840 65 74 20 74 68 65 20 50 61 67 65 72 2e 73 74 61  et the Pager.sta
1a850 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  te .** variable 
1a860 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f  to locktype befo
1a870 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
1a880 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1a890 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50  r_wait_on_lock(P
1a8a0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
1a8b0 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
1a8c0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1a8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8e0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1a8f0 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  de */..  /* The 
1a900 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d  OS lock values m
1a910 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
1a920 61 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63  as the Pager loc
1a930 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73  k values */.  as
1a940 73 65 72 74 28 20 50 41 47 45 52 5f 53 48 41 52  sert( PAGER_SHAR
1a950 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ED==SHARED_LOCK 
1a960 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
1a970 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53  ER_RESERVED==RES
1a980 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
1a990 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 45 58  assert( PAGER_EX
1a9a0 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49  CLUSIVE==EXCLUSI
1a9b0 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  VE_LOCK );..  /*
1a9c0 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
1a9d0 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b  currently unlock
1a9e0 65 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65  ed then the size
1a9f0 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e   must be unknown
1aa00 2e 20 49 74 0a 20 20 2a 2a 20 6d 75 73 74 20 6e  . It.  ** must n
1aa10 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64  ot have been mod
1aa20 69 66 69 65 64 20 61 74 20 74 68 69 73 20 70 6f  ified at this po
1aa30 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  int..  */.  asse
1aa40 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1aa50 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
1aa60 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
1aa70 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 61  eValid==0 );.  a
1aa80 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1aa90 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
1aaa0 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  ED || pPager->db
1aab0 4d 6f 64 69 66 69 65 64 3d 3d 30 20 29 3b 0a 0a  Modified==0 );..
1aac0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
1aad0 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61  this is either a
1aae0 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20   no-op (because 
1aaf0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
1ab00 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65  ck is .  ** alre
1ab10 61 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65  ady held, or one
1ab20 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 73 74   of the transist
1ab30 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62 75  ions that the bu
1ab40 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20  sy-handler.  ** 
1ab50 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64  may be invoked d
1ab60 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67  uring, according
1ab70 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20   to the comment 
1ab80 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74  above.  ** sqlit
1ab90 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
1aba0 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  ndler()..  */.  
1abb0 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
1abc0 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65  >state>=locktype
1abd0 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ).       || (pPa
1abe0 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
1abf0 52 5f 55 4e 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b  R_UNLOCK && lock
1ac00 74 79 70 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  type==PAGER_SHAR
1ac10 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  ED).       || (p
1ac20 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
1ac30 47 45 52 5f 52 45 53 45 52 56 45 44 20 26 26 20  GER_RESERVED && 
1ac40 6c 6f 63 6b 74 79 70 65 3d 3d 50 41 47 45 52 5f  locktype==PAGER_
1ac50 45 58 43 4c 55 53 49 56 45 29 0a 20 20 29 3b 0a  EXCLUSIVE).  );.
1ac60 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1ac70 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29  tate>=locktype )
1ac80 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1ac90 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
1aca0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63     do {.      rc
1acb0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
1acc0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63  (pPager->fd, loc
1acd0 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69  ktype);.    }whi
1ace0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
1acf0 55 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78  USY && pPager->x
1ad00 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67  BusyHandler(pPag
1ad10 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
1ad20 41 72 67 29 20 29 3b 0a 20 20 20 20 69 66 28 20  Arg) );.    if( 
1ad30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ad40 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
1ad50 74 61 74 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74  tate = (u8)lockt
1ad60 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ype;.      IOTRA
1ad70 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c  CE(("LOCK %p %d\
1ad80 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b  n", pPager, lock
1ad90 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d  type)).    }.  }
1ada0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1adb0 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  ./*.** Function 
1adc0 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
1add0 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
1ade0 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65   checks that one
1adf0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c   of the .** foll
1ae00 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f  owing is true fo
1ae10 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  r all dirty page
1ae20 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  s currently in t
1ae30 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a  he page-cache:.*
1ae40 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61  *.**   a) The pa
1ae50 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge number is les
1ae60 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
1ae70 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
1ae80 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72  he .**      curr
1ae90 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d 61  ent database ima
1aea0 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52  ge, in pages, OR
1aeb0 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74  .**.**   b) if t
1aec0 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
1aed0 77 65 72 65 20 77 72 69 74 74 65 6e 20 61 74 20  were written at 
1aee0 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f  this time, it wo
1aef0 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  uld not.**      
1af00 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  be necessary to 
1af10 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
1af20 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f  t content out to
1af30 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
1af40 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65 74  .**      (as det
1af50 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74  ermined by funct
1af60 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73  ion subjRequires
1af70 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49  Page())..**.** I
1af80 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  f the condition 
1af90 61 73 73 65 72 74 65 64 20 62 79 20 74 68 69 73  asserted by this
1afa0 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e   function were n
1afb0 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65  ot true, and the
1afc0 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 77  .** dirty page w
1afd0 65 72 65 20 74 6f 20 62 65 20 64 69 73 63 61 72  ere to be discar
1afe0 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63  ded from the cac
1aff0 68 65 20 76 69 61 20 74 68 65 20 70 61 67 65 72  he via the pager
1b000 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74  Stress().** rout
1b010 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73 73  ine, pagerStress
1b020 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69  () would not wri
1b030 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
1b040 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a  age content to.*
1b050 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
1b060 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f  ile. If a savepo
1b070 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  int transaction 
1b080 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  were rolled back
1b090 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68   after.** this h
1b0a0 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72  appened, the cor
1b0b0 72 65 63 74 20 62 65 68 61 76 69 6f 75 72 20 77  rect behaviour w
1b0c0 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f  ould be to resto
1b0d0 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  re the current.*
1b0e0 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
1b0f0 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20   page. However, 
1b100 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65  since this conte
1b110 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  nt is not presen
1b120 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74  t in either.** t
1b130 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b140 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20   or the portion 
1b150 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
1b160 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20  journal and .** 
1b170 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  sub-journal roll
1b180 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74  ed back the cont
1b190 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ent could not be
1b1a0 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68   restored and th
1b1b0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d  e.** database im
1b1c0 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65  age would become
1b1d0 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20   corrupt. It is 
1b1e0 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e  therefore fortun
1b1f0 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69  ate that .** thi
1b200 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63  s circumstance c
1b210 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a  annot arise..*/.
1b220 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1b230 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63  TE_DEBUG).static
1b240 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
1b250 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62  cateConstraintCb
1b260 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1b270 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
1b280 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
1b290 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62  ;.  assert( !sub
1b2a0 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
1b2b0 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c  g) || pPg->pgno<
1b2c0 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62  =pPg->pPager->db
1b2d0 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63  Size );.}.static
1b2e0 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
1b2f0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50  cateConstraint(P
1b300 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1b310 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74   sqlite3PcacheIt
1b320 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65  erateDirty(pPage
1b330 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65  r->pPCache, asse
1b340 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
1b350 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65  aintCb);.}.#else
1b360 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  .# define assert
1b370 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
1b380 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69  nt(pPager).#endi
1b390 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  f../*.** Truncat
1b3a0 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
1b3b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d  database file im
1b3c0 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67  age to nPage pag
1b3d0 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  es. This .** fun
1b3e0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61  ction does not a
1b3f0 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74  ctually modify t
1b400 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b410 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a   on disk. It .**
1b420 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69   just sets the i
1b430 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66  nternal state of
1b440 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
1b450 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a  t so that the .*
1b460 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c  * truncation wil
1b470 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74  l be done when t
1b480 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
1b490 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
1b4a0 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
1b4b0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
1b4c0 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50  eImage(Pager *pP
1b4d0 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
1b4e0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
1b4f0 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
1b500 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1b510 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50  ager->dbSize>=nP
1b520 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
1b530 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
1b540 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
1b550 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
1b560 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 61 73  ze = nPage;.  as
1b570 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
1b580 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 3b 0a  traint(pPager);.
1b590 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
1b5a0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1b5b0 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  d before attempt
1b5c0 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ing a hot-journa
1b5d0 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a  l rollback. It.*
1b5e0 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72  * syncs the jour
1b5f0 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b  nal file to disk
1b600 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50 61 67  , then sets pPag
1b610 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74  er->journalHdr t
1b620 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66  o the.** size of
1b630 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b640 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61  e so that the pa
1b650 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72  ger_playback() r
1b660 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20  outine knows.** 
1b670 74 68 61 74 20 74 68 65 20 65 6e 74 69 72 65 20  that the entire 
1b680 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
1b690 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a   been synced..**
1b6a0 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f  .** Syncing a ho
1b6b0 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73  t-journal to dis
1b6c0 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  k before attempt
1b6d0 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ing to roll it b
1b6e0 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20  ack ensures .** 
1b6f0 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d  that if a power-
1b700 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64  failure occurs d
1b710 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61  uring the rollba
1b720 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20  ck, the process 
1b730 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73  that.** attempts
1b740 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77   rollback follow
1b750 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76  ing system recov
1b760 65 72 79 20 73 65 65 73 20 74 68 65 20 73 61 6d  ery sees the sam
1b770 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e  e journal.** con
1b780 74 65 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f  tent as this pro
1b790 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  cess..**.** If e
1b7a0 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61  verything goes a
1b7b0 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54  s planned, SQLIT
1b7c0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1b7d0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a  . Otherwise, .**
1b7e0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1b7f0 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
1b800 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f   int pagerSyncHo
1b810 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
1b820 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1b830 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1b840 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
1b850 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
1b860 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
1b870 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49  Pager->jfd, SQLI
1b880 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b  TE_SYNC_NORMAL);
1b890 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1b8a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b8b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1b8c0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
1b8d0 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75  fd, &pPager->jou
1b8e0 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20  rnalHdr);.  }.  
1b8f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1b900 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
1b910 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72   page cache.  Fr
1b920 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e  ee all memory an
1b930 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  d close all file
1b940 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  s..**.** If a tr
1b950 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e  ansaction was in
1b960 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74   progress when t
1b970 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1b980 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74  alled, that.** t
1b990 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
1b9a0 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20  lled back.  All 
1b9b0 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
1b9c0 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
1b9d0 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d  d.** and their m
1b9e0 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20  emory is freed. 
1b9f0 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
1ba00 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63  use a page assoc
1ba10 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
1ba20 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66  is page cache af
1ba30 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
1ba40 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c  n returns will l
1ba50 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20  ikely.** result 
1ba60 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
1ba70 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1ba80 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  on always succee
1ba90 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  ds. If a transac
1baa0 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
1bab0 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20  n attempt.** is 
1bac0 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  made to roll it 
1bad0 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f  back. If an erro
1bae0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
1baf0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a  the rollback .**
1bb00 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d   a hot journal m
1bb10 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68  ay be left in th
1bb20 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74  e filesystem but
1bb30 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74   no error is ret
1bb40 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  urned.** to the 
1bb50 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  caller..*/.int s
1bb60 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
1bb70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1bb80 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28 75  .  u8 *pTmp = (u
1bb90 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  8 *)pPager->pTmp
1bba0 53 70 61 63 65 3b 0a 0a 20 20 64 69 73 61 62 6c  Space;..  disabl
1bbb0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
1bbc0 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74  rrors();.  sqlit
1bbd0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
1bbe0 6c 6f 63 28 29 3b 0a 20 20 70 50 61 67 65 72 2d  loc();.  pPager-
1bbf0 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20  >errCode = 0;.  
1bc00 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
1bc10 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c  eMode = 0;.  sql
1bc20 69 74 65 33 4c 6f 67 43 6c 6f 73 65 28 70 50 61  ite3LogClose(pPa
1bc30 67 65 72 2d 3e 70 4c 6f 67 2c 20 70 50 61 67 65  ger->pLog, pPage
1bc40 72 2d 3e 66 64 2c 20 0a 20 20 20 20 28 70 50 61  r->fd, .    (pPa
1bc50 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 20  ger->noSync ? 0 
1bc60 3a 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  : pPager->sync_f
1bc70 6c 61 67 73 29 2c 20 70 54 6d 70 0a 20 20 29 3b  lags), pTmp.  );
1bc80 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 6f 67 20  .  pPager->pLog 
1bc90 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73  = 0;.  pager_res
1bca0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  et(pPager);.  if
1bcb0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
1bcc0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
1bcd0 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
1bce0 20 20 2f 2a 20 53 65 74 20 50 61 67 65 72 2e 6a    /* Set Pager.j
1bcf0 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 2d 31 20  ournalHdr to -1 
1bd00 66 6f 72 20 74 68 65 20 62 65 6e 65 66 69 74 20  for the benefit 
1bd10 6f 66 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61  of the pager_pla
1bd20 79 62 61 63 6b 28 29 20 0a 20 20 20 20 2a 2a 20  yback() .    ** 
1bd30 63 61 6c 6c 20 77 68 69 63 68 20 6d 61 79 20 62  call which may b
1bd40 65 20 6d 61 64 65 20 66 72 6f 6d 20 77 69 74 68  e made from with
1bd50 69 6e 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  in pagerUnlockAn
1bd60 64 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 49 66 20  dRollback(). If 
1bd70 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  it.    ** is not
1bd80 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 75 6e   -1, then the un
1bd90 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f  synced portion o
1bda0 66 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61  f an open journa
1bdb0 6c 20 66 69 6c 65 20 6d 61 79 0a 20 20 20 20 2a  l file may.    *
1bdc0 2a 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  * be played back
1bdd0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
1bde0 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66  se. If a power f
1bdf0 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
1be00 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  ile.    ** this 
1be10 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68  is happening, th
1be20 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62  e database may b
1be30 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20  ecome corrupt.. 
1be40 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73     */.    if( is
1be50 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
1be60 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  ) ){.      pPage
1be70 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70 61 67  r->errCode = pag
1be80 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c  erSyncHotJournal
1be90 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
1bea0 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
1beb0 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
1bec0 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
1bed0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
1bee0 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ();.  enable_sim
1bef0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
1bf00 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ();.  PAGERTRACE
1bf10 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20  (("CLOSE %d\n", 
1bf20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1bf30 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43  );.  IOTRACE(("C
1bf40 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67  LOSE %p\n", pPag
1bf50 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73  er)).  sqlite3Os
1bf60 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
1bf70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
1bf80 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73 71  Free(pTmp);.  sq
1bf90 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65  lite3PcacheClose
1bfa0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1bfb0 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
1bfc0 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66  E_HAS_CODEC.  if
1bfd0 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ( pPager->xCodec
1bfe0 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78  Free ) pPager->x
1bff0 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65 72  CodecFree(pPager
1c000 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69  ->pCodec);.#endi
1c010 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  f..  assert( !pP
1c020 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
1c030 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49 6e   && !pPager->pIn
1c040 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
1c050 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61  ert( !isOpen(pPa
1c060 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73  ger->jfd) && !is
1c070 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
1c080 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  d) );..  sqlite3
1c090 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
1c0a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c0b0 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  K;.}..#if !defin
1c0c0 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65  ed(NDEBUG) || de
1c0d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
1c0e0 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T)./*.** Return 
1c0f0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1c100 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f  for page pPg..*/
1c110 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67  .Pgno sqlite3Pag
1c120 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50  erPagenumber(DbP
1c130 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  age *pPg){.  ret
1c140 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d  urn pPg->pgno;.}
1c150 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
1c160 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ncrement the ref
1c170 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
1c180 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f   page pPg..*/.vo
1c190 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  id sqlite3PagerR
1c1a0 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
1c1b0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
1c1c0 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  Ref(pPg);.}../*.
1c1d0 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  ** Sync the jour
1c1e0 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  nal. In other wo
1c1f0 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61  rds, make sure a
1c200 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61  ll the pages tha
1c210 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77  t have.** been w
1c220 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
1c230 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61  urnal have actua
1c240 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
1c250 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a  surface of the.*
1c260 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62  * disk and can b
1c270 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68  e restored in th
1c280 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74  e event of a hot
1c290 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
1c2a0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
1c2b0 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
1c2c0 6c 61 67 20 69 73 20 6e 6f 74 20 73 65 74 2c 20  lag is not set, 
1c2d0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
1c2e0 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70  on is a.** no-op
1c2f0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
1c300 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65   actions require
1c310 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20  d depend on the 
1c320 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 0a 2a 2a 20  journal-mode.** 
1c330 61 6e 64 20 74 68 65 20 64 65 76 69 63 65 20 63  and the device c
1c340 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f  haracteristics o
1c350 66 20 74 68 65 20 74 68 65 20 66 69 6c 65 2d 73  f the the file-s
1c360 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77  ystem, as follow
1c370 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  s:.**.**   * If 
1c380 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1c390 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
1c3a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e   journal file, n
1c3b0 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a  o action need.**
1c3c0 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a       be taken..*
1c3d0 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69  *.**   * Otherwi
1c3e0 73 65 2c 20 69 66 20 74 68 65 20 64 65 76 69 63  se, if the devic
1c3f0 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  e does not suppo
1c400 72 74 20 74 68 65 20 53 41 46 45 5f 41 50 50 45  rt the SAFE_APPE
1c410 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20  ND property,.** 
1c420 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65      then the nRe
1c430 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d  c field of the m
1c440 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69  ost recently wri
1c450 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tten journal hea
1c460 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70  der.**     is up
1c470 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  dated to contain
1c480 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a   the number of j
1c490 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74  ournal records t
1c4a0 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20  hat have.**     
1c4b0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c  been written fol
1c4c0 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68  lowing it. If th
1c4d0 65 20 70 61 67 65 72 20 69 73 20 6f 70 65 72 61  e pager is opera
1c4e0 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  ting in full-syn
1c4f0 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74  c.**     mode, t
1c500 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1c510 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62  file is synced b
1c520 65 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64  efore this field
1c530 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a   is updated..**.
1c540 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64 65  **   * If the de
1c550 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75  vice does not su
1c560 70 70 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e  pport the SEQUEN
1c570 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74  TIAL property, t
1c580 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72  hen .**     jour
1c590 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
1c5a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e  ed..**.** Or, in
1c5b0 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a   pseudo-code:.**
1c5c0 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69  .**   if( NOT <i
1c5d0 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
1c5e0 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20  > ){.**     if( 
1c5f0 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20  NOT SAFE_APPEND 
1c600 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20  ){.**       if( 
1c610 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e  <full-sync mode>
1c620 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61   ) xSync(<journa
1c630 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20  l file>);.**    
1c640 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20     <update nRec 
1c650 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20  field>.**     } 
1c660 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20  .**     if( NOT 
1c670 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79  SEQUENTIAL ) xSy
1c680 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  nc(<journal file
1c690 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a  >);.**   }.**.**
1c6a0 20 54 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   The Pager.needS
1c6b0 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 65 76 65  ync flag is neve
1c6c0 72 20 62 65 20 73 65 74 20 66 6f 72 20 74 65 6d  r be set for tem
1c6d0 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 6f 72  porary files, or
1c6e0 20 61 6e 79 0a 2a 2a 20 66 69 6c 65 20 6f 70 65   any.** file ope
1c6f0 72 61 74 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e  rating in no-syn
1c700 63 20 6d 6f 64 65 20 28 50 61 67 65 72 2e 6e 6f  c mode (Pager.no
1c710 53 79 6e 63 20 73 65 74 20 74 6f 20 6e 6f 6e 2d  Sync set to non-
1c720 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  zero)..**.** If 
1c730 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
1c740 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
1c750 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
1c760 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72  YNC flag of ever
1c770 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65  y .** page curre
1c780 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d  ntly held in mem
1c790 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72  ory before retur
1c7a0 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  ning SQLITE_OK. 
1c7b0 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  If an IO.** erro
1c7c0 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
1c7d0 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
1c7e0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1c7f0 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
1c800 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1c810 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
1c820 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1c830 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  if( pPager->need
1c840 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65  Sync ){.    asse
1c850 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
1c860 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28  pFile );.    if(
1c870 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1c880 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
1c890 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
1c8a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 20  {.      int rc; 
1c8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c8d0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1c8e0 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
1c8f0 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
1c900 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1c910 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
1c920 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
1c930 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
1c940 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  d) );..      if(
1c950 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
1c960 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
1c970 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  D) ){.        /*
1c980 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c   This block deal
1c990 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72  s with an obscur
1c9a0 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68  e problem. If th
1c9b0 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f  e last connectio
1c9c0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  n.        ** tha
1c9d0 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20  t wrote to this 
1c9e0 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65  database was ope
1c9f0 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73  rating in persis
1ca00 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  tent-journal.   
1ca10 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68       ** mode, th
1ca20 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
1ca30 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20  ile may at this 
1ca40 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62  point actually b
1ca50 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20  e larger.       
1ca60 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a   ** than Pager.j
1ca70 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e  ournalOff bytes.
1ca80 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69   If the next thi
1ca90 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ng in the journa
1caa0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c  l.        ** fil
1cab0 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
1cac0 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
1cad0 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72   (written as par
1cae0 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  t of the.       
1caf0 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e   ** previous con
1cb00 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61  nection's transa
1cb10 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72  ction), and a cr
1cb20 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69  ash or power-fai
1cb30 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  lure .        **
1cb40 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52   occurs after nR
1cb50 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75  ec is updated bu
1cb60 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f  t before this co
1cb70 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20  nnection writes 
1cb80 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74  .        ** anyt
1cb90 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65  hing else to the
1cba0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
1cbb0 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20  r commits/rolls 
1cbc0 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20  back its .      
1cbd0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1cbe0 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d  ), then SQLite m
1cbf0 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73  ay become confus
1cc00 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68  ed when doing th
1cc10 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f  e .        ** ho
1cc20 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
1cc30 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63  ck following rec
1cc40 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f  overy. It may ro
1cc50 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20  ll back all.    
1cc60 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63      ** of this c
1cc70 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c  onnections data,
1cc80 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f   then proceed to
1cc90 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68   rolling back th
1cca0 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a  e old,.        *
1ccb0 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61  * out-of-date da
1ccc0 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ta that follows 
1ccd0 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72  it. Database cor
1cce0 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  ruption..       
1ccf0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
1cd00 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
1cd10 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  is, if the journ
1cd20 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70  al file does app
1cd30 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20  ear to contain. 
1cd40 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69         ** a vali
1cd50 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69  d header followi
1cd60 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ng Pager.journal
1cd70 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20  Off, then write 
1cd80 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a  a 0x00.        *
1cd90 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74  * byte to the st
1cda0 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65  art of it to pre
1cdb0 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69  vent it from bei
1cdc0 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20  ng recognized.. 
1cdd0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
1cde0 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e    ** Variable iN
1cdf0 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73 20  extHdrOffset is 
1ce00 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65  set to the offse
1ce10 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73 0a  t at which this.
1ce20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c          ** probl
1ce30 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77 69  ematic header wi
1ce40 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20  ll occur, if it 
1ce50 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69  exists. aMagic i
1ce60 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20  s used .        
1ce70 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72  ** as a temporar
1ce80 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70  y buffer to insp
1ce90 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63 6f  ect the first co
1cea0 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66  uple of bytes of
1ceb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
1cec0 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61  potential journa
1ced0 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20  l header..      
1cee0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34    */.        i64
1cef0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b   iNextHdrOffset;
1cf00 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61 67  .        u8 aMag
1cf10 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75  ic[8];.        u
1cf20 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  8 zHeader[sizeof
1cf30 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
1cf40 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d  4];..        mem
1cf50 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
1cf60 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
1cf70 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
1cf80 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33  ));.        put3
1cf90 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
1cfa0 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
1cfb0 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e  gic)], pPager->n
1cfc0 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  Rec);..        i
1cfd0 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20  NextHdrOffset = 
1cfe0 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
1cff0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1d000 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1d010 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
1d020 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65  , aMagic, 8, iNe
1d030 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20  xtHdrOffset);.  
1d040 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1d050 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65  LITE_OK && 0==me
1d060 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
1d070 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29  urnalMagic, 8) )
1d080 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
1d090 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f  ic const u8 zero
1d0a0 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  byte = 0;.      
1d0b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d0c0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
1d0d0 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20  jfd, &zerobyte, 
1d0e0 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  1, iNextHdrOffse
1d0f0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
1d100 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1d110 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
1d120 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1d130 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1d140 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d150 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1d160 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
1d170 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  Rec value into t
1d180 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1d190 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20  header. If in.  
1d1a0 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79        ** full-sy
1d1b0 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
1d1c0 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
1d1d0 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73   first. This ens
1d1e0 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20  ures that.      
1d1f0 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61    ** all data ha
1d200 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65  s really hit the
1d210 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65   disk before nRe
1d220 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  c is updated to 
1d230 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  mark.        ** 
1d240 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74  it as a candidat
1d250 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a  e for rollback..
1d260 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1d270 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
1d280 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68  t required if th
1d290 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64  e persistent med
1d2a0 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a  ia supports the.
1d2b0 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f          ** SAFE_
1d2c0 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e  APPEND property.
1d2d0 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73   Because in this
1d2e0 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
1d2f0 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20  possible .      
1d300 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65    ** for garbage
1d310 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65   data to be appe
1d320 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65  nded to the file
1d330 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  , the nRec field
1d340 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70  .        ** is p
1d350 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78  opulated with 0x
1d360 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68  FFFFFFFF when th
1d370 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1d380 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20   is written.    
1d390 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72      ** and never
1d3a0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
1d3b0 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ated..        */
1d3c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
1d3d0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26  ger->fullSync &&
1d3e0 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
1d3f0 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
1d400 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ) ){.          P
1d410 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
1d420 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
1d430 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1d440 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r)));.          
1d450 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
1d460 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
1d470 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1d480 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
1d490 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
1d4a0 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
1d4b0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1d4c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1d4d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1d4e0 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  }.        IOTRAC
1d4f0 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
1d500 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
1d510 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
1d520 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1d530 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a  sqlite3OsWrite(.
1d540 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
1d550 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
1d560 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72  , sizeof(zHeader
1d570 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ), pPager->journ
1d580 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b  alHdr.        );
1d590 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1d5a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1d5b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1d5c0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
1d5d0 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
1d5e0 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
1d5f0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1d600 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  (("SYNC journal 
1d610 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
1d620 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
1d630 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
1d640 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
1d650 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20  er)).        rc 
1d660 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
1d670 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
1d680 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 7c  ger->sync_flags|
1d690 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61   .          (pPa
1d6a0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 3d  ger->sync_flags=
1d6b0 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
1d6c0 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  L?SQLITE_SYNC_DA
1d6d0 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20  TAONLY:0).      
1d6e0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
1d6f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d700 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1d710 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1d720 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
1d730 6c 65 20 77 61 73 20 6a 75 73 74 20 73 75 63 63  le was just succ
1d740 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e  essfully synced.
1d750 20 53 65 74 20 50 61 67 65 72 2e 6e 65 65 64 53   Set Pager.needS
1d760 79 6e 63 20 0a 20 20 20 20 2a 2a 20 74 6f 20 7a  ync .    ** to z
1d770 65 72 6f 20 61 6e 64 20 63 6c 65 61 72 20 74 68  ero and clear th
1d780 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
1d790 43 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20 70 61  C flag on all pa
1d7a0 67 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  gess..    */.   
1d7b0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
1d7c0 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  c = 0;.    pPage
1d7d0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
1d7e0 64 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  d = 1;.    pPage
1d7f0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
1d800 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1d810 66 66 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ff;.    sqlite3P
1d820 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c  cacheClearSyncFl
1d830 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ags(pPager->pPCa
1d840 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  che);.  }..  ret
1d850 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1d860 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  ../*.** The argu
1d870 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73  ment is the firs
1d880 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69  t in a linked li
1d890 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65  st of dirty page
1d8a0 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62  s connected.** b
1d8b0 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72  y the PgHdr.pDir
1d8c0 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73  ty pointer. This
1d8d0 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73   function writes
1d8e0 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65   each one of the
1d8f0 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  .** in-memory pa
1d900 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ges in the list 
1d910 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1d920 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65  file. The argume
1d930 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c  nt may.** be NUL
1d940 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  L, representing 
1d950 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49  an empty list. I
1d960 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
1d970 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
1d980 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
1d990 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f  he pager must ho
1d9a0 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  ld at least a RE
1d9b0 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e  SERVED lock when
1d9c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
1d9d0 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66  * is called. Bef
1d9e0 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74  ore writing anyt
1d9f0 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
1da00 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20  base file, this 
1da10 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61  lock.** is upgra
1da20 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  ded to an EXCLUS
1da30 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65  IVE lock. If the
1da40 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20   lock cannot be 
1da50 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c  obtained,.** SQL
1da60 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
1da70 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61  rned and no data
1da80 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
1da90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1daa0 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
1dab0 70 61 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d  pager is a temp-
1dac0 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74  file pager and t
1dad0 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73  he actual file-s
1dae0 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73  ystem file.** is
1daf0 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69   not yet open, i
1db00 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
1db10 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61   opened before a
1db20 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77  ny data is .** w
1db30 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a  ritten out..**.*
1db40 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20  * Once the lock 
1db50 68 61 73 20 62 65 65 6e 20 75 70 67 72 61 64 65  has been upgrade
1db60 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73  d and, if necess
1db70 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70  ary, the file op
1db80 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67  ened,.** the pag
1db90 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  es are written o
1dba0 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
1dbb0 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20  se file in list 
1dbc0 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a  order. Writing.*
1dbd0 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b 69 70  * a page is skip
1dbe0 70 65 64 20 69 66 20 69 74 20 6d 65 65 74 73 20  ped if it meets 
1dbf0 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f  either of the fo
1dc00 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61  llowing criteria
1dc10 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
1dc20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67  page number is g
1dc30 72 65 61 74 65 72 20 74 68 61 6e 20 50 61 67 65  reater than Page
1dc40 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20  r.dbSize, or.** 
1dc50 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f    * The PGHDR_DO
1dc60 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73  NT_WRITE flag is
1dc70 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65   set on the page
1dc80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69  ..**.** If writi
1dc90 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20 63 61  ng out a page ca
1dca0 75 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73  uses the databas
1dcb0 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20  e file to grow, 
1dcc0 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65  Pager.dbFileSize
1dcd0 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20 61  .** is updated a
1dce0 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70  ccordingly. If p
1dcf0 61 67 65 20 31 20 69 73 20 77 72 69 74 74 65 6e  age 1 is written
1dd00 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76   out, then the v
1dd10 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69  alue cached.** i
1dd20 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  n Pager.dbFileVe
1dd30 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20  rs[] is updated 
1dd40 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77  to match the new
1dd50 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
1dd60 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
1dd70 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
1dd80 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
1dd90 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
1dda0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1ddb0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
1ddc0 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49  .** occurs, an I
1ddd0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
1dde0 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66  returned. Or, if
1ddf0 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c   the EXCLUSIVE l
1de00 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65  ock cannot.** be
1de10 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54   obtained, SQLIT
1de20 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
1de30 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1de40 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  t pager_write_pa
1de50 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c  gelist(PgHdr *pL
1de60 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  ist){.  Pager *p
1de70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20  Pager;          
1de80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1de90 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
1dea0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1deb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dec0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1ded0 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20   code */..  if( 
1dee0 4e 45 56 45 52 28 70 4c 69 73 74 3d 3d 30 29 20  NEVER(pList==0) 
1def0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1df00 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70  OK;.  pPager = p
1df10 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20  List->pPager;.. 
1df20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
1df30 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65  t there may be e
1df40 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45 44  ither a RESERVED
1df50 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
1df60 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64  ck on the.  ** d
1df70 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
1df80 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
1df90 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  y an EXCLUSIVE l
1dfa0 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ock, the followi
1dfb0 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 20 69 73 20  ng.  ** call is 
1dfc0 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20 20  a no-op..  **.  
1dfd0 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f  ** Moving the lo
1dfe0 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44  ck from RESERVED
1dff0 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63   to EXCLUSIVE ac
1e000 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20  tually involves 
1e010 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75  going.  ** throu
1e020 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61  gh an intermedia
1e030 74 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47  te state PENDING
1e040 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f  .   A PENDING lo
1e050 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a  ck prevents new.
1e060 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f    ** readers fro
1e070 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74  m attaching to t
1e080 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20  he database but 
1e090 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20  is unsufficient 
1e0a0 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77  for us to.  ** w
1e0b0 72 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20  rite.  The idea 
1e0c0 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  of a PENDING loc
1e0d0 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20  k is to prevent 
1e0e0 6e 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d  new readers from
1e0f0 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20  .  ** coming in 
1e100 77 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f  while we wait fo
1e110 72 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65  r existing reade
1e120 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a  rs to clear..  *
1e130 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65  *.  ** While the
1e140 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
1e150 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
1e160 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
1e170 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a  tabase file.  **
1e180 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e   is unchanged an
1e190 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63  d we can rollbac
1e1a0 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
1e1b0 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65   to playback the
1e1c0 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e  .  ** journal in
1e1d0 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
1e1e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
1e1f0 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69  Once we transiti
1e200 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55  on to.  ** EXCLU
1e210 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74  SIVE, it means t
1e220 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1e230 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65   has been change
1e240 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61  d and any rollba
1e250 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71  ck.  ** will req
1e260 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70  uire a journal p
1e270 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  layback..  */.  
1e280 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
1e290 65 4c 6f 67 28 70 4c 69 73 74 2d 3e 70 50 61 67  eLog(pList->pPag
1e2a0 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
1e2b0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
1e2c0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
1e2d0 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77  ;.  rc = pager_w
1e2e0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
1e2f0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
1e300 43 4b 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  CK);..  /* If th
1e310 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70  e file is a temp
1e320 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65  -file has not ye
1e330 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
1e340 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20  pen it now. It. 
1e350 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   ** is not possi
1e360 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65  ble for rc to be
1e370 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
1e380 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72  TE_OK if this br
1e390 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b  anch.  ** is tak
1e3a0 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69  en, as pager_wai
1e3b0 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61  t_on_lock() is a
1e3c0 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d   no-op for temp-
1e3d0 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  files..  */.  if
1e3e0 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
1e3f0 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  ->fd) ){.    ass
1e400 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d  ert( pPager->tem
1e410 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c  pFile && rc==SQL
1e420 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63  ITE_OK );.    rc
1e430 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70   = pagerOpentemp
1e440 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
1e450 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73  >fd, pPager->vfs
1e460 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 77  Flags);.  }..  w
1e470 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
1e480 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a  _OK && pList ){.
1e490 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20      Pgno pgno = 
1e4a0 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pList->pgno;..  
1e4b0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
1e4c0 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e  e dirty pages in
1e4d0 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
1e4e0 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
1e4f0 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a  s greater.    **
1e500 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69   than Pager.dbSi
1e510 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73  ze, this means s
1e520 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
1e530 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63  ateImage() was c
1e540 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  alled to.    ** 
1e550 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d  make the file sm
1e560 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c  aller (presumabl
1e570 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  y by auto-vacuum
1e580 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77   code). Do not w
1e590 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20  rite.    ** any 
1e5a0 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68  such pages to th
1e5b0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
1e5c0 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e     ** Also, do n
1e5d0 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79  ot write out any
1e5e0 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74   page that has t
1e5f0 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  he PGHDR_DONT_WR
1e600 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20  ITE flag.    ** 
1e610 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69  set (set by sqli
1e620 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
1e630 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  e())..    */.   
1e640 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65   if( pgno<=pPage
1e650 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d  r->dbSize && 0==
1e660 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47  (pList->flags&PG
1e670 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20  HDR_DONT_WRITE) 
1e680 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  ){.      i64 off
1e690 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
1e6a0 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
1e6b0 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65  Size;   /* Offse
1e6c0 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  t to write */.  
1e6d0 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b      char *pData;
1e6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e700 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72     /* Data to wr
1e710 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20  ite */    ..    
1e720 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20    /* Encode the 
1e730 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
1e740 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
1e750 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70   pList->pData, p
1e760 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53  gno, 6, return S
1e770 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61  QLITE_NOMEM, pDa
1e780 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  ta);..      /* W
1e790 72 69 74 65 20 6f 75 74 20 74 68 65 20 70 61 67  rite out the pag
1e7a0 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20  e data. */.     
1e7b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
1e7c0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
1e7d0 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
1e7e0 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
1e7f0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
1e800 70 61 67 65 20 31 20 77 61 73 20 6a 75 73 74 20  page 1 was just 
1e810 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20  written, update 
1e820 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
1e830 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20   to match.      
1e840 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77  ** the value now
1e850 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64   stored in the d
1e860 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
1e870 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20   writing this . 
1e880 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75       ** page cau
1e890 73 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  sed the database
1e8a0 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75   file to grow, u
1e8b0 70 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65  pdate dbFileSize
1e8c0 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
1e8d0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
1e8e0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1e8f0 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
1e900 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c  ers, &pData[24],
1e910 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
1e920 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
1e930 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1e940 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46  pgno>pPager->dbF
1e950 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ileSize ){.     
1e960 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
1e970 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20  eSize = pgno;.  
1e980 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1e990 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75  Update any backu
1e9a0 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e  p objects copyin
1e9b0 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
1e9c0 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f  f this pager. */
1e9d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
1e9e0 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
1e9f0 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
1ea00 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44  , (u8*)pList->pD
1ea10 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47  ata);..      PAG
1ea20 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45 20  ERTRACE(("STORE 
1ea30 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
1ea40 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
1ea50 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
1ea60 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
1ea70 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
1ea80 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20  sh(pList)));.   
1ea90 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f     IOTRACE(("PGO
1eaa0 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  UT %p %d\n", pPa
1eab0 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
1eac0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
1ead0 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
1eae0 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  edb_count);.    
1eaf0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
1eb00 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20  ger->nWrite);.  
1eb10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50    }else{.      P
1eb20 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54  AGERTRACE(("NOST
1eb30 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ORE %d page %d\n
1eb40 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1eb50 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  r), pgno));.    
1eb60 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
1eb70 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
1eb80 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20  pList->pageHash 
1eb90 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
1eba0 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a  (pList);.#endif.
1ebb0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
1ebc0 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a  t->pDirty;.  }..
1ebd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ebe0 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72  /*.** Append a r
1ebf0 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72  ecord of the cur
1ec00 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61  rent state of pa
1ec10 67 65 20 70 50 67 20 74 6f 20 74 68 65 20 73 75  ge pPg to the su
1ec20 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49  b-journal. .** I
1ec30 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73  t is the callers
1ec40 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
1ec50 74 6f 20 75 73 65 20 73 75 62 6a 52 65 71 75 69  to use subjRequi
1ec60 72 65 73 50 61 67 65 28 29 20 74 6f 20 63 68 65  resPage() to che
1ec70 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74 20 69  ck .** that it i
1ec80 73 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65  s really require
1ec90 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  d before calling
1eca0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
1ecb0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
1ecc0 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74  ful, set the bit
1ecd0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1ece0 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74  o pPg->pgno in t
1ecf0 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f  he bitvecs.** fo
1ed00 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70  r all open savep
1ed10 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74  oints before ret
1ed20 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  urning..**.** Th
1ed30 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
1ed40 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  rns SQLITE_OK if
1ed50 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
1ed60 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f  uccessful, an IO
1ed70 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
1ed80 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  f the attempt to
1ed90 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 73 75   write to the su
1eda0 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c  b-journal fails,
1edb0 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e   or .** SQLITE_N
1edc0 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63  OMEM if a malloc
1edd0 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74   fails while set
1ede0 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20  ting a bit in a 
1edf0 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74  savepoint.** bit
1ee00 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vec..*/.static i
1ee10 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67  nt subjournalPag
1ee20 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
1ee30 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1ee40 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
1ee50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1ee60 65 72 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  er;.  if( isOpen
1ee70 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
1ee80 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74  {.    void *pDat
1ee90 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
1eea0 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
1eeb0 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63   pPager->nSubRec
1eec0 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
1eed0 53 69 7a 65 29 3b 0a 20 20 20 20 63 68 61 72 20  Size);.    char 
1eee0 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20 20 43 4f  *pData2;..    CO
1eef0 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
1ef00 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
1ef10 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
1ef20 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a  NOMEM, pData2);.
1ef30 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
1ef40 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
1ef50 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
1ef60 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1ef70 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 0a 20 20  g->pgno));.  .  
1ef80 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
1ef90 73 65 4c 6f 67 28 70 50 61 67 65 72 29 20 0a 20  seLog(pPager) . 
1efa0 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65 49          || pageI
1efb0 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 0a 20  nJournal(pPg) . 
1efc0 20 20 20 20 20 20 20 20 7c 7c 20 70 50 67 2d 3e          || pPg->
1efd0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f  pgno>pPager->dbO
1efe0 72 69 67 53 69 7a 65 20 0a 20 20 20 20 29 3b 0a  rigSize .    );.
1eff0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
1f000 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66  bits(pPager->sjf
1f010 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e  d, offset, pPg->
1f020 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
1f030 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1f040 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f050 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
1f060 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  ->sjfd, pData2, 
1f070 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1f080 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20  , offset+4);.   
1f090 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
1f0a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f0b0 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
1f0c0 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  c++;.    assert(
1f0d0 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
1f0e0 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20  int>0 );.    rc 
1f0f0 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  = addToSavepoint
1f100 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
1f110 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  pPg->pgno);.  }.
1f120 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1f130 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1f140 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
1f150 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79  y the pcache lay
1f160 65 72 20 77 68 65 6e 20 69 74 20 68 61 73 20 72  er when it has r
1f170 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73  eached some.** s
1f180 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74  oft memory limit
1f190 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
1f1a0 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
1f1b0 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a  r to a Pager obj
1f1c0 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20  ect.** (cast as 
1f1d0 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61  a void*). The pa
1f1e0 67 65 72 20 69 73 20 61 6c 77 61 79 73 20 27 70  ger is always 'p
1f1f0 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61  urgeable' (not a
1f200 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64  n in-memory.** d
1f210 61 74 61 62 61 73 65 29 2e 20 54 68 65 20 73 65  atabase). The se
1f220 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
1f230 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
1f240 61 20 70 61 67 65 20 74 68 61 74 20 69 73 20 0a  a page that is .
1f250 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72  ** currently dir
1f260 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75  ty but has no ou
1f270 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
1f280 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a  nces. The page.*
1f290 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f  * is always asso
1f2a0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
1f2b0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73  Pager object pas
1f2c0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
1f2d0 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a   .** argument..*
1f2e0 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20  *.** The job of 
1f2f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1f300 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65   to make pPg cle
1f310 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69 74  an by writing it
1f320 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75  s contents.** ou
1f330 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
1f340 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69  e file, if possi
1f350 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e  ble. This may in
1f360 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68  volve syncing th
1f370 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
1f380 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  e. .**.** If suc
1f390 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33  cessful, sqlite3
1f3a0 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
1f3b0 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
1f3c0 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53  he page and.** S
1f3d0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
1f3e0 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
1f3f0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
1f400 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68  rying to make th
1f410 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c  e.** page clean,
1f420 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
1f430 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
1f440 49 66 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e  If the page cann
1f450 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c  ot be.** made cl
1f460 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  ean for some oth
1f470 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e  er reason, but n
1f480 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
1f490 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  then SQLITE_OK.*
1f4a0 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79  * is returned by
1f4b0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
1f4c0 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74  keClean() is not
1f4d0 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
1f4e0 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65  ic int pagerStre
1f4f0 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64  ss(void *p, PgHd
1f500 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
1f510 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
1f520 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20  r *)p;.  int rc 
1f530 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1f540 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
1f550 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
1f560 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c   assert( pPg->fl
1f570 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20  ags&PGHDR_DIRTY 
1f580 29 3b 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74  );..  pPg->pDirt
1f590 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67  y = 0;.  if( pag
1f5a0 65 72 55 73 65 4c 6f 67 28 70 50 61 67 65 72 29  erUseLog(pPager)
1f5b0 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65   ){.    /* Write
1f5c0 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
1f5d0 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 74 6f  for this page to
1f5e0 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20   the log. */.   
1f5f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67   rc = sqlite3Log
1f600 46 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70  Frames(pPager->p
1f610 4c 6f 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Log, pPager->pag
1f620 65 53 69 7a 65 2c 20 70 50 67 2c 20 30 2c 20 30  eSize, pPg, 0, 0
1f630 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
1f640 20 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53     /* The doNotS
1f650 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20  ync flag is set 
1f660 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  by the sqlite3Pa
1f670 67 65 72 57 72 69 74 65 28 29 20 66 75 6e 63 74  gerWrite() funct
1f680 69 6f 6e 20 77 68 69 6c 65 20 69 74 0a 20 20 20  ion while it.   
1f690 20 2a 2a 20 69 73 20 6a 6f 75 72 6e 61 6c 6c 69   ** is journalli
1f6a0 6e 67 20 61 20 73 65 74 20 6f 66 20 74 77 6f 20  ng a set of two 
1f6b0 6f 72 20 6d 6f 72 65 20 64 61 74 61 62 61 73 65  or more database
1f6c0 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
1f6d0 73 74 6f 72 65 64 0a 20 20 20 20 2a 2a 20 6f 6e  stored.    ** on
1f6e0 20 74 68 65 20 73 61 6d 65 20 64 69 73 6b 20 73   the same disk s
1f6f0 65 63 74 6f 72 2e 20 53 79 6e 63 69 6e 67 20 74  ector. Syncing t
1f700 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  he journal is no
1f710 74 20 61 6c 6c 6f 77 65 64 20 77 68 69 6c 65 0a  t allowed while.
1f720 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68      ** this is h
1f730 61 70 70 65 6e 69 6e 67 20 61 73 20 69 74 20 69  appening as it i
1f740 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  s important that
1f750 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20   all members of 
1f760 73 75 63 68 20 61 0a 20 20 20 20 2a 2a 20 73 65  such a.    ** se
1f770 74 20 6f 66 20 70 61 67 65 73 20 61 72 65 20 73  t of pages are s
1f780 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 74 6f  ynced to disk to
1f790 67 65 74 68 65 72 2e 20 53 6f 2c 20 69 66 20 74  gether. So, if t
1f7a0 68 65 20 70 61 67 65 20 74 68 69 73 20 66 75 6e  he page this fun
1f7b0 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 73 20  ction.    ** is 
1f7c0 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 63  trying to make c
1f7d0 6c 65 61 6e 20 77 69 6c 6c 20 72 65 71 75 69 72  lean will requir
1f7e0 65 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  e a journal sync
1f7f0 20 61 6e 64 20 74 68 65 20 64 6f 4e 6f 74 53 79   and the doNotSy
1f800 6e 63 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69  nc.    ** flag i
1f810 73 20 73 65 74 2c 20 72 65 74 75 72 6e 20 77 69  s set, return wi
1f820 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
1f830 68 69 6e 67 2e 20 54 68 65 20 70 63 61 63 68 65  hing. The pcache
1f840 20 6c 61 79 65 72 20 77 69 6c 6c 0a 20 20 20 20   layer will.    
1f850 2a 2a 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20  ** just have to 
1f860 67 6f 20 61 68 65 61 64 20 61 6e 64 20 61 6c 6c  go ahead and all
1f870 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
1f880 20 62 75 66 66 65 72 20 69 6e 73 74 65 61 64 20   buffer instead 
1f890 6f 66 0a 20 20 20 20 2a 2a 20 72 65 75 73 69 6e  of.    ** reusin
1f8a0 67 20 70 50 67 2e 0a 20 20 20 20 2a 2a 0a 20 20  g pPg..    **.  
1f8b0 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20    ** Similarly, 
1f8c0 69 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  if the pager has
1f8d0 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
1f8e0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
1f8f0 2c 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  , do not.    ** 
1f900 74 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65  try to write the
1f910 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 67   contents of pPg
1f920 20 74 6f 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f   to disk..    */
1f930 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70  .    if( NEVER(p
1f940 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 0a  Pager->errCode).
1f950 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
1f960 3e 64 6f 4e 6f 74 53 79 6e 63 20 26 26 20 70 50  >doNotSync && pP
1f970 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
1f980 45 45 44 5f 53 59 4e 43 29 0a 20 20 20 20 29 7b  EED_SYNC).    ){
1f990 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1f9a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1f9b0 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68   .    /* Sync th
1f9c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1f9d0 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
1f9e0 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67     if( pPg->flag
1f9f0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
1fa00 43 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  C ){.      rc = 
1fa10 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
1fa20 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
1fa30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1fa40 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
1fa50 20 26 26 20 0a 20 20 20 20 20 20 20 20 21 28 70   && .        !(p
1fa60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
1fa70 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
1fa80 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 20 26 26  LMODE_MEMORY) &&
1fa90 0a 20 20 20 20 20 20 20 20 21 28 73 71 6c 69 74  .        !(sqlit
1faa0 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
1fab0 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
1fac0 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43  ->fd)&SQLITE_IOC
1fad0 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 0a  AP_SAFE_APPEND).
1fae0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1faf0 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
1fb00 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
1fb10 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
1fb20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
1fb30 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
1fb40 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d   If the page num
1fb50 62 65 72 20 6f 66 20 74 68 69 73 20 70 61 67 65  ber of this page
1fb60 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
1fb70 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
1fb80 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   of.    ** the d
1fb90 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69  atabase image, i
1fba0 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65  t may need to be
1fbb0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1fbc0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  sub-journal..   
1fbd0 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61   ** This is beca
1fbe0 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  use the call to 
1fbf0 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
1fc00 6c 69 73 74 28 29 20 62 65 6c 6f 77 20 77 69 6c  list() below wil
1fc10 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 63 74  l not.    ** act
1fc20 75 61 6c 6c 79 20 77 72 69 74 65 20 64 61 74 61  ually write data
1fc30 20 74 6f 20 74 68 65 20 66 69 6c 65 20 69 6e 20   to the file in 
1fc40 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 2a  this case..    *
1fc50 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e 73 69 64 65  *.    ** Conside
1fc60 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  r the following 
1fc70 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76 65 6e  sequence of even
1fc80 74 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ts:.    **.    *
1fc90 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 2a  *   BEGIN;.    *
1fca0 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70  *     <journal p
1fcb0 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20  age X>.    **   
1fcc0 20 20 3c 6d 6f 64 69 66 79 20 70 61 67 65 20 58    <modify page X
1fcd0 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 41 56  >.    **     SAV
1fce0 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20 2a  EPOINT sp;.    *
1fcf0 2a 20 20 20 20 20 20 20 3c 73 68 72 69 6e 6b 20  *       <shrink 
1fd00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
1fd10 20 59 20 70 61 67 65 73 3e 0a 20 20 20 20 2a 2a   Y pages>.    **
1fd20 20 20 20 20 20 20 20 70 61 67 65 72 53 74 72 65         pagerStre
1fd30 73 73 28 70 61 67 65 20 58 29 0a 20 20 20 20 2a  ss(page X).    *
1fd40 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54  *     ROLLBACK T
1fd50 4f 20 73 70 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  O sp;.    **.   
1fd60 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68   ** If (X>Y), th
1fd70 65 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74 72  en when pagerStr
1fd80 65 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61  ess is called pa
1fd90 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ge X will not be
1fda0 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20   written.    ** 
1fdb0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
1fdc0 61 73 65 20 66 69 6c 65 2c 20 62 75 74 20 77 69  ase file, but wi
1fdd0 6c 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66 72  ll be dropped fr
1fde0 6f 6d 20 74 68 65 20 63 61 63 68 65 2e 20 54 68  om the cache. Th
1fdf0 65 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  en,.    ** follo
1fe00 77 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42 41  wing the "ROLLBA
1fe10 43 4b 20 54 4f 20 73 70 22 20 73 74 61 74 65 6d  CK TO sp" statem
1fe20 65 6e 74 2c 20 72 65 61 64 69 6e 67 20 70 61 67  ent, reading pag
1fe30 65 20 58 20 77 69 6c 6c 20 72 65 61 64 0a 20 20  e X will read.  
1fe40 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74    ** data from t
1fe50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1fe60 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74  . This will be t
1fe70 68 65 20 63 6f 70 79 20 6f 66 20 70 61 67 65 20  he copy of page 
1fe80 58 20 61 73 20 69 74 0a 20 20 20 20 2a 2a 20 77  X as it.    ** w
1fe90 61 73 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  as when the tran
1fea0 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c  saction started,
1feb0 20 6e 6f 74 20 61 73 20 69 74 20 77 61 73 20 77   not as it was w
1fec0 68 65 6e 20 22 53 41 56 45 50 4f 49 4e 54 20 73  hen "SAVEPOINT s
1fed0 70 22 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 78  p".    ** was ex
1fee0 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  ecuted..    **. 
1fef0 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69     ** The soluti
1ff00 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20 74  on is to write t
1ff10 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 20  he current data 
1ff20 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f 20  for page X into 
1ff30 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d  the .    ** sub-
1ff40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77  journal file now
1ff50 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
1ff60 6c 72 65 61 64 79 20 74 68 65 72 65 29 2c 20 73  lready there), s
1ff70 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20  o that it will. 
1ff80 20 20 20 2a 2a 20 62 65 20 72 65 73 74 6f 72 65     ** be restore
1ff90 64 20 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74  d to its current
1ffa0 20 76 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20   value when the 
1ffb0 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22  "ROLLBACK TO sp"
1ffc0 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 78 65 63   is .    ** exec
1ffd0 75 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uted..    */.   
1ffe0 20 69 66 28 20 4e 45 56 45 52 28 0a 20 20 20 20   if( NEVER(.    
1fff0 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
20000 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70  K && pPg->pgno>p
20010 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26  Pager->dbSize &&
20020 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
20030 65 28 70 50 67 29 0a 20 20 20 20 29 20 29 7b 0a  e(pPg).    ) ){.
20040 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f        rc = subjo
20050 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a  urnalPage(pPg);.
20060 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
20070 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  Write the conten
20080 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f  ts of the page o
20090 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
200a0 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
200b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
200c0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
200d0 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
200e0 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
200f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  .  }..  /* Mark 
20100 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
20110 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  n. */.  if( rc==
20120 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20130 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
20140 52 45 53 53 20 25 64 20 70 61 67 65 20 25 64 5c  RESS %d page %d\
20150 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
20160 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  er), pPg->pgno))
20170 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
20180 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
20190 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
201a0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
201b0 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 0a 2f 2a  ger, rc);.}.../*
201c0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
201d0 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65   initialize a ne
201e0 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  w Pager object a
201f0 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72  nd put a pointer
20200 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70   to it.** in *pp
20210 50 61 67 65 72 2e 20 54 68 65 20 70 61 67 65 72  Pager. The pager
20220 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c   should eventual
20230 6c 79 20 62 65 20 66 72 65 65 64 20 62 79 20 70  ly be freed by p
20240 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20  assing it.** to 
20250 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
20260 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  e()..**.** The z
20270 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
20280 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f  t is the path to
20290 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
202a0 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49  le to open..** I
202b0 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
202c0 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
202d0 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
202e0 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
202f0 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
20300 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
20310 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72  e cached. Tempor
20320 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 62 65  ary files are be
20330 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
20340 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74  matically when t
20350 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20  hey are closed. 
20360 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
20370 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
20380 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  .** all informat
20390 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63  ion is held in c
203a0 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65  ache. It is neve
203b0 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  r written to dis
203c0 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20  k. .** This can 
203d0 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
203e0 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  ment an in-memor
203f0 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  y database..**.*
20400 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72  * The nExtra par
20410 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 73  ameter specifies
20420 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
20430 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c  ytes of space al
20440 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67  located.** along
20450 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20   with each page 
20460 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20  reference. This 
20470 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62  space is availab
20480 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a  le to the user.*
20490 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65  * via the sqlite
204a0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 29  3PagerGetExtra()
204b0 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   API..**.** The 
204c0 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69  flags argument i
204d0 73 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66  s used to specif
204e0 79 20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61  y properties tha
204f0 74 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20  t affect the.** 
20500 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
20510 20 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c   pager. It shoul
20520 64 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65  d be passed some
20530 20 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61   bitwise combina
20540 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50  tion.** of the P
20550 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
20560 4c 20 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52  L and PAGER_NO_R
20570 45 41 44 4c 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a  EADLOCK flags..*
20580 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67  *.** The vfsFlag
20590 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  s parameter is a
205a0 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73   bitmask to pass
205b0 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61   to the flags pa
205c0 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68  rameter.** of th
205d0 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64  e xOpen() method
205e0 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
205f0 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e   VFS when openin
20600 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20  g files. .**.** 
20610 49 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  If the pager obj
20620 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ect is allocated
20630 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 66 69   and the specifi
20640 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a  ed file opened .
20650 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ** successfully,
20660 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
20670 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61  turned and *ppPa
20680 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  ger set to point
20690 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70   to.** the new p
206a0 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20  ager object. If 
206b0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
206c0 20 2a 70 70 50 61 67 65 72 20 69 73 20 73 65 74   *ppPager is set
206d0 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20   to NULL.** and 
206e0 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72  error code retur
206f0 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ned. This functi
20700 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  on may return SQ
20710 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73  LITE_NOMEM.** (s
20720 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69  qlite3Malloc() i
20730 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  s used to alloca
20740 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49  te memory), SQLI
20750 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a  TE_CANTOPEN or .
20760 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54  ** various SQLIT
20770 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e  E_IO_XXX errors.
20780 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
20790 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69  agerOpen(.  sqli
207a0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
207b0 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
207c0 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ual file system 
207d0 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65  to use */.  Page
207e0 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20  r **ppPager,    
207f0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74       /* OUT: Ret
20800 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74  urn the Pager st
20810 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
20820 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
20830 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  ilename,   /* Na
20840 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
20850 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
20860 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
20870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20880 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70   Extra bytes app
20890 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  end to each in-m
208a0 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
208b0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
208c0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
208d0 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68  s controlling th
208e0 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  is file */.  int
208f0 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20   vfsFlags,      
20900 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70        /* flags p
20910 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
20920 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
20930 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28  en() */.  void (
20940 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65  *xReinit)(DbPage
20950 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74  *) /* Function t
20960 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70  o reinitialize p
20970 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ages */.){.  u8 
20980 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a  *pPtr;.  Pager *
20990 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20  pPager = 0;     
209a0 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
209b0 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e  t to allocate an
209c0 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  d return */.  in
209d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
209e0 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ;      /* Return
209f0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74   code */.  int t
20a00 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20  empFile = 0;    
20a10 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
20a20 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c  temp files (incl
20a30 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  . in-memory file
20a40 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44  s) */.  int memD
20a50 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
20a60 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
20a70 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
20a80 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72   file */.  int r
20a90 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20  eadOnly = 0;    
20aa0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
20ab0 68 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e  his is a read-on
20ac0 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ly file */.  int
20ad0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
20ae0 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74  ;     /* Bytes t
20af0 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65  o allocate for e
20b00 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a  ach journal fd *
20b10 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e  /.  char *zPathn
20b20 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ame = 0;     /* 
20b30 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74  Full path to dat
20b40 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
20b50 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20  int nPathname = 
20b60 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  0;       /* Numb
20b70 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a  er of bytes in z
20b80 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  Pathname */.  in
20b90 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  t useJournal = (
20ba0 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d  flags & PAGER_OM
20bb0 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20  IT_JOURNAL)==0; 
20bc0 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74  /* False to omit
20bd0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e   journal */.  in
20be0 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28  t noReadlock = (
20bf0 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f  flags & PAGER_NO
20c00 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 20 20  _READLOCK)!=0;  
20c10 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20  /* True to omit 
20c20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69  read-lock */.  i
20c30 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20  nt pcacheSize = 
20c40 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a  sqlite3PcacheSiz
20c50 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79  e();       /* By
20c60 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
20c70 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20  for PCache */.  
20c80 75 31 36 20 73 7a 50 61 67 65 44 66 6c 74 20 3d  u16 szPageDflt =
20c90 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
20ca0 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44  PAGE_SIZE;  /* D
20cb0 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
20cc0 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
20cd0 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70   out how much sp
20ce0 61 63 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ace is required 
20cf0 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c  for each journal
20d00 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a   file-handle.  *
20d10 2a 20 28 74 68 65 72 65 20 61 72 65 20 74 77 6f  * (there are two
20d20 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61   of them, the ma
20d30 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  in journal and t
20d40 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e  he sub-journal).
20d50 20 54 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 68   This.  ** is th
20d60 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20  e maximum space 
20d70 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20  required for an 
20d80 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
20d90 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20  l file handle . 
20da0 20 2a 2a 20 61 6e 64 20 61 20 72 65 67 75 6c 61   ** and a regula
20db0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  r journal file-h
20dc0 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74  andle. Note that
20dd0 20 61 20 22 72 65 67 75 6c 61 72 20 6a 6f 75 72   a "regular jour
20de0 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a  nal-handle".  **
20df0 20 6d 61 79 20 62 65 20 61 20 77 72 61 70 70 65   may be a wrappe
20e00 72 20 63 61 70 61 62 6c 65 20 6f 66 20 63 61 63  r capable of cac
20e10 68 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  hing the first p
20e20 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f  ortion of the jo
20e30 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
20e40 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70  in memory to imp
20e50 6c 65 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d 69  lement the atomi
20e60 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
20e70 74 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20  tion (see .  ** 
20e80 73 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f 75 72  source file jour
20e90 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69  nal.c)..  */.  i
20ea0 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  f( sqlite3Journa
20eb0 6c 53 69 7a 65 28 70 56 66 73 29 3e 73 71 6c 69  lSize(pVfs)>sqli
20ec0 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a  te3MemJournalSiz
20ed0 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e  e() ){.    journ
20ee0 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55  alFileSize = ROU
20ef0 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ND8(sqlite3Journ
20f00 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 20  alSize(pVfs));. 
20f10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72   }else{.    jour
20f20 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f  nalFileSize = RO
20f30 55 4e 44 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a  UND8(sqlite3MemJ
20f40 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20  ournalSize());. 
20f50 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
20f60 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
20f70 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65   to NULL in case
20f80 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
20f90 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  . */.  *ppPager 
20fa0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  = 0;..  /* Compu
20fb0 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  te and store the
20fc0 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69   full pathname i
20fd0 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62  n an allocated b
20fe0 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20  uffer pointed.  
20ff0 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61  ** to by zPathna
21000 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68  me, length nPath
21010 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69  name. Or, if thi
21020 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
21030 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76   file,.  ** leav
21040 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65  e both nPathname
21050 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73   and zPathname s
21060 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20  et to 0..  */.  
21070 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
21080 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
21090 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
210a0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
210b0 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61  e+1;.    zPathna
210c0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
210d0 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b  oc(nPathname*2);
210e0 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61  .    if( zPathna
210f0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  me==0 ){.      r
21100 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
21110 45 4d 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  EM;.    }.#ifnde
21120 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
21130 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20 73  MORYDB.    if( s
21140 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
21150 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29  ":memory:")==0 )
21160 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20  {.      memDb = 
21170 31 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61  1;.      zPathna
21180 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  me[0] = 0;.    }
21190 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
211a0 7b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d  {.      zPathnam
211b0 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b  e[0] = 0; /* Mak
211c0 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a  e sure initializ
211d0 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50  ed even if FullP
211e0 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20  athname() fails 
211f0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
21200 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
21210 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
21220 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20  ame, nPathname, 
21230 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
21240 7d 0a 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  }..    nPathname
21250 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
21260 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  30(zPathname);. 
21270 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
21280 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d  E_OK && nPathnam
21290 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  e+8>pVfs->mxPath
212a0 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  name ){.      /*
212b0 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
212c0 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a  taken when the j
212d0 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75  ournal path requ
212e0 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a  ired by.      **
212f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
21300 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20  ing opened will 
21310 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66  be more than pVf
21320 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20  s->mxPathname.  
21330 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20      ** bytes in 
21340 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61  length. This mea
21350 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
21360 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64  cannot be opened
21370 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74  ,.      ** as it
21380 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73   will not be pos
21390 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68  sible to open th
213a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
213b0 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20  r even.      ** 
213c0 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d  check for a hot-
213d0 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72  journal before r
213e0 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f  eading..      */
213f0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
21400 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
21410 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
21420 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
21430 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
21440 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
21450 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
21460 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
21470 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
21480 20 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73   for the Pager s
21490 74 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65  tructure, PCache
214a0 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a   object, the.  *
214b0 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73  * three file des
214c0 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61  criptors, the da
214d0 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
214e0 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
214f0 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65   .  ** file name
21500 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20  . The layout in 
21510 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c  memory is as fol
21520 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
21530 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74      Pager object
21540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21550 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65      (sizeof(Page
21560 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  r) bytes).  **  
21570 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74     PCache object
21580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21590 20 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68     (sqlite3Pcach
215a0 65 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20  eSize() bytes). 
215b0 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
215c0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
215d0 20 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73          (pVfs->s
215e0 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20  zOsFile bytes). 
215f0 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72   **     Sub-jour
21600 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
21610 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
21620 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
21630 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f    **     Main jo
21640 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
21650 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61  e        (journa
21660 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29  lFileSize bytes)
21670 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
21680 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20  se file name    
21690 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68            (nPath
216a0 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20  name+1 bytes).  
216b0 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
216c0 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20  ile name        
216d0 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d         (nPathnam
216e0 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  e+8+1 bytes).  *
216f0 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a  /.  pPtr = (u8 *
21700 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
21710 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73  ro(.    ROUND8(s
21720 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20  izeof(*pPager)) 
21730 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20  +      /* Pager 
21740 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
21750 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69   ROUND8(pcacheSi
21760 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  ze) +           
21770 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  /* PCache object
21780 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
21790 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b  Vfs->szOsFile) +
217a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
217b0 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20  in db file */.  
217c0 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
217d0 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20  e * 2 +         
217e0 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72   /* The two jour
217f0 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20  nal files */ .  
21800 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20    nPathname + 1 
21810 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
21820 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f   /* zFilename */
21830 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b  .    nPathname +
21840 20 38 20 2b 20 31 20 20 20 20 20 20 20 20 20 20   8 + 1          
21850 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20      /* zJournal 
21860 2a 2f 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  */.  );.  assert
21870 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
21880 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e  GNMENT(SQLITE_IN
21890 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c  T_TO_PTR(journal
218a0 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20  FileSize)) );.  
218b0 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20  if( !pPtr ){.   
218c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
218d0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
218e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
218f0 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20  M;.  }.  pPager 
21900 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  =              (
21910 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20  Pager*)(pPtr);. 
21920 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
21930 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28   =    (PCache*)(
21940 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73  pPtr += ROUND8(s
21950 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29  izeof(*pPager)))
21960 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
21970 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65     (sqlite3_file
21980 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
21990 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a  8(pcacheSize));.
219a0 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d    pPager->sjfd =
219b0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
219c0 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
219d0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29  pVfs->szOsFile))
219e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  ;.  pPager->jfd 
219f0 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  =  (sqlite3_file
21a00 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e  *)(pPtr += journ
21a10 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70  alFileSize);.  p
21a20 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
21a30 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50   =    (char*)(pP
21a40 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
21a50 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  eSize);.  assert
21a60 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
21a70 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a  GNMENT(pPager->j
21a80 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  fd) );..  /* Fil
21a90 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a  l in the Pager.z
21aa0 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67  Filename and Pag
21ab0 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66  er.zJournal buff
21ac0 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64  ers, if required
21ad0 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68  . */.  if( zPath
21ae0 6e 61 6d 65 20 29 7b 0a 20 20 20 20 70 50 61 67  name ){.    pPag
21af0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20  er->zJournal =  
21b00 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d   (char*)(pPtr +=
21b10 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 29 3b   nPathname + 1);
21b20 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
21b30 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
21b40 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
21b50 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
21b60 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
21b70 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
21b80 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
21b90 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  mcpy(&pPager->zJ
21ba0 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
21bb0 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38  ], "-journal", 8
21bc0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
21bd0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  r->zFilename[0]=
21be0 3d 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  =0 ) pPager->zJo
21bf0 75 72 6e 61 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20  urnal[0] = 0;.  
21c00 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
21c10 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  Pathname);.  }. 
21c20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20   pPager->pVfs = 
21c30 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pVfs;.  pPager->
21c40 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c  vfsFlags = vfsFl
21c50 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  ags;..  /* Open 
21c60 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
21c70 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
21c80 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
21c90 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29  e[0] && !memDb )
21ca0 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d  {.    int fout =
21cb0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
21cc0 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c         /* VFS fl
21cd0 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ags returned by 
21ce0 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72  xOpen() */.    r
21cf0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
21d00 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
21d10 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
21d20 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c  r->fd, vfsFlags,
21d30 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 72 65 61   &fout);.    rea
21d40 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51  dOnly = (fout&SQ
21d50 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
21d60 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  LY);..    /* If 
21d70 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63  the file was suc
21d80 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64  cessfully opened
21d90 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
21da0 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63  access,.    ** c
21db0 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20  hoose a default 
21dc0 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73  page size in cas
21dd0 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65  e we have to cre
21de0 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
21df0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
21e00 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
21e10 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d  ize is the maxim
21e20 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20  um of:.    **.  
21e30 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45    **    + SQLITE
21e40 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
21e50 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  ZE,.    **    + 
21e60 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
21e70 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53  ed by sqlite3OsS
21e80 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
21e90 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67  **    + The larg
21ea0 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68  est page size th
21eb0 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  at can be writte
21ec0 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  n atomically..  
21ed0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
21ee0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72  =SQLITE_OK && !r
21ef0 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
21f00 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
21f10 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
21f20 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41  sert(SQLITE_DEFA
21f30 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53  ULT_PAGE_SIZE<=S
21f40 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
21f50 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  T_PAGE_SIZE);.  
21f60 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44 66      if( szPageDf
21f70 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  lt<pPager->secto
21f80 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  rSize ){.       
21f90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63   if( pPager->sec
21fa0 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  torSize>SQLITE_M
21fb0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
21fc0 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
21fd0 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53    szPageDflt = S
21fe0 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
21ff0 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20  T_PAGE_SIZE;.   
22000 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22010 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
22020 20 3d 20 28 75 31 36 29 70 50 61 67 65 72 2d 3e   = (u16)pPager->
22030 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
22040 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69      }.      }.#i
22050 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
22060 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
22070 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
22080 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
22090 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
220a0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
220b0 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  >fd);.        in
220c0 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73  t ii;.        as
220d0 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
220e0 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
220f0 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  2>>8));.        
22100 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
22110 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28  CAP_ATOMIC64K==(
22120 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20  65536>>8));.    
22130 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
22140 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
22150 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b  GE_SIZE<=65536);
22160 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
22170 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d  szPageDflt; ii<=
22180 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
22190 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69  LT_PAGE_SIZE; ii
221a0 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20  =ii*2){.        
221b0 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54    if( iDc&(SQLIT
221c0 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
221d0 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20  ii>>8)) ){.     
221e0 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
221f0 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20  t = ii;.        
22200 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
22210 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
22220 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
22230 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72  /* If a temporar
22240 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73  y file is reques
22250 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f  ted, it is not o
22260 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  pened immediatel
22270 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  y..    ** In thi
22280 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74  s case we accept
22290 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
222a0 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79  e size and delay
222b0 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
222c0 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c   opening the fil
222d0 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  e until the firs
222e0 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74  t call to OsWrit
222f0 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
22300 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  ** This branch i
22310 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61  s also run for a
22320 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
22330 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f  base. An in-memo
22340 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  ry.    ** databa
22350 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  se is the same a
22360 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68  s a temp-file th
22370 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  at is never writ
22380 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a  ten out to.    *
22390 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20  * disk and uses 
223a0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c  an in-memory rol
223b0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20  lback journal.. 
223c0 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46     */ .    tempF
223d0 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ile = 1;.    pPa
223e0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
223f0 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
22400 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66    readOnly = (vf
22410 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
22420 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
22430 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
22440 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61  owing call to Pa
22450 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
22460 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74   serves to set t
22470 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a  he value of .  *
22480 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
22490 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65   and to allocate
224a0 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53   the Pager.pTmpS
224b0 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a  pace buffer..  *
224c0 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
224d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
224e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d  ert( pPager->mem
224f0 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  Db==0 );.    rc 
22500 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
22510 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
22520 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d  , &szPageDflt, -
22530 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
22540 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22550 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
22560 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  an error occurre
22570 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74  d in either of t
22580 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c  he blocks above,
22590 20 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a 20   free the .  ** 
225a0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
225b0 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69  and close the fi
225c0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  le..  */.  if( r
225d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
225e0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
225f0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  ger->pTmpSpace )
22600 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  ;.    sqlite3OsC
22610 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
22620 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
22630 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ee(pPager);.    
22640 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
22650 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
22660 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63  the PCache objec
22670 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  t. */.  assert( 
22680 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20  nExtra<1000 );. 
22690 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38   nExtra = ROUND8
226a0 28 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69  (nExtra);.  sqli
226b0 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a  te3PcacheOpen(sz
226c0 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61  PageDflt, nExtra
226d0 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20  , !memDb,.      
226e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d                !m
226f0 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73  emDb?pagerStress
22700 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  :0, (void *)pPag
22710 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61  er, pPager->pPCa
22720 63 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52  che);..  PAGERTR
22730 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE(("OPEN %d %s
22740 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
22750 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70  D(pPager->fd), p
22760 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
22770 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
22780 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70  OPEN %p %s\n", p
22790 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a  Pager, pPager->z
227a0 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50  Filename))..  pP
227b0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
227c0 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61   = (u8)useJourna
227d0 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52  l;.  pPager->noR
227e0 65 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61  eadlock = (noRea
227f0 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c  dlock && readOnl
22800 79 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50  y) ?1:0;.  /* pP
22810 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
22820 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
22830 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
22840 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
22850 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a  r->nRef = 0; */.
22860 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
22870 56 61 6c 69 64 20 3d 20 28 75 38 29 6d 65 6d 44  Valid = (u8)memD
22880 62 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  b;.  /* pPager->
22890 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  stmtSize = 0; */
228a0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
228b0 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  mtJSize = 0; */.
228c0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61    /* pPager->nPa
228d0 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ge = 0; */.  pPa
228e0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51  ger->mxPgno = SQ
228f0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f  LITE_MAX_PAGE_CO
22900 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  UNT;.  /* pPager
22910 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
22920 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73  UNLOCK; */.  ass
22930 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
22940 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20  te == (tempFile 
22950 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ? PAGER_EXCLUSIV
22960 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  E : PAGER_UNLOCK
22970 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  ) );.  /* pPager
22980 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a  ->errMask = 0; *
22990 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  /.  pPager->temp
229a0 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46  File = (u8)tempF
229b0 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74  ile;.  assert( t
229c0 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
229d0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
229e0 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  L .          || 
229f0 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
22a00 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
22a10 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72  USIVE );.  asser
22a20 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
22a30 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d  MODE_EXCLUSIVE==
22a40 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  1 );.  pPager->e
22a50 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28  xclusiveMode = (
22a60 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20  u8)tempFile; .  
22a70 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
22a80 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
22a90 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
22aa0 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75  ager->memDb = (u
22ab0 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65  8)memDb;.  pPage
22ac0 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75  r->readOnly = (u
22ad0 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a  8)readOnly;.  /*
22ae0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
22af0 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 61 73 73 65  c = 0; */.  asse
22b00 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c  rt( useJournal |
22b10 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
22b20 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  le );.  pPager->
22b30 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  noSync = pPager-
22b40 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
22b50 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
22b60 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f  pPager->noSync ?
22b70 30 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  0:1;.  pPager->s
22b80 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49  ync_flags = SQLI
22b90 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
22ba0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
22bb0 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  rst = 0; */.  /*
22bc0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
22bd0 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20  ynced = 0; */.  
22be0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  /* pPager->pLast
22bf0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
22c00 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36  r->nExtra = (u16
22c10 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65  )nExtra;.  pPage
22c20 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
22c30 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  mit = SQLITE_DEF
22c40 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a  AULT_JOURNAL_SIZ
22c50 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72  E_LIMIT;.  asser
22c60 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
22c70 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c  ->fd) || tempFil
22c80 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72  e );.  setSector
22c90 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
22ca0 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20  if( !useJournal 
22cb0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
22cc0 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
22cd0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
22ce0 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  FF;.  }else if( 
22cf0 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61  memDb ){.    pPa
22d00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
22d10 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
22d20 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d  MODE_MEMORY;.  }
22d30 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42  .  /* pPager->xB
22d40 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20  usyHandler = 0; 
22d50 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
22d60 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
22d70 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
22d80 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52  ->xReiniter = xR
22d90 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73  einit;.  /* mems
22da0 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
22db0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
22dc0 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a  er->aHash)); */.
22dd0 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50  .  *ppPager = pP
22de0 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53  ager;.  return S
22df0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f  QLITE_OK;.}..../
22e00 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
22e10 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  on is called aft
22e20 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67  er transitioning
22e30 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f   from PAGER_UNLO
22e40 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53  CK to.** PAGER_S
22e50 48 41 52 45 44 20 73 74 61 74 65 2e 20 49 74 20  HARED state. It 
22e60 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20 69  tests if there i
22e70 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
22e80 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68  present in.** th
22e90 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f  e file-system fo
22ea0 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
22eb0 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  r. A hot journal
22ec0 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a   is one that .**
22ed0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
22ee0 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64  yed back. Accord
22ef0 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ing to this func
22f00 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72  tion, a hot-jour
22f10 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73  nal.** file exis
22f20 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ts if the follow
22f30 69 6e 67 20 63 72 69 74 65 72 69 61 20 61 72 65  ing criteria are
22f40 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20   met:.**.**   * 
22f50 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
22f60 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66   exists in the f
22f70 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a  ile system, and.
22f80 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73  **   * No proces
22f90 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
22fa0 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
22fb0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
22fc0 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20  se file, and.** 
22fd0 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65    * The database
22fe0 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20   file itself is 
22ff0 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 62  greater than 0 b
23000 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e  ytes in size, an
23010 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72  d.**   * The fir
23020 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a  st byte of the j
23030 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
23040 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78  ts and is not 0x
23050 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  00..**.** If the
23060 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
23070 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23080 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f  le is 0 but a jo
23090 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78  urnal file.** ex
230a0 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72  ists, that is pr
230b0 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f  obably an old jo
230c0 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20  urnal left over 
230d0 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20  from a prior.** 
230e0 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
230f0 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20  e same name. In 
23100 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
23110 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a  urnal file is.**
23120 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75 73   just deleted us
23130 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70  ing OsDelete, *p
23140 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f  Exists is set to
23150 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
23160 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
23170 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
23180 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65  ine does not che
23190 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ck if there is a
231a0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
231b0 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74  filename.** at t
231c0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
231d0 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c  le. If there is,
231e0 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72   and that master
231f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
23200 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
23210 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
23220 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65  l file is not re
23230 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69  ally hot. In thi
23240 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72  s.** case this r
23250 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
23260 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74  rn a false-posit
23270 69 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70  ive. The pager_p
23280 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75  layback().** rou
23290 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76  tine will discov
232a0 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  er that the jour
232b0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
232c0 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a  really hot and .
232d0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  ** will not roll
232e0 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a   it back. .**.**
232f0 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   If a hot-journa
23300 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20  l file is found 
23310 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73  to exist, *pExis
23320 74 73 20 69 73 20 73 65 74 20 74 6f 20 31 20 61  ts is set to 1 a
23330 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  nd .** SQLITE_OK
23340 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f   returned. If no
23350 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
23360 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70  e is present, *p
23370 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74  Exists is.** set
23380 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
23390 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
233a0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
233b0 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
233c0 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
233d0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
233e0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
233f0 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 49  le exists, the I
23400 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  O error.** code 
23410 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
23420 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45  the value of *pE
23430 78 69 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e  xists is undefin
23440 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
23450 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  t hasHotJournal(
23460 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
23470 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20  nt *pExists){.  
23480 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
23490 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
234a0 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  r->pVfs;.  int r
234b0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
234c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
234d0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
234e0 20 65 78 69 73 74 73 3b 20 20 20 20 20 20 20 20   exists;        
234f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
23500 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20  ue if a journal 
23510 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20  file is present 
23520 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
23530 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
23540 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
23550 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
23560 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
23570 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73  er->fd) );.  ass
23580 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61  ert( !isOpen(pPa
23590 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61  ger->jfd) );.  a
235a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
235b0 74 61 74 65 20 3c 3d 20 50 41 47 45 52 5f 53 48  tate <= PAGER_SH
235c0 41 52 45 44 20 29 3b 0a 0a 20 20 2a 70 45 78 69  ARED );..  *pExi
235d0 73 74 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  sts = 0;.  rc = 
235e0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
235f0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
23600 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
23610 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65  CCESS_EXISTS, &e
23620 78 69 73 74 73 29 3b 0a 20 20 69 66 28 20 72 63  xists);.  if( rc
23630 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
23640 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74  xists ){.    int
23650 20 6c 6f 63 6b 65 64 3b 20 20 20 20 20 20 20 20   locked;        
23660 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
23670 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73   if some process
23680 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
23690 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f  D lock */..    /
236a0 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  * Race condition
236b0 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20   here:  Another 
236c0 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61  process might ha
236d0 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20  ve been holding 
236e0 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52  the.    ** the R
236f0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64  ESERVED lock and
23700 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20   have a journal 
23710 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69  open at the sqli
23720 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20  te3OsAccess() . 
23730 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65     ** call above
23740 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74  , but then delet
23750 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  e the journal an
23760 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20  d drop the lock 
23770 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65  before.    ** we
23780 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c   get to the foll
23790 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43  owing sqlite3OsC
237a0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
237b0 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61  () call.  If tha
237c0 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20  t.    ** is the 
237d0 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69  case, this routi
237e0 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74  ne might think t
237f0 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
23800 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a  urnal when.    *
23810 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72 65 20  * in fact there 
23820 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72  is none.  This r
23830 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73  esults in a fals
23840 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63 68  e-positive which
23850 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
23860 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74 68  dealt with by th
23870 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69  e playback routi
23880 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38  ne.  Ticket #388
23890 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  3..    */.    rc
238a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63   = sqlite3OsChec
238b0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50  kReservedLock(pP
238c0 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65  ager->fd, &locke
238d0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
238e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f  SQLITE_OK && !lo
238f0 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e  cked ){.      in
23900 74 20 6e 50 61 67 65 3b 0a 0a 20 20 20 20 20 20  t nPage;..      
23910 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 73 69 7a  /* Check the siz
23920 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
23930 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20 63 6f  e file. If it co
23940 6e 73 69 73 74 73 20 6f 66 20 30 20 70 61 67 65  nsists of 0 page
23950 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  s,.      ** then
23960 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
23970 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65 20 74 68  nal file. See th
23980 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
23990 20 61 62 6f 76 65 20 66 6f 72 20 0a 20 20 20 20   above for .    
239a0 20 20 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e 69    ** the reasoni
239b0 6e 67 20 68 65 72 65 2e 20 20 44 65 6c 65 74 65  ng here.  Delete
239c0 20 74 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f   the obsolete jo
239d0 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65 72  urnal file under
239e0 0a 20 20 20 20 20 20 2a 2a 20 61 20 52 45 53 45  .      ** a RESE
239f0 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f  RVED lock to avo
23a00 69 64 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  id race conditio
23a10 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f 69 64 20  ns and to avoid 
23a20 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20 20  violating.      
23a30 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20  ** [H33020]..   
23a40 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
23a50 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
23a60 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
23a70 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  nPage);.      if
23a80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23a90 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
23aa0 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
23ab0 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
23ac0 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
23ad0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
23ae0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
23af0 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45  ger->fd, RESERVE
23b00 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f  D_LOCK)==SQLITE_
23b10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
23b20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
23b30 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  e(pVfs, pPager->
23b40 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
23b50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23b60 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  3OsUnlock(pPager
23b70 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
23b80 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  K);.          }.
23b90 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23ba0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
23bb0 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ();.        }els
23bc0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
23bd0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
23be0 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f   exists and no o
23bf0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
23c00 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a 20  has a reserved. 
23c10 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67           ** or g
23c20 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
23c30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
23c40 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74  . Now check that
23c50 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20   there is.      
23c60 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20      ** at least 
23c70 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74  one non-zero byt
23c80 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20  es at the start 
23c90 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
23ca0 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ile..          *
23cb0 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 74  * If there is, t
23cc0 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20  hen we consider 
23cd0 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  this journal to 
23ce0 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20  be hot. If not, 
23cf0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74  .          ** it
23d00 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e   can be ignored.
23d10 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
23d20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
23d30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
23d40 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
23d50 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  _MAIN_JOURNAL;. 
23d60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
23d70 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
23d80 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
23d90 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
23da0 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20   f, &f);.       
23db0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
23dc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
23dd0 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20 30      u8 first = 0
23de0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
23df0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
23e00 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76  (pPager->jfd, (v
23e10 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c  oid *)&first, 1,
23e20 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
23e30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23e40 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
23e50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23e60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
23e70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
23e80 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
23e90 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
23ea0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
23eb0 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20       *pExists = 
23ec0 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20  (first!=0);.    
23ed0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
23ee0 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f  rc==SQLITE_CANTO
23ef0 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  PEN ){.         
23f00 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e     /* If we cann
23f10 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c  ot open the roll
23f20 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  back journal fil
23f30 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65  e in order to se
23f40 65 20 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  e if.           
23f50 20 2a 2a 20 69 74 73 20 68 61 73 20 61 20 7a 65   ** its has a ze
23f60 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74 20  ro header, that 
23f70 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
23f80 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72  an I/O error, or
23f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
23fa0 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20  it might be due 
23fb0 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64  to the race cond
23fc0 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
23fd0 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20  above and in.   
23fe0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b           ** tick
23ff0 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68 65  et #3883.  Eithe
24000 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68  r way, assume th
24010 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
24020 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20  s hot..         
24030 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
24040 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69   be a false posi
24050 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69 74  tive.  But if it
24060 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20   is, then the.  
24070 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74            ** aut
24080 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70  omatic journal p
24090 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f  layback and reco
240a0 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77  very mechanism w
240b0 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20  ill deal.       
240c0 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20       ** with it 
240d0 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49  under an EXCLUSI
240e0 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65  VE lock where we
240f0 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a   do not need to.
24100 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77              ** w
24110 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74  orry so much wit
24120 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  h race condition
24130 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  s..            *
24140 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  /.            *p
24150 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20  Exists = 1;.    
24160 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
24170 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
24180 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
24190 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
241a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
241b0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20  ./*.** Check if 
241c0 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74  the *-wal file t
241d0 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
241e0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
241f0 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67 65 72  opened by pPager
24200 0a 2a 2a 20 65 78 69 73 74 73 2e 20 41 73 73 75  .** exists. Assu
24210 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63  ming no error oc
24220 63 75 72 73 2c 20 73 65 74 20 2a 70 45 78 69 73  curs, set *pExis
24230 74 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 66  ts to 1 if the f
24240 69 6c 65 20 65 78 69 73 74 73 2c 0a 2a 2a 20 6f  ile exists,.** o
24250 72 20 30 20 6f 74 68 65 72 77 69 73 65 20 61 6e  r 0 otherwise an
24260 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
24270 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 6f 72 20  OK. If an IO or 
24280 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
24290 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 6e 20 53  , return.** an S
242a0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
242b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
242c0 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53  er must hold a S
242d0 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  HARED lock on th
242e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
242f0 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20  to call this.** 
24300 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73  function. Becaus
24310 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
24320 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69  ock on the db fi
24330 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 74  le is required t
24340 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57  o delete .** a W
24350 41 4c 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73  AL, this ensures
24360 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63   there is no rac
24370 65 20 63 6f 6e 64 69 74 69 6f 6e 20 62 65 74 77  e condition betw
24380 65 65 6e 20 74 68 65 20 78 41 63 63 65 73 73 28  een the xAccess(
24390 29 20 0a 2a 2a 20 62 65 6c 6f 77 20 61 6e 64 20  ) .** below and 
243a0 61 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65 69  an xDelete() bei
243b0 6e 67 20 65 78 65 63 75 74 65 64 20 62 79 20 73  ng executed by s
243c0 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  ome other connec
243d0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
243e0 69 6e 74 20 70 61 67 65 72 48 61 73 57 41 4c 28  int pagerHasWAL(
243f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
24400 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20  nt *pExists){.  
24410 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
24420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24430 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
24440 2f 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  /..  if( !pPager
24450 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
24460 20 20 63 68 61 72 20 2a 7a 4c 6f 67 20 3d 20 73    char *zLog = s
24470 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
24480 25 73 2d 77 61 6c 22 2c 20 70 50 61 67 65 72 2d  %s-wal", pPager-
24490 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
244a0 20 69 66 28 20 21 7a 4c 6f 67 20 29 7b 0a 20 20   if( !zLog ){.  
244b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
244c0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
244d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
244e0 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 50 61  ite3OsAccess(pPa
244f0 67 65 72 2d 3e 70 56 66 73 2c 20 7a 4c 6f 67 2c  ger->pVfs, zLog,
24500 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
24510 58 49 53 54 53 2c 20 70 45 78 69 73 74 73 29 3b  XISTS, pExists);
24520 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
24530 72 65 65 28 7a 4c 6f 67 29 3b 0a 20 20 20 20 7d  ree(zLog);.    }
24540 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
24550 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
24560 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a    *pExists = 0;.
24570 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
24580 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .}..static int p
24590 61 67 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74  agerOpenSnapshot
245a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
245b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
245c0 20 63 68 61 6e 67 65 64 3b 0a 0a 20 20 61 73 73   changed;..  ass
245d0 65 72 74 28 20 70 61 67 65 72 55 73 65 4c 6f 67  ert( pagerUseLog
245e0 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72  (pPager) );..  r
245f0 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 4f 70  c = sqlite3LogOp
24600 65 6e 53 6e 61 70 73 68 6f 74 28 70 50 61 67 65  enSnapshot(pPage
24610 72 2d 3e 70 4c 6f 67 2c 20 26 63 68 61 6e 67 65  r->pLog, &change
24620 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  d);.  if( rc==SQ
24630 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
24640 6e 74 20 64 75 6d 6d 79 3b 0a 20 20 20 20 69 66  nt dummy;.    if
24650 28 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20  ( changed ){.   
24660 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
24670 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
24680 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
24690 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61  ->errCode || pPa
246a0 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
246b0 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ==0 );.    }.   
246c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
246d0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
246e0 65 72 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 7d  er, &dummy);.  }
246f0 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  .  pPager->state
24700 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
24710 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
24720 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
24730 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
24740 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72  to obtain a shar
24750 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ed lock on the d
24760 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
24770 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
24780 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  o call sqlite3Pa
24790 67 65 72 41 63 71 75 69 72 65 28 29 20 75 6e 74  gerAcquire() unt
247a0 69 6c 20 61 66 74 65 72 20 74 68 69 73 20 66 75  il after this fu
247b0 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65  nction.** has be
247c0 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
247d0 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61  called. If a sha
247e0 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65  red-lock is alre
247f0 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a  ady held when.**
24800 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
24810 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
24820 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
24830 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65  he following ope
24840 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f  rations are also
24850 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68   performed by th
24860 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
24870 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65 20 70  **   1) If the p
24880 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  ager is currentl
24890 79 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43  y in PAGER_UNLOC
248a0 4b 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b  K state (no lock
248b0 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e   held.**      on
248c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
248d0 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74  le), then an att
248e0 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
248f0 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20  obtain a.**     
24900 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20   SHARED lock on 
24910 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
24920 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61  e. Immediately a
24930 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a  fter obtaining.*
24940 2a 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45  *      the SHARE
24950 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65  D lock, the file
24960 2d 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b  -system is check
24970 65 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ed for a hot-jou
24980 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68  rnal,.**      wh
24990 69 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61  ich is played ba
249a0 63 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46  ck if present. F
249b0 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74  ollowing any hot
249c0 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20  -journal .**    
249d0 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20    rollback, the 
249e0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
249f0 63 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61  cache are valida
24a00 74 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a  ted by checking.
24a10 2a 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61  **      the 'cha
24a20 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65  nge-counter' fie
24a30 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ld of the databa
24a40 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61  se file header a
24a50 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61  nd.**      disca
24a60 72 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65  rded if they are
24a70 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76   found to be inv
24a80 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  alid..**.**   2)
24a90 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
24aa0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
24ab0 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20  usive-mode, and 
24ac0 74 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e  there are curren
24ad0 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f  tly.**      no o
24ae0 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
24af0 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67  ences to any pag
24b00 65 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68  es, and is in th
24b10 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a  e error state,.*
24b20 2a 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61  *      then an a
24b30 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
24b40 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f  o clear the erro
24b50 72 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61  r state by disca
24b60 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  rding.**      th
24b70 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
24b80 65 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64  e page cache and
24b90 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e   rolling back an
24ba0 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a  y open journal.*
24bb0 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a  *      file..**.
24bc0 2a 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  ** If the operat
24bd0 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79  ion described by
24be0 20 28 32 29 20 61 62 6f 76 65 20 69 73 20 6e 6f   (2) above is no
24bf0 74 20 61 74 74 65 6d 70 74 65 64 2c 20 61 6e 64  t attempted, and
24c00 20 69 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 72   if the.** pager
24c10 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 20   is in an error 
24c20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e  state other than
24c30 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 77 68 65   SQLITE_FULL whe
24c40 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
24c50 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 73  ,.** the error s
24c60 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  tate error code 
24c70 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 74 20  is returned. It 
24c80 69 73 20 70 65 72 6d 69 74 74 65 64 20 74 6f 20  is permitted to 
24c90 72 65 61 64 20 74 68 65 0a 2a 2a 20 64 61 74 61  read the.** data
24ca0 62 61 73 65 20 77 68 65 6e 20 69 6e 20 53 51 4c  base when in SQL
24cb0 49 54 45 5f 46 55 4c 4c 20 65 72 72 6f 72 20 73  ITE_FULL error s
24cc0 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  tate..**.** Othe
24cd0 72 77 69 73 65 2c 20 69 66 20 65 76 65 72 79 74  rwise, if everyt
24ce0 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
24cf0 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
24d00 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
24d10 0a 2a 2a 20 49 4f 20 65 72 72 6f 72 20 6f 63 63  .** IO error occ
24d20 75 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e  urs while lockin
24d30 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  g the database, 
24d40 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68  checking for a h
24d50 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  ot-journal.** fi
24d60 6c 65 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  le or rolling ba
24d70 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ck a journal fil
24d80 65 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  e, the IO error 
24d90 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
24da0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24db0 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  PagerSharedLock(
24dc0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
24dd0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
24de0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
24df0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
24e00 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45  ode */.  int isE
24e10 72 72 6f 72 52 65 73 65 74 20 3d 20 30 3b 20 20  rrorReset = 0;  
24e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
24e30 72 75 65 20 69 66 20 72 65 63 6f 76 65 72 69 6e  rue if recoverin
24e40 67 20 66 72 6f 6d 20 65 72 72 6f 72 20 73 74 61  g from error sta
24e50 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  te */..  /* This
24e60 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
24e70 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74   called from b-t
24e80 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65  ree and only whe
24e90 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20  n there are no. 
24ea0 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   ** outstanding 
24eb0 70 61 67 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  pages */.  asser
24ec0 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  t( sqlite3Pcache
24ed0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
24ee0 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a  >pPCache)==0 );.
24ef0 20 20 69 66 28 20 4e 45 56 45 52 28 4d 45 4d 44    if( NEVER(MEMD
24f00 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  B && pPager->err
24f10 43 6f 64 65 29 20 29 7b 20 72 65 74 75 72 6e 20  Code) ){ return 
24f20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
24f30 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
24f40 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
24f50 61 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20  an error-state, 
24f60 6e 6f 77 20 69 73 20 61 20 63 68 61 6e 63 65 20  now is a chance 
24f70 74 6f 20 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68  to clear.  ** th
24f80 65 20 65 72 72 6f 72 2e 20 44 69 73 63 61 72 64  e error. Discard
24f90 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
24fa0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
24fb0 20 61 6e 64 20 72 6f 6c 6c 62 61 63 6b 0a 20 20   and rollback.  
24fc0 2a 2a 20 61 6e 79 20 68 6f 74 20 6a 6f 75 72 6e  ** any hot journ
24fd0 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  al in the file-s
24fe0 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66  ystem..  */.  if
24ff0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
25000 65 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 4f  e ){.    if( isO
25010 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
25020 20 7c 7c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75   || pPager->zJou
25030 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 73  rnal ){.      is
25040 45 72 72 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a  ErrorReset = 1;.
25050 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
25060 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49  ->errCode = SQLI
25070 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72  TE_OK;.    pager
25080 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
25090 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72    }..  if( pager
250a0 55 73 65 4c 6f 67 28 70 50 61 67 65 72 29 20 29  UseLog(pPager) )
250b0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
250c0 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 70 50 61  OpenSnapshot(pPa
250d0 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ger);.  }else if
250e0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
250f0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c  =PAGER_UNLOCK ||
25100 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b   isErrorReset ){
25110 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
25120 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
25130 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
25140 20 20 69 6e 74 20 69 73 48 6f 74 4a 6f 75 72 6e    int isHotJourn
25150 61 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  al = 0;.    int 
25160 69 73 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61  isWal = 0;.    a
25170 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
25180 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
25190 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
251a0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
251b0 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  he)==0 );.    if
251c0 28 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64  ( pPager->noRead
251d0 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 61 73  lock ){.      as
251e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 72 65  sert( pPager->re
251f0 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 20 20 20 20  adOnly );.      
25200 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
25210 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
25220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
25230 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
25240 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53  n_lock(pPager, S
25250 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
25260 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
25270 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
25280 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
25290 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
252a0 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72  OCK );.        r
252b0 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
252c0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
252d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
252e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
252f0 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c  >state>=SHARED_L
25300 4f 43 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  OCK );..    /* I
25310 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
25320 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65   exists, and the
25330 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45  re is no RESERVE
25340 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  D lock on the.  
25350 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
25360 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68  le, then it eith
25370 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  er needs to be p
25380 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65  layed back or de
25390 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
253a0 20 20 69 66 28 20 21 69 73 45 72 72 6f 72 52 65    if( !isErrorRe
253b0 73 65 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  set ){.      ass
253c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
253d0 74 65 20 3c 3d 20 50 41 47 45 52 5f 53 48 41 52  te <= PAGER_SHAR
253e0 45 44 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ED );.      rc =
253f0 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70   hasHotJournal(p
25400 50 61 67 65 72 2c 20 26 69 73 48 6f 74 4a 6f 75  Pager, &isHotJou
25410 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  rnal);.      if(
25420 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
25430 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  {.        goto f
25440 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ailed;.      }. 
25450 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 45     }.    if( isE
25460 72 72 6f 72 52 65 73 65 74 20 7c 7c 20 69 73 48  rrorReset || isH
25470 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  otJournal ){.   
25480 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
25490 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
254a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
254b0 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
254c0 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  it is.      ** i
254d0 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20  mportant that a 
254e0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
254f0 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e   not obtained on
25500 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a   the way to the.
25510 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49        ** EXCLUSI
25520 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77  VE lock. If it w
25530 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f  ere, another pro
25540 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20  cess might open 
25550 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
25560 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
25570 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
25580 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
25590 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
255a0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
255b0 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
255c0 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
255d0 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
255e0 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  g the .      ** 
255f0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  hot-journal back
25600 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
25610 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
25620 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
25630 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
25640 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  ot requested, an
25650 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  y.      ** other
25660 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74   process attempt
25670 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68  ing to access th
25680 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
25690 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20  will get to .   
256a0 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74     ** this point
256b0 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
256c0 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20   fail to obtain 
256d0 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  its own EXCLUSIV
256e0 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a  E lock .      **
256f0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
25700 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   file..      */.
25710 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
25720 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55 53 49 56  ->state<EXCLUSIV
25730 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
25740 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
25750 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
25760 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
25770 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
25780 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
25790 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
257a0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
257b0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20  , rc);.         
257c0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
257d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
257e0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
257f0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
25800 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20  .      }. .     
25810 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75   /* Open the jou
25820 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72  rnal for read/wr
25830 69 74 65 20 61 63 63 65 73 73 2e 20 54 68 69 73  ite access. This
25840 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a   is because in .
25850 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69        ** exclusi
25860 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74  ve-access mode t
25870 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
25880 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20  or will be kept 
25890 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 2a  open and.      *
258a0 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20  * possibly used 
258b0 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
258c0 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73  n later on. On s
258d0 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65  ome systems, the
258e0 0a 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e  .      ** OsTrun
258f0 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64  cate() call used
25900 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
25910 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72  cess mode also r
25920 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
25930 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 66 69   a read/write fi
25940 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20  le handle..     
25950 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69   */.      if( !i
25960 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
25970 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  d) ){.        in
25980 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72  t res;.        r
25990 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
259a0 65 73 73 28 70 56 66 73 2c 70 50 61 67 65 72 2d  ess(pVfs,pPager-
259b0 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45  >zJournal,SQLITE
259c0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 26  _ACCESS_EXISTS,&
259d0 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  res);.        if
259e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
259f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
25a00 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20   res ){.        
25a10 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30      int fout = 0
25a20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
25a30 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  t f = SQLITE_OPE
25a40 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
25a50 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
25a60 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
25a70 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
25a80 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
25a90 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
25aa0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
25ab0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
25ac0 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
25ad0 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20  d, f, &fout);.  
25ae0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
25af0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25b00 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
25b10 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20  ->jfd) );.      
25b20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
25b30 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26  LITE_OK && fout&
25b40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
25b50 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
25b60 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25b70 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
25b80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
25b90 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
25ba0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
25bb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25bc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25bd0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
25be0 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f   journal does no
25bf0 74 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61  t exist, it usua
25c00 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73  lly means that s
25c10 6f 6d 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  ome .           
25c20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   ** other connec
25c30 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20  tion managed to 
25c40 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20  get in and roll 
25c50 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a  it back before .
25c60 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
25c70 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  his connection o
25c80 62 74 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c  btained the excl
25c90 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65  usive lock above
25ca0 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20  . Or, it .      
25cb0 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61        ** may mea
25cc0 6e 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  n that the pager
25cd0 20 77 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f   was in the erro
25ce0 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r-state when thi
25cf0 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  s.            **
25d00 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
25d10 6c 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75  lled and the jou
25d20 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
25d30 6f 74 20 65 78 69 73 74 2e 20 20 2a 2f 0a 20 20  ot exist.  */.  
25d40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
25d50 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
25d60 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b  tion(pPager, 0);
25d70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
25d80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
25d90 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
25da0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25db0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
25dc0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
25dd0 20 52 65 73 65 74 20 74 68 65 20 6a 6f 75 72 6e   Reset the journ
25de0 61 6c 20 73 74 61 74 75 73 20 66 69 65 6c 64 73  al status fields
25df0 20 74 6f 20 69 6e 64 69 63 61 74 65 73 20 74 68   to indicates th
25e00 61 74 20 77 65 20 68 61 76 65 20 6e 6f 0a 20 20  at we have no.  
25e10 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
25e20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 69 73 20  journal at this 
25e30 74 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70  time. */.      p
25e40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
25e50 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  arted = 0;.     
25e60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
25e70 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Off = 0;.      p
25e80 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
25e90 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
25ea0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
25eb0 20 30 3b 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4d   0;. .      /* M
25ec0 61 6b 65 20 73 75 72 65 20 74 68 65 20 6a 6f 75  ake sure the jou
25ed0 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65  rnal file has be
25ee0 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  en synced to dis
25ef0 6b 2e 20 2a 2f 0a 20 0a 20 20 20 20 20 20 2f 2a  k. */. .      /*
25f00 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65   Playback and de
25f10 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
25f20 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61  .  Drop the data
25f30 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20  base write.     
25f40 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61   ** lock and rea
25f50 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
25f60 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20  lock. Purge the 
25f70 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20  cache before.   
25f80 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61     ** playing ba
25f90 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e  ck the hot-journ
25fa0 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f  al so that we do
25fb0 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a  n't end up with.
25fc0 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f        ** an inco
25fd0 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20  nsistent cache. 
25fe0 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f   Sync the hot jo
25ff0 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61  urnal before pla
26000 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74  ying.      ** it
26010 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20   back since the 
26020 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 61  process that cra
26030 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68  shed and left th
26040 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  e hot journal.  
26050 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20      ** probably 
26060 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20  did not sync it 
26070 61 6e 64 20 77 65 20 61 72 65 20 72 65 71 75 69  and we are requi
26080 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79  red to always sy
26090 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nc.      ** the 
260a0 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70  journal before p
260b0 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a  laying it back..
260c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
260d0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
260e0 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
260f0 20 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63    rc = pagerSync
26100 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
26110 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
26120 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26130 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
26140 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
26150 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  Pager, 1);.     
26160 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
26170 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26180 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
26190 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
261a0 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
261b0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
261c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
261d0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
261e0 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d   (pPager->state=
261f0 3d 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20  =PAGER_SHARED). 
26200 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50            || (pP
26210 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
26220 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ode && pPager->s
26230 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45  tate>PAGER_SHARE
26240 44 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  D).      );.    
26250 7d 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  }..    if( pPage
26260 72 2d 3e 70 42 61 63 6b 75 70 20 7c 7c 20 73 71  r->pBackup || sq
26270 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63  lite3PcachePagec
26280 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
26290 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 20  ache)>0 ){.     
262a0 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c   /* The shared-l
262b0 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65  ock has just bee
262c0 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68  n acquired on th
262d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
262e0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65        ** and the
262f0 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 70  re are already p
26300 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
26310 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f  e (from a previo
26320 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64  us.      ** read
26330 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
26340 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74  ction).  Check t
26350 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74  o see if the dat
26360 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68  abase.      ** h
26370 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
26380 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
26390 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20  se has changed, 
263a0 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20 20  flush the.      
263b0 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20  ** cache..      
263c0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61  **.      ** Data
263d0 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73 20  base changes is 
263e0 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b  detected by look
263f0 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20  ing at 15 bytes 
26400 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20  beginning.      
26410 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20  ** at offset 24 
26420 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20  into the file.  
26430 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74  The first 4 of t
26440 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72  hese 16 bytes ar
26450 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d  e.      ** a 32-
26460 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74  bit counter that
26470 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
26480 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65  with each change
26490 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  .  The.      ** 
264a0 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e  other bytes chan
264b0 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68  ge randomly with
264c0 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67   each file chang
264d0 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  e when.      ** 
264e0 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73  a codec is in us
264f0 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  e..      ** .   
26500 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61     ** There is a
26510 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
26520 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61  ll chance that a
26530 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74   change will not
26540 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65   be .      ** de
26550 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61  tected.  The cha
26560 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65  nce of an undete
26570 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73  cted change is s
26580 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20  o small that.   
26590 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20     ** it can be 
265a0 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20  neglected..     
265b0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   */.      int nP
265c0 61 67 65 3b 0a 20 20 20 20 20 20 63 68 61 72 20  age;.      char 
265d0 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f  dbFileVers[sizeo
265e0 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
265f0 56 65 72 73 29 5d 3b 0a 20 20 20 20 20 20 73 71  Vers)];.      sq
26600 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
26610 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
26620 67 65 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  ge);..      if( 
26630 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
26640 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
26650 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
26660 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
26670 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  iled;.      }.. 
26680 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3e 30       if( nPage>0
26690 20 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52   ){.        IOTR
266a0 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20  ACE(("CKVERS %p 
266b0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73  %d\n", pPager, s
266c0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
266d0 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  )));.        rc 
266e0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
266f0 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46  pPager->fd, &dbF
26700 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
26710 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29  dbFileVers), 24)
26720 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
26730 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26740 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61           goto fa
26750 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iled;.        }.
26760 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26770 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69       memset(dbFi
26780 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f  leVers, 0, sizeo
26790 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  f(dbFileVers));.
267a0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
267b0 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72  f( memcmp(pPager
267c0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
267d0 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
267e0 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30  (dbFileVers))!=0
267f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
26800 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
26810 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
26820 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
26830 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
26840 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
26850 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
26860 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67  );..    rc = pag
26870 65 72 48 61 73 57 41 4c 28 70 50 61 67 65 72 2c  erHasWAL(pPager,
26880 20 26 69 73 57 61 6c 29 3b 0a 20 20 20 20 69 66   &isWal);.    if
26890 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
268a0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61  ){.      goto fa
268b0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
268c0 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20  if( isWal ){.   
268d0 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
268e0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63  Pager);.      rc
268f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
26900 70 65 6e 4c 6f 67 28 70 50 61 67 65 72 2c 20 30  penLog(pPager, 0
26910 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
26920 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26930 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
26940 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 70 50 61  OpenSnapshot(pPa
26950 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ger);.      }.  
26960 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
26970 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
26980 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
26990 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20  DE_WAL ){.      
269a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
269b0 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
269c0 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a  NALMODE_DELETE;.
269d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 66 61 69 6c      }.  }.. fail
269e0 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ed:.  if( rc!=SQ
269f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
26a00 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  * pager_unlock()
26a10 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
26a20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61  exclusive mode a
26a30 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  nd in-memory dat
26a40 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20 20 20 70  abases. */.    p
26a50 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
26a60 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
26a70 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
26a80 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  f the reference 
26a90 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68 65  count has reache
26aa0 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b  d zero, rollback
26ab0 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 74   any active.** t
26ac0 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75  ransaction and u
26ad0 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e  nlock the pager.
26ae0 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69  .**.** Except, i
26af0 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45  n locking_mode=E
26b00 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74 68  XCLUSIVE when th
26b10 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74  ere is nothing t
26b20 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  o in.** the roll
26b30 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  back journal, th
26b40 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  e unlock is not 
26b50 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74 68  performed and th
26b60 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e  ere is.** nothin
26b70 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73  g to rollback, s
26b80 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
26b90 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73  s a no-op..*/ .s
26ba0 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
26bb0 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50  UnlockIfUnused(P
26bc0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
26bd0 20 69 66 28 20 28 73 71 6c 69 74 65 33 50 63 61   if( (sqlite3Pca
26be0 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
26bf0 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29  er->pPCache)==0)
26c00 0a 20 20 20 26 26 20 28 21 70 50 61 67 65 72 2d  .   && (!pPager-
26c10 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
26c20 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
26c30 6c 4f 66 66 3e 30 29 20 0a 20 20 29 7b 0a 20 20  lOff>0) .  ){.  
26c40 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
26c50 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
26c60 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
26c70 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65 6e  cquire a referen
26c80 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  ce to page numbe
26c90 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72 20  r pgno in pager 
26ca0 70 50 61 67 65 72 20 28 61 20 70 61 67 65 0a 2a  pPager (a page.*
26cb0 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61 73 20  * reference has 
26cc0 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e 20 49  type DbPage*). I
26cd0 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
26ce0 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a  reference is .**
26cf0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62   successfully ob
26d00 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f  tained, it is co
26d10 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20  pied to *ppPage 
26d20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
26d30 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
26d40 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
26d50 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
26d60 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74 20  n the cache, it 
26d70 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
26d80 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65   Otherwise, a ne
26d90 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73  w page object is
26da0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70   allocated and p
26db0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64 61  opulated with da
26dc0 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20  ta.** read from 
26dd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26de0 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73  e. In some cases
26df0 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  , the pcache mod
26e00 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73  ule may.** choos
26e10 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74  e not to allocat
26e20 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a  e a new page obj
26e30 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73  ect and may reus
26e40 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a  e an existing.**
26e50 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20   object with no 
26e60 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
26e70 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rences..**.** Th
26e80 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
26e90 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
26ea0 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
26eb0 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74  lized to zeros t
26ec0 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d  he .** first tim
26ed0 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
26ee0 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20  ed into memory. 
26ef0 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71 75  If the page requ
26f00 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72  ested is .** alr
26f10 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68  eady in the cach
26f20 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
26f30 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
26f40 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a  then the extra.*
26f50 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20 61  * data is left a
26f60 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74 68  s it was when th
26f70 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61  e page object wa
26f80 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a  s last used..**.
26f90 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
26fa0 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c  se image is smal
26fb0 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ler than the req
26fc0 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20 69  uested page or i
26fd0 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  f a .** non-zero
26fe0 20 76 61 6c 75 65 20 69 73 20 70 61 73 73 65 64   value is passed
26ff0 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e   as the noConten
27000 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64 20  t parameter and 
27010 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65  the .** requeste
27020 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  d page is not al
27030 72 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20  ready stored in 
27040 74 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20  the cache, then 
27050 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69  no .** actual di
27060 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20  sk read occurs. 
27070 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
27080 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66   memory image of
27090 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73   the .** page is
270a0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
270b0 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a  all zeros. .**.*
270c0 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69  * If noContent i
270d0 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73  s true, it means
270e0 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
270f0 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 63  care about the c
27100 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68  ontents.** of th
27110 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63  e page. This occ
27120 75 72 73 20 69 6e 20 74 77 6f 20 73 65 70 65 72  urs in two seper
27130 61 74 65 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a  ate scenarios:.*
27140 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20 72  *.**   a) When r
27150 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c 69  eading a free-li
27160 73 74 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f  st leaf page fro
27170 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  m the database, 
27180 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57  and.**.**   b) W
27190 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
271a0 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
271b0 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65 64  back and we need
271c0 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20   to load.**     
271d0 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74 6f   a new page into
271e0 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 62 65   the cache to be
271f0 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
27200 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20   data read.**   
27210 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65     from the save
27220 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  point journal..*
27230 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  *.** If noConten
27240 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  t is true, then 
27250 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e 65  the data returne
27260 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74  d is zeroed inst
27270 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20  ead of.** being 
27280 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
27290 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e  tabase. Addition
272a0 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63  ally, the bits c
272b0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
272c0 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72  to pgno in Pager
272d0 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74  .pInJournal (bit
272e0 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
272f0 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20  eady written to 
27300 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
27310 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61 67  ile) and the Pag
27320 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
27330 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
27340 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20   of any open.** 
27350 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73  savepoints are s
27360 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  et. This means i
27370 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  f the page is ma
27380 64 65 20 77 72 69 74 61 62 6c 65 20 61 74 20 61  de writable at a
27390 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74  ny.** point in t
273a0 68 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67  he future, using
273b0 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
273c0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2c 20  e3PagerWrite(), 
273d0 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  its contents.** 
273e0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72  will not be jour
273f0 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65  naled. This save
27400 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  s IO..**.** The 
27410 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
27420 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
27430 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
27440 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
27450 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
27460 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
27470 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
27480 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
27490 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
274a0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
274b0 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20  p().  Both this 
274c0 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b  routine and Look
274d0 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
274e0 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
274f0 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
27500 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
27510 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
27520 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
27530 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
27540 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
27550 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
27560 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a  hereas Lookup().
27570 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
27580 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
27590 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
275a0 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
275b0 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
275c0 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
275d0 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
275e0 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
275f0 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
27600 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b  y..** Since Look
27610 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20  up() never goes 
27620 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65  to disk, it neve
27630 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69  r has to deal wi
27640 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a  th locks.** or j
27650 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f  ournal files..*/
27660 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
27670 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65  rAcquire(.  Page
27680 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
27690 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65  /* The pager ope
276a0 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
276b0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
276c0 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
276d0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
276e0 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50  o fetch */.  DbP
276f0 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
27700 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e   /* Write a poin
27710 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
27720 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  here */.  int no
27730 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a  Content       /*
27740 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72   Do not bother r
27750 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66  eading content f
27760 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65  rom disk if true
27770 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
27780 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
27790 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
277a0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
277b0 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
277c0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
277d0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
277e0 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29  .  if( pgno==0 )
277f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
27800 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
27810 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
27820 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
27830 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
27840 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
27850 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20 20  immediately. .  
27860 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
27870 71 75 65 73 74 20 74 68 65 20 70 61 67 65 20 66  quest the page f
27880 72 6f 6d 20 74 68 65 20 50 43 61 63 68 65 20 6c  rom the PCache l
27890 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70  ayer. */.  if( p
278a0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
278b0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
278c0 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
278d0 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  LITE_FULL ){.   
278e0 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
278f0 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rCode;.  }else{.
27900 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27910 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67  PcacheFetch(pPag
27920 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
27930 6f 2c 20 31 2c 20 70 70 50 61 67 65 29 3b 0a 20  o, 1, ppPage);. 
27940 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51   }..  if( rc!=SQ
27950 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
27960 2a 20 45 69 74 68 65 72 20 74 68 65 20 63 61 6c  * Either the cal
27970 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63  l to sqlite3Pcac
27980 68 65 46 65 74 63 68 28 29 20 72 65 74 75 72 6e  heFetch() return
27990 65 64 20 61 6e 20 65 72 72 6f 72 20 6f 72 20 74  ed an error or t
279a0 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20  he.    ** pager 
279b0 77 61 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74  was already in t
279c0 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77  he error-state w
279d0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
279e0 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20  n was called..  
279f0 20 20 2a 2a 20 53 65 74 20 70 50 67 20 74 6f 20    ** Set pPg to 
27a00 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68  0 and jump to th
27a10 65 20 65 78 63 65 70 74 69 6f 6e 20 68 61 6e 64  e exception hand
27a20 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67  ler.  */.    pPg
27a30 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70   = 0;.    goto p
27a40 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
27a50 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
27a60 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d  (*ppPage)->pgno=
27a70 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  =pgno );.  asser
27a80 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50  t( (*ppPage)->pP
27a90 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20  ager==pPager || 
27aa0 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65  (*ppPage)->pPage
27ab0 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28  r==0 );..  if( (
27ac0 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72  *ppPage)->pPager
27ad0 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29   && !noContent )
27ae0 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
27af0 20 63 61 73 65 20 74 68 65 20 70 63 61 63 68 65   case the pcache
27b00 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e   already contain
27b10 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  s an initialized
27b20 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20   copy of.    ** 
27b30 74 68 65 20 70 61 67 65 2e 20 52 65 74 75 72 6e  the page. Return
27b40 20 77 69 74 68 6f 75 74 20 66 75 72 74 68 65 72   without further
27b50 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73   ado.  */.    as
27b60 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45  sert( pgno<=PAGE
27b70 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70 67  R_MAX_PGNO && pg
27b80 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
27b90 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  O(pPager) );.   
27ba0 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
27bb0 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20 20 72  er->nHit);.    r
27bc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27bd0 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ..  }else{.    /
27be0 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 63 68  * The pager cach
27bf0 65 20 68 61 73 20 63 72 65 61 74 65 64 20 61 20  e has created a 
27c00 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f  new page. Its co
27c10 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a  ntent needs to .
27c20 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61      ** be initia
27c30 6c 69 7a 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69  lized.  */.    i
27c40 6e 74 20 6e 4d 61 78 3b 0a 0a 20 20 20 20 50 41  nt nMax;..    PA
27c50 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
27c60 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 70 50 67  >nMiss);.    pPg
27c70 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20 20 20   = *ppPage;.    
27c80 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50  pPg->pPager = pP
27c90 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  ager;..    /* Th
27ca0 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e  e maximum page n
27cb0 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52  umber is 2^31. R
27cc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
27cd0 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a 20  RUPT if a page. 
27ce0 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65     ** number gre
27cf0 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  ater than this, 
27d00 6f 72 20 74 68 65 20 75 6e 75 73 65 64 20 6c 6f  or the unused lo
27d10 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73 20 72  cking-page, is r
27d20 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20  equested. */.   
27d30 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f   if( pgno>PAGER_
27d40 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f  MAX_PGNO || pgno
27d50 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
27d60 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
27d70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
27d80 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
27d90 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
27da0 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  ire_err;.    }..
27db0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27dc0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
27dd0 50 61 67 65 72 2c 20 26 6e 4d 61 78 29 3b 0a 20  Pager, &nMax);. 
27de0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
27df0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
27e00 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
27e10 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
27e20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 6e 4d   if( MEMDB || nM
27e30 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20  ax<(int)pgno || 
27e40 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73  noContent || !is
27e50 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
27e60 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67   ){.      if( pg
27e70 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  no>pPager->mxPgn
27e80 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  o ){.        rc 
27e90 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
27ea0 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
27eb0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
27ec0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
27ed0 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20   noContent ){.  
27ee0 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65        /* Failure
27ef0 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73   to set the bits
27f00 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61   in the InJourna
27f10 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73  l bit-vectors is
27f20 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20   benign..       
27f30 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65   ** It merely me
27f40 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 68  ans that we migh
27f50 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20  t do some extra 
27f60 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  work to journal 
27f70 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  a .        ** pa
27f80 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
27f90 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72   need to be jour
27fa0 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65  naled.  Neverthe
27fb0 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20  less, be sure . 
27fc0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73         ** to tes
27fd0 74 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65  t the case where
27fe0 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20   a malloc error 
27ff0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
28000 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20  ing to set .    
28010 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20      ** a bit in 
28020 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20  a bit vector..  
28030 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
28040 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
28050 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
28060 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70       if( pgno<=p
28070 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
28080 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  e ){.          T
28090 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20  ESTONLY( rc = ) 
280a0 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
280b0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
280c0 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  nal, pgno);.    
280d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
280e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
280f0 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
28100 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20        TESTONLY( 
28110 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65  rc = ) addToSave
28120 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
28130 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
28140 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
28150 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
28160 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
28170 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
28180 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ();.      }.    
28190 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44    memset(pPg->pD
281a0 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  ata, 0, pPager->
281b0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
281c0 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20   IOTRACE(("ZERO 
281d0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
281e0 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65  , pgno));.    }e
281f0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
28200 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  t( pPg->pPager==
28210 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20  pPager );.      
28220 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28  rc = readDbPage(
28230 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pPg);.      if( 
28240 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
28250 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
28260 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
28270 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
28280 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
28290 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67  CK_PAGES.    pPg
282a0 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
282b0 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
282c0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
282d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
282e0 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72 65  ;..pager_acquire
282f0 5f 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28 20  _err:.  assert( 
28300 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
28310 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
28320 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
28330 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  rop(pPg);.  }.  
28340 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
28350 73 65 64 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  sed(pPager);..  
28360 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72  *ppPage = 0;.  r
28370 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
28380 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
28390 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
283a0 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  dy in the in-mem
283b0 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a  ory cache.  Do.*
283c0 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70  * not read the p
283d0 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20  age from disk.  
283e0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
283f0 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a   to the page,.**
28400 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67   or 0 if the pag
28410 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
28420 65 2e 20 41 6c 73 6f 2c 20 72 65 74 75 72 6e 20  e. Also, return 
28430 30 20 69 66 20 74 68 65 20 0a 2a 2a 20 70 61 67  0 if the .** pag
28440 65 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f 55  er is in PAGER_U
28450 4e 4c 4f 43 4b 20 73 74 61 74 65 20 77 68 65 6e  NLOCK state when
28460 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
28470 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 6f 72 20  s called,.** or 
28480 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
28490 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
284a0 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
284b0 49 54 45 5f 46 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  ITE_FULL..**.** 
284c0 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
284d0 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68 65  PagerGet().  The
284e0 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
284f0 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
28500 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50  .** and sqlite3P
28510 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68 61  agerGet() is tha
28520 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f  t _get() will go
28530 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64   to the disk and
28540 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20   read.** in the 
28550 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65  page if the page
28560 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
28570 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  in cache.  This 
28580 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
28590 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70  ns NULL if the p
285a0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
285b0 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b  che or if a disk
285c0 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68   I/O error .** h
285d0 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64  as ever happened
285e0 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c  ..*/.DbPage *sql
285f0 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
28600 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
28610 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
28620 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 61  dr *pPg = 0;.  a
28630 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
28640 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
28650 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  no!=0 );.  asser
28660 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  t( pPager->pPCac
28670 68 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  he!=0 );.  asser
28680 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
28690 20 3e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20   > PAGER_UNLOCK 
286a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
286b0 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
286c0 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30  pPCache, pgno, 0
286d0 2c 20 26 70 50 67 29 3b 0a 20 20 72 65 74 75 72  , &pPg);.  retur
286e0 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n pPg;.}../*.** 
286f0 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 20 72  Release a page r
28700 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  eference..**.** 
28710 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
28720 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
28730 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20  he page drop to 
28740 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a  zero, then the.*
28750 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20  * page is added 
28760 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e  to the LRU list.
28770 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72    When all refer
28780 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67  ences to all pag
28790 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73  es.** are releas
287a0 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  ed, a rollback o
287b0 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f  ccurs and the lo
287c0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
287d0 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64  se is.** removed
287e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
287f0 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61  3PagerUnref(DbPa
28800 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  ge *pPg){.  if( 
28810 70 50 67 20 29 7b 0a 20 20 20 20 50 61 67 65 72  pPg ){.    Pager
28820 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
28830 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69  pPager;.    sqli
28840 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65  te3PcacheRelease
28850 28 70 50 67 29 3b 0a 20 20 20 20 70 61 67 65 72  (pPg);.    pager
28860 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70  UnlockIfUnused(p
28870 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Pager);.  }.}../
28880 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e  *.** If the main
28890 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
288a0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  s already been o
288b0 70 65 6e 65 64 2c 20 65 6e 73 75 72 65 20 74 68  pened, ensure th
288c0 61 74 20 74 68 65 0a 2a 2a 20 73 75 62 2d 6a 6f  at the.** sub-jo
288d0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
288e0 65 6e 20 74 6f 6f 2e 20 49 66 20 74 68 65 20 6d  en too. If the m
288f0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  ain journal is n
28900 6f 74 20 6f 70 65 6e 2c 0a 2a 2a 20 74 68 69 73  ot open,.** this
28910 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
28920 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  o-op..**.** SQLI
28930 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
28940 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  d if everything 
28950 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74  goes according t
28960 6f 20 70 6c 61 6e 2e 20 0a 2a 2a 20 41 6e 20 53  o plan. .** An S
28970 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
28980 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
28990 74 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c  turned if a call
289a0 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f   to .** sqlite3O
289b0 73 4f 70 65 6e 28 29 20 66 61 69 6c 73 2e 0a 2a  sOpen() fails..*
289c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
289d0 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65  nSubJournal(Page
289e0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
289f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
28a00 3b 0a 20 20 69 66 28 20 28 70 61 67 65 72 55 73  ;.  if( (pagerUs
28a10 65 4c 6f 67 28 70 50 61 67 65 72 29 20 7c 7c 20  eLog(pPager) || 
28a20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
28a30 66 64 29 29 20 26 26 20 21 69 73 4f 70 65 6e 28  fd)) && !isOpen(
28a40 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b  pPager->sjfd) ){
28a50 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
28a60 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
28a70 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
28a80 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72  MEMORY || pPager
28a90 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29  ->subjInMemory )
28aa0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d  {.      sqlite3M
28ab0 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50  emJournalOpen(pP
28ac0 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20  ager->sjfd);.   
28ad0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
28ae0 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70   = pagerOpentemp
28af0 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
28b00 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50  >sjfd, SQLITE_OP
28b10 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a  EN_SUBJOURNAL);.
28b20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
28b30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
28b40 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
28b50 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73   called at the s
28b60 74 61 72 74 20 6f 66 20 65 76 65 72 79 20 77 72  tart of every wr
28b70 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
28b80 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61  .** There must a
28b90 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45  lready be a RESE
28ba0 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
28bb0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
28bc0 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
28bd0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
28be0 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
28bf0 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  ** Open the jour
28c00 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
28c10 65 72 20 70 50 61 67 65 72 20 61 6e 64 20 77 72  er pPager and wr
28c20 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65  ite a journal he
28c30 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73  ader.** to the s
28c40 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74  tart of it. If t
28c50 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20  here are active 
28c60 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e  savepoints, open
28c70 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
28c80 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69  .** as well. Thi
28c90 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
28ca0 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  ly used when the
28cb0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
28cc0 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65   being .** opene
28cd0 64 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c  d to write a rol
28ce0 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20  lback log for a 
28cf0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20  transaction. It 
28d00 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20  is not used .** 
28d10 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68  when opening a h
28d20 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot journal file 
28d30 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  to roll it back.
28d40 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
28d50 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c  urnal file is al
28d60 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69  ready open (as i
28d70 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c  t may be in excl
28d80 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20  usive mode),.** 
28d90 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
28da0 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20 61  on just writes a
28db0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
28dc0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
28dd0 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f  the.** already o
28de0 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  pen file. .**.**
28df0 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
28e00 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28e10 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68   is opened by th
28e20 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  is function, the
28e30 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  .** Pager.pInJou
28e40 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72 75  rnal bitvec stru
28e50 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
28e60 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
28e70 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
28e80 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
28e90 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73  essful. Otherwis
28ea0 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  e, return .** SQ
28eb0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68  LITE_NOMEM if th
28ec0 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c  e attempt to all
28ed0 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a  ocate Pager.pInJ
28ee0 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72  ournal fails, or
28ef0 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72   .** an IO error
28f00 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67   code if opening
28f10 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
28f20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69  journal file fai
28f30 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
28f40 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  t pager_open_jou
28f50 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
28f60 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
28f70 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
28f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f90 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
28fa0 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b   */.  int nPage;
28fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fd0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61   /* Size of data
28fe0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 73  base file */.  s
28ff0 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
29000 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
29010 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63  ->pVfs;   /* Loc
29020 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73 20  al cache of vfs 
29030 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  pointer */..  as
29040 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
29050 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
29060 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  VED );.  assert(
29070 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
29080 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
29090 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
290a0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
290b0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20  NALMODE_OFF );. 
290c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
290d0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
290e0 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72  ;.  .  /* If alr
290f0 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f  eady in the erro
29100 72 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75  r state, this fu
29110 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
29120 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20  p.  But on.  ** 
29130 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
29140 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
29150 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20  never called if 
29160 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  we are already i
29170 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20  n.  ** an error 
29180 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20  state. */.  if( 
29190 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72  NEVER(pPager->er
291a0 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20  rCode) ) return 
291b0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
291c0 0a 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50  ..  testcase( pP
291d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
291e0 64 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73  d==0 );.  rc = s
291f0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
29200 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
29210 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
29220 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50   return rc;.  pP
29230 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
29240 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
29250 43 72 65 61 74 65 28 6e 50 61 67 65 29 3b 0a 20  Create(nPage);. 
29260 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e   if( pPager->pIn
29270 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20  Journal==0 ){.  
29280 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29290 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
292a0 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
292b0 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  l file if it is 
292c0 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
292d0 2e 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70  . */.  if( !isOp
292e0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
292f0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
29300 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
29310 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
29320 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
29330 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72    sqlite3MemJour
29340 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
29350 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  jfd);.    }else{
29360 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
29370 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20   flags =        
29380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46             /* VF
29390 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20  S flags to open 
293a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
293b0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
293c0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
293d0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
293e0 7c 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65  |.        (pPage
293f0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20  r->tempFile ? . 
29400 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
29410 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
29420 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  OSE|SQLITE_OPEN_
29430 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20  TEMP_JOURNAL):. 
29440 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
29450 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
29460 41 4c 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 23  AL).        );.#
29470 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
29480 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
29490 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
294a0 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a  te3JournalOpen(.
294b0 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
294c0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
294d0 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
294e0 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72  lags, jrnlBuffer
294f0 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20  Size(pPager).   
29500 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20     );.#else.    
29510 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
29520 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
29530 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
29540 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
29550 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
29560 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
29570 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
29580 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
29590 64 29 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  d) );.  }...  /*
295a0 20 57 72 69 74 65 20 74 68 65 20 66 69 72 73 74   Write the first
295b0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
295c0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
295d0 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20  ile and open .  
295e0 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ** the sub-journ
295f0 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
29600 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
29610 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29620 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20   /* TODO: Check 
29630 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20  if all of these 
29640 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69  are really requi
29650 72 65 64 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67  red. */.    pPag
29660 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d  er->dbOrigSize =
29670 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
29680 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
29690 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
296a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
296b0 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70  dSync = 0;.    p
296c0 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
296d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
296e0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
296f0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
29700 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  er = 0;.    pPag
29710 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
29720 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69   0;.    rc = wri
29730 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
29740 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
29750 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
29760 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
29770 69 6e 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  int ){.    rc = 
29780 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70  openSubJournal(p
29790 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  Pager);.  }..  i
297a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
297b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
297c0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
297d0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
297e0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  ;.    pPager->pI
297f0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
29800 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
29810 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
29820 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
29830 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  n on the specifi
29840 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ed pager object.
29850 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d   If a .** write-
29860 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
29870 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
29880 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ned, this functi
29890 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
298a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c  *.** If the exFl
298b0 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66  ag argument is f
298c0 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69  alse, then acqui
298d0 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  re at least a RE
298e0 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f  SERVED.** lock o
298f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
29900 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69  ile. If exFlag i
29910 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71  s true, then acq
29920 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a  uire at least.**
29930 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
29940 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ck. If such a lo
29950 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
29960 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a  ld, no locking .
29970 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65  ** functions nee
29980 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  d be called..**.
29990 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  ** If this is no
299a0 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  t a temporary or
299b0 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20   in-memory file 
299c0 61 6e 64 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  and, the journal
299d0 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 6f 70 65   file is .** ope
299e0 6e 65 64 20 69 66 20 69 74 20 68 61 73 20 6e 6f  ned if it has no
299f0 74 20 62 65 65 6e 20 61 6c 72 65 61 64 79 2e 20  t been already. 
29a00 46 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20  For a temporary 
29a10 66 69 6c 65 2c 20 74 68 65 20 6f 70 65 6e 69 6e  file, the openin
29a20 67 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 75  g .** of the jou
29a30 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66  rnal file is def
29a40 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72  erred until ther
29a50 65 20 69 73 20 61 6e 20 61 63 74 75 61 6c 20 6e  e is an actual n
29a60 65 65 64 20 74 6f 20 0a 2a 2a 20 77 72 69 74 65  eed to .** write
29a70 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
29a80 20 54 4f 44 4f 3a 20 57 68 79 20 68 61 6e 64 6c   TODO: Why handl
29a90 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
29aa0 73 20 64 69 66 66 65 72 65 6e 74 6c 79 3f 0a 2a  s differently?.*
29ab0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
29ac0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
29ad0 65 64 20 28 6f 72 20 69 66 20 69 74 20 69 73 20  ed (or if it is 
29ae0 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 20 74  already open), t
29af0 68 65 6e 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  hen a.** journal
29b00 2d 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74  -header is writt
29b10 65 6e 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  en to the start 
29b20 6f 66 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  of it..**.** If 
29b30 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  the subjInMemory
29b40 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
29b50 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20  -zero, then any 
29b60 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  sub-journal open
29b70 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69  ed.** within thi
29b80 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  s transaction wi
29b90 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20  ll be opened as 
29ba0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  an in-memory fil
29bb0 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e  e. This.** has n
29bc0 6f 20 65 66 66 65 63 74 20 69 66 20 74 68 65 20  o effect if the 
29bd0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61  sub-journal is a
29be0 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61  lready opened (a
29bf0 73 20 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e  s it may be when
29c00 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65  .** running in e
29c10 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f  xclusive mode) o
29c20 72 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  r if the transac
29c30 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65  tion does not re
29c40 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a  quire a.** sub-j
29c50 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73  ournal. If the s
29c60 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75  ubjInMemory argu
29c70 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  ment is zero, th
29c80 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a  en any required.
29c90 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  ** sub-journal i
29ca0 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e  s implemented in
29cb0 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65  -memory if pPage
29cc0 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  r is an in-memor
29cd0 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20  y database, .** 
29ce0 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f  or using a tempo
29cf0 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77  rary file otherw
29d00 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ise..*/.int sqli
29d10 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 50 61  te3PagerBegin(Pa
29d20 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
29d30 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62   exFlag, int sub
29d40 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e  jInMemory){.  in
29d50 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
29d60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
29d70 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
29d80 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 70 50 61  _UNLOCK );.  pPa
29d90 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
29da0 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65  y = (u8)subjInMe
29db0 6d 6f 72 79 3b 0a 20 20 69 66 28 20 70 50 61 67  mory;.  if( pPag
29dc0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
29dd0 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61  _SHARED ){.    a
29de0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
29df0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
29e00 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
29e10 44 42 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  DB && !pPager->t
29e20 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 20 20  empFile );..    
29e30 69 66 28 20 70 61 67 65 72 55 73 65 4c 6f 67 28  if( pagerUseLog(
29e40 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
29e50 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72 69   /* Grab the wri
29e60 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c  te lock on the l
29e70 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63  og file. If succ
29e80 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20  essful, upgrade 
29e90 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45  to.      ** PAGE
29ea0 52 5f 45 58 43 4c 55 53 49 56 45 20 73 74 61 74  R_EXCLUSIVE stat
29eb0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  e. Otherwise, re
29ec0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
29ed0 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
29ee0 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62  ..      ** The b
29ef0 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e  usy-handler is n
29f00 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e  ot invoked if an
29f10 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
29f20 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a   already.      *
29f30 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74  * holds the writ
29f40 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69  e-lock. If possi
29f50 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c  ble, the upper l
29f60 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69  ayer will call i
29f70 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
29f80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f    rc = sqlite3Lo
29f90 67 57 72 69 74 65 4c 6f 63 6b 28 70 50 61 67 65  gWriteLock(pPage
29fa0 72 2d 3e 70 4c 6f 67 2c 20 31 29 3b 0a 20 20 20  r->pLog, 1);.   
29fb0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
29fc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
29fd0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
29fe0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
29ff0 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 70 50 61  ize;.        pPa
2a000 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
2a010 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20  ER_RESERVED;.   
2a020 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
2a030 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
2a040 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2a050 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20        /* Obtain 
2a060 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
2a070 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2a080 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46  file. If the exF
2a090 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20  lag parameter.  
2a0a0 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20      ** is true, 
2a0b0 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  then immediately
2a0c0 20 75 70 67 72 61 64 65 20 74 68 69 73 20 74 6f   upgrade this to
2a0d0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
2a0e0 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  ck. The.      **
2a0f0 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
2a100 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73  llback can be us
2a110 65 64 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  ed when upgradin
2a120 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49  g to the EXCLUSI
2a130 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  VE.      ** lock
2a140 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f  , but not when o
2a150 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53  btaining the RES
2a160 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20  ERVED lock..    
2a170 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
2a180 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
2a190 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56  ager->fd, RESERV
2a1a0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
2a1b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2a1c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
2a1d0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
2a1e0 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20  ER_RESERVED;.   
2a1f0 20 20 20 20 20 69 66 28 20 65 78 46 6c 61 67 20       if( exFlag 
2a200 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2a210 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
2a220 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
2a230 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
2a240 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2a250 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f      }..    /* No
2a260 20 6e 65 65 64 20 74 6f 20 6f 70 65 6e 20 74 68   need to open th
2a270 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
2a280 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 49 74  t this time.  It
2a290 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20   will be.    ** 
2a2a0 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 69 74  opened before it
2a2b0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   is written to. 
2a2c0 20 49 66 20 77 65 20 64 65 66 65 72 20 6f 70 65   If we defer ope
2a2d0 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ning the journal
2a2e0 2c 0a 20 20 20 20 2a 2a 20 77 65 20 6d 69 67 68  ,.    ** we migh
2a2f0 74 20 73 61 76 65 20 74 68 65 20 77 6f 72 6b 20  t save the work 
2a300 6f 66 20 63 72 65 61 74 69 6e 67 20 61 20 66 69  of creating a fi
2a310 6c 65 20 69 66 20 74 68 65 20 74 72 61 6e 73 61  le if the transa
2a320 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 65 6e 64  ction.    ** end
2a330 73 20 75 70 20 62 65 69 6e 67 20 61 20 6e 6f 2d  s up being a no-
2a340 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 7d 65 6c  op..    */.  }el
2a350 73 65 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  se if( isOpen(pP
2a360 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50  ager->jfd) && pP
2a370 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2a380 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
2a390 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
2a3a0 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
2a3b0 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
2a3c0 73 20 6d 6f 64 65 20 74 68 65 20 6c 61 73 74 0a  s mode the last.
2a3d0 20 20 20 20 2a 2a 20 74 69 6d 65 20 61 20 28 72      ** time a (r
2a3e0 65 61 64 20 6f 72 20 77 72 69 74 65 29 20 74 72  ead or write) tr
2a3f0 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 75  ansaction was su
2a400 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c  ccessfully concl
2a410 75 64 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  uded.    ** by t
2a420 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  his connection. 
2a430 49 6e 73 74 65 61 64 20 6f 66 20 64 65 6c 65 74  Instead of delet
2a440 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
2a450 66 69 6c 65 20 69 74 20 77 61 73 20 0a 20 20 20  file it was .   
2a460 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e   ** kept open an
2a470 64 20 65 69 74 68 65 72 20 77 61 73 20 74 72 75  d either was tru
2a480 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79 74 65  ncated to 0 byte
2a490 73 20 6f 72 20 69 74 73 20 68 65 61 64 65 72 20  s or its header 
2a4a0 77 61 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 77  was.    ** overw
2a4b0 72 69 74 74 65 6e 20 77 69 74 68 20 7a 65 72 6f  ritten with zero
2a4c0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  s..    */.    as
2a4d0 73 65 72 74 28 20 70 61 67 65 72 55 73 65 4c 6f  sert( pagerUseLo
2a4e0 67 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  g(pPager)==0 );.
2a4f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2a500 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20  er->nRec==0 );. 
2a510 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2a520 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30  r->dbOrigSize==0
2a530 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2a540 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
2a550 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  al==0 );.    rc 
2a560 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
2a570 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
2a580 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  }..  PAGERTRACE(
2a590 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64  ("TRANSACTION %d
2a5a0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
2a5b0 67 65 72 29 29 29 3b 0a 20 20 69 66 28 20 72 63  ger)));.  if( rc
2a5c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2a5d0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
2a5e0 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29  er->dbModified )
2a5f0 3b 0a 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20  ;.    /* Ignore 
2a600 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 74 68 61  any IO error tha
2a610 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  t occurs within 
2a620 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
2a630 63 74 69 6f 6e 28 29 2e 20 54 68 65 0a 20 20 20  ction(). The.   
2a640 20 2a 2a 20 70 75 72 70 6f 73 65 20 6f 66 20 74   ** purpose of t
2a650 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 72  his call is to r
2a660 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61  eset the interna
2a670 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  l state of the p
2a680 61 67 65 72 0a 20 20 20 20 2a 2a 20 73 75 62 2d  ager.    ** sub-
2a690 73 79 73 74 65 6d 2e 20 49 74 20 64 6f 65 73 6e  system. It doesn
2a6a0 27 74 20 6d 61 74 74 65 72 20 69 66 20 74 68 65  't matter if the
2a6b0 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73   journal-file is
2a6c0 20 6e 6f 74 20 70 72 6f 70 65 72 6c 79 0a 20 20   not properly.  
2a6d0 20 20 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 20 61    ** finalized a
2a6e0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 28 73 69  t this point (si
2a6f0 6e 63 65 20 69 74 20 69 73 20 6e 6f 74 20 61 20  nce it is not a 
2a700 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69  valid journal fi
2a710 6c 65 20 61 6e 79 77 61 79 29 2e 0a 20 20 20 20  le anyway)..    
2a720 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 65 6e 64  */.    pager_end
2a730 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
2a740 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  ger, 0);.  }.  r
2a750 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2a760 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65  ** Mark a single
2a770 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
2a780 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67  iteable. The pag
2a790 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
2a7a0 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a  o the .** main j
2a7b0 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f  ournal or sub-jo
2a7c0 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65  urnal as require
2a7d0 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  d. If the page i
2a7e0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  s written into.*
2a7f0 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * one of the jou
2a800 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65  rnals, the corre
2a810 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
2a820 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50  set in the .** P
2a830 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
2a840 62 69 74 76 65 63 20 61 6e 64 20 74 68 65 20 50  bitvec and the P
2a850 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
2a860 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65  nSavepoint bitve
2a870 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65  cs.** of any ope
2a880 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20  n savepoints as 
2a890 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a  appropriate..*/.
2a8a0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
2a8b0 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50  _write(PgHdr *pP
2a8c0 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74  g){.  void *pDat
2a8d0 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
2a8e0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2a8f0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
2a900 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2a910 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  _OK;..  /* This 
2a920 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 63  routine is not c
2a930 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61 20 74  alled unless a t
2a940 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
2a950 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20 2a 2a  lready been.  **
2a960 20 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20   started..  */. 
2a970 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2a980 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
2a990 53 45 52 56 45 44 20 29 3b 0a 0a 20 20 2f 2a 20  SERVED );..  /* 
2a9a0 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
2a9b0 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20  been previously 
2a9c0 64 65 74 65 63 74 65 64 2c 20 72 65 70 6f 72 74  detected, report
2a9d0 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72 0a   the same error.
2a9e0 20 20 2a 2a 20 61 67 61 69 6e 2e 0a 20 20 2a 2f    ** again..  */
2a9f0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
2aa00 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20  ger->errCode) ) 
2aa10 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
2aa20 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 48  errCode;..  /* H
2aa30 69 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f 75 74  igher-level rout
2aa40 69 6e 65 73 20 6e 65 76 65 72 20 63 61 6c 6c 20  ines never call 
2aa50 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66  this function if
2aa60 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
2aa70 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c 65 2e 20  .  ** writable. 
2aa80 20 42 75 74 20 63 68 65 63 6b 20 61 6e 79 77 61   But check anywa
2aa90 79 2c 20 6a 75 73 74 20 66 6f 72 20 72 6f 62 75  y, just for robu
2aaa0 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28  stness. */.  if(
2aab0 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 72   NEVER(pPager->r
2aac0 65 61 64 4f 6e 6c 79 29 20 29 20 72 65 74 75 72  eadOnly) ) retur
2aad0 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 0a  n SQLITE_PERM;..
2aae0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
2aaf0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a  r->setMaster );.
2ab00 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
2ab10 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74  g);..  /* Mark t
2ab20 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
2ab30 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68  .  If the page h
2ab40 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
2ab50 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
2ab60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e  the journal then
2ab70 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72   we can return r
2ab80 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
2ab90 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
2aba0 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
2abb0 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e   if( pageInJourn
2abc0 61 6c 28 70 50 67 29 20 26 26 20 21 73 75 62 6a  al(pPg) && !subj
2abd0 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
2abe0 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
2abf0 20 21 70 61 67 65 72 55 73 65 4c 6f 67 28 70 50   !pagerUseLog(pP
2ac00 61 67 65 72 29 20 29 3b 0a 20 20 20 20 70 50 61  ager) );.    pPa
2ac10 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
2ac20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20  = 1;.  }else{.. 
2ac30 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20     /* If we get 
2ac40 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
2ac50 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
2ac60 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
2ac70 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74   ** written to t
2ac80 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
2ac90 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b  ournal or the ck
2aca0 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
2acb0 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e  .    ** or both.
2acc0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 48  .    **.    ** H
2acd0 69 67 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74  igher level rout
2ace0 69 6e 65 73 20 73 68 6f 75 6c 64 20 68 61 76 65  ines should have
2acf0 20 61 6c 72 65 61 64 79 20 73 74 61 72 74 65 64   already started
2ad00 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a   a transaction,.
2ad10 20 20 20 20 2a 2a 20 77 68 69 63 68 20 6d 65 61      ** which mea
2ad20 6e 73 20 74 68 65 79 20 68 61 76 65 20 61 63 71  ns they have acq
2ad30 75 69 72 65 64 20 74 68 65 20 6e 65 63 65 73 73  uired the necess
2ad40 61 72 79 20 6c 6f 63 6b 73 20 62 75 74 20 74 68  ary locks but th
2ad50 65 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 2a  e rollback.    *
2ad60 2a 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  * journal might 
2ad70 6e 6f 74 20 79 65 74 20 62 65 20 6f 70 65 6e 2e  not yet be open.
2ad80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
2ad90 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
2ada0 69 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 70 50  in(pPager, 0, pP
2adb0 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
2adc0 72 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ry);.    if( rc!
2add0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ade0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2adf0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73     }.    if( !is
2ae00 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2ae10 29 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65  ) .     && pPage
2ae20 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
2ae30 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2ae40 45 5f 4f 46 46 20 0a 20 20 20 20 20 26 26 20 21  E_OFF .     && !
2ae50 70 61 67 65 72 55 73 65 4c 6f 67 28 70 50 61 67  pagerUseLog(pPag
2ae60 65 72 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  er).    ){.     
2ae70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2ae80 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
2ae90 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
2aea0 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
2aeb0 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
2aec0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2aed0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2aee0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d  .    pPager->dbM
2aef0 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a  odified = 1;.  .
2af00 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73      /* The trans
2af10 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e  action journal n
2af20 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65  ow exists and we
2af30 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44   have a RESERVED
2af40 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58   or an.    ** EX
2af50 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
2af60 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
2af70 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74  e file.  Write t
2af80 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
2af90 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72  to.    ** the tr
2afa0 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
2afb0 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  l if it is not t
2afc0 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
2afd0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 61    */.    if( !pa
2afe0 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29  geInJournal(pPg)
2aff0 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
2b000 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
2b010 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
2b020 73 65 4c 6f 67 28 70 50 61 67 65 72 29 20 29 3b  seLog(pPager) );
2b030 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
2b040 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
2b050 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20  OrigSize ){.    
2b060 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20      u32 cksum;. 
2b070 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61         char *pDa
2b080 74 61 32 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  ta2;..        /*
2b090 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72   We should never
2b0a0 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
2b0b0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70  urnal file the p
2b0c0 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  age that.       
2b0d0 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
2b0e0 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e   database locks.
2b0f0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
2b100 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a  assert verifies.
2b110 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
2b120 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20  we do not. */.  
2b130 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2b140 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d  g->pgno!=PAGER_M
2b150 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
2b160 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ;..        asser
2b170 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
2b180 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d  alHdr <= pPager-
2b190 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20  >journalOff );. 
2b1a0 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50         CODEC2(pP
2b1b0 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
2b1c0 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72  ->pgno, 7, retur
2b1d0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  n SQLITE_NOMEM, 
2b1e0 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20  pData2);.       
2b1f0 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63   cksum = pager_c
2b200 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38  ksum(pPager, (u8
2b210 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  *)pData2);.     
2b220 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
2b230 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
2b240 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2b250 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  Off, pPg->pgno);
2b260 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
2b270 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b280 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2b290 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
2b2a0 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c  er->jfd, pData2,
2b2b0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
2b2c0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
2b2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2b2f0 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20 20 20 20  Off + 4);.      
2b300 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2b310 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72  nalOff += pPager
2b320 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b 0a 20 20  ->pageSize+4;.  
2b330 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b340 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b350 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
2b360 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
2b370 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
2b380 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
2b390 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20   cksum);.       
2b3a0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2b3b0 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20  alOff += 4;.    
2b3c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f      }.        IO
2b3d0 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20  TRACE(("JOUT %p 
2b3e0 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %d %lld %d\n", p
2b3f0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
2b400 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
2b410 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2b420 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e  nalOff, pPager->
2b430 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20  pageSize));.    
2b440 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
2b450 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
2b460 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  tej_count);.    
2b470 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
2b480 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  "JOURNAL %d page
2b490 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20   %d needSync=%d 
2b4a0 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
2b4b0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
2b4c0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
2b4d0 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20  ->pgno, .       
2b4e0 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
2b4f0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
2b500 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f  NC)?1:0), pager_
2b510 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b  pagehash(pPg)));
2b520 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65  ..        /* Eve
2b530 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64 69  n if an IO or di
2b540 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63  skfull error occ
2b550 75 72 72 65 64 20 77 68 69 6c 65 20 6a 6f 75 72  urred while jour
2b560 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20 20  nalling the.    
2b570 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
2b580 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20  he block above, 
2b590 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e  set the need-syn
2b5a0 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70  c flag for the p
2b5b0 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  age..        ** 
2b5c0 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20  Otherwise, when 
2b5d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2b5e0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
2b5f0 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20  the logic in.   
2b600 20 20 20 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b       ** playback
2b610 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c  _one_page() will
2b620 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20   think that the 
2b630 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
2b640 20 72 65 73 74 6f 72 65 64 0a 20 20 20 20 20 20   restored.      
2b650 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61    ** in the data
2b660 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69  base file. And i
2b670 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
2b680 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67  curs while doing
2b690 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20   so,.        ** 
2b6a0 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20  then corruption 
2b6b0 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20  may follow..    
2b6c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2b6d0 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
2b6e0 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
2b6f0 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
2b700 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
2b710 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
2b720 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
2b730 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2b740 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61    /* An error ha
2b750 73 20 6f 63 63 75 72 72 65 64 20 77 72 69 74 69  s occurred writi
2b760 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
2b770 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20  l file. The .   
2b780 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
2b790 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c  ion will be roll
2b7a0 65 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c  ed back by the l
2b7b0 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20  ayer above..    
2b7c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2b7d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2b7e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
2b7f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2b800 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 50 61 67   }..        pPag
2b810 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20  er->nRec++;.    
2b820 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2b830 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->pInJournal!=
2b840 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
2b850 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
2b860 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  et(pPager->pInJo
2b870 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f  urnal, pPg->pgno
2b880 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
2b890 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
2b8a0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
2b8b0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
2b8c0 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
2b8d0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
2b8e0 20 20 20 20 20 20 72 63 20 7c 3d 20 61 64 64 54        rc |= addT
2b8f0 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
2b900 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  s(pPager, pPg->p
2b910 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
2b920 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2b930 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
2b940 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
2b950 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
2b960 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2b970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
2b980 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
2b990 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
2b9a0 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61  lStarted && !pPa
2b9b0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
2b9c0 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c           pPg->fl
2b9d0 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
2b9e0 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20  D_SYNC;.        
2b9f0 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
2ba00 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
2ba10 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  }.        PAGERT
2ba20 52 41 43 45 28 28 22 41 50 50 45 4e 44 20 25 64  RACE(("APPEND %d
2ba30 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
2ba40 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
2ba50 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
2ba60 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
2ba70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  gno,.           
2ba80 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73      ((pPg->flags
2ba90 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
2baa0 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 20 20  )?1:0)));.      
2bab0 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
2bac0 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65  * If the stateme
2bad0 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  nt journal is op
2bae0 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  en and the page 
2baf0 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20  is not in it,.  
2bb00 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20    ** then write 
2bb10 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
2bb20 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e   to the statemen
2bb30 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65  t journal.  Note
2bb40 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
2bb50 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
2bb60 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72  al format differ
2bb70 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64  s from the stand
2bb80 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ard journal form
2bb90 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61  at.    ** in tha
2bba0 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63  t it omits the c
2bbb0 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65  hecksums and the
2bbc0 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a   header..    */.
2bbd0 20 20 20 20 69 66 28 20 73 75 62 6a 52 65 71 75      if( subjRequ
2bbe0 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b  iresPage(pPg) ){
2bbf0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a  .      rc = subj
2bc00 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b  ournalPage(pPg);
2bc10 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2bc20 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61   Update the data
2bc30 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65  base size and re
2bc40 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  turn..  */.  ass
2bc50 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
2bc60 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
2bc70 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
2bc80 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67  ->dbSize<pPg->pg
2bc90 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
2bca0 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e  ->dbSize = pPg->
2bcb0 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pgno;.  }.  retu
2bcc0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2bcd0 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65  Mark a data page
2bce0 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54   as writeable. T
2bcf0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
2bd00 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
2bd10 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61  e .** making cha
2bd20 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 20  nges to a page. 
2bd30 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
2bd40 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e  check the return
2bd50 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68   value .** of th
2bd60 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
2bd70 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74  be careful not t
2bd80 6f 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67  o change any pag
2bd90 65 20 64 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a  e data unless .*
2bda0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * this routine r
2bdb0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
2bdc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
2bdd0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
2bde0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
2bdf0 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69   pager_write() i
2be00 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66  s that this.** f
2be10 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61  unction also dea
2be20 6c 73 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ls with the spec
2be30 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 20 32  ial case where 2
2be40 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a   or more pages.*
2be50 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c  * fit on a singl
2be60 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49  e disk sector. I
2be70 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20  n this case all 
2be80 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65  co-resident page
2be90 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62  s.** must have b
2bea0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
2beb0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2bec0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
2bed0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
2bee0 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49  ror occurs, SQLI
2bef0 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49  TE_NOMEM or an I
2bf00 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
2bf10 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61  returned.** as a
2bf20 70 70 72 6f 70 72 69 61 74 65 2e 20 4f 74 68 65  ppropriate. Othe
2bf30 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
2bf40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2bf50 50 61 67 65 72 57 72 69 74 65 28 44 62 50 61 67  PagerWrite(DbPag
2bf60 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69  e *pDbPage){.  i
2bf70 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2bf80 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67  K;..  PgHdr *pPg
2bf90 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61   = pDbPage;.  Pa
2bfa0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
2bfb0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e  g->pPager;.  Pgn
2bfc0 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  o nPagePerSector
2bfd0 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74   = (pPager->sect
2bfe0 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70  orSize/pPager->p
2bff0 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28  ageSize);..  if(
2c000 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e   nPagePerSector>
2c010 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50  1 ){.    Pgno nP
2c020 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20  ageCount;       
2c030 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
2c040 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
2c050 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2c060 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20      Pgno pg1;   
2c070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c080 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   First page of t
2c090 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73  he sector pPg is
2c0a0 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a   located on. */.
2c0b0 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20      int nPage;  
2c0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c0d0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2c0e0 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31   starting at pg1
2c0f0 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
2c100 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20     int ii;      
2c110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c120 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
2c130 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63      int needSync
2c140 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
2c150 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61 67   True if any pag
2c160 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44  e has PGHDR_NEED
2c170 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a  _SYNC */..    /*
2c180 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79   Set the doNotSy
2c190 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68  nc flag to 1. Th
2c1a0 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77 65  is is because we
2c1b0 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20   cannot allow a 
2c1c0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68  journal.    ** h
2c1d0 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74  eader to be writ
2c1e0 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20  ten between the 
2c1f0 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20  pages journaled 
2c200 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
2c210 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
2c220 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
2c230 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2c240 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20  r->doNotSync==0 
2c250 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
2c260 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20  oNotSync = 1;.. 
2c270 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b     /* This trick
2c280 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f   assumes that bo
2c290 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  th the page-size
2c2a0 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
2c2b0 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69   are.    ** an i
2c2c0 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20  nteger power of 
2c2d0 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61  2. It sets varia
2c2e0 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69  ble pg1 to the i
2c2f0 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a  dentifier.    **
2c300 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
2c310 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
2c320 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
2c330 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  on..    */.    p
2c340 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f  g1 = ((pPg->pgno
2c350 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72  -1) & ~(nPagePer
2c360 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a  Sector-1)) + 1;.
2c370 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2c380 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
2c390 70 50 61 67 65 72 2c 20 28 69 6e 74 20 2a 29 26  pPager, (int *)&
2c3a0 6e 50 61 67 65 43 6f 75 6e 74 29 3b 0a 20 20 20  nPageCount);.   
2c3b0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2c3c0 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70 50 67   rc;.    if( pPg
2c3d0 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e  ->pgno>nPageCoun
2c3e0 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  t ){.      nPage
2c3f0 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20   = (pPg->pgno - 
2c400 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73  pg1)+1;.    }els
2c410 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65  e if( (pg1+nPage
2c420 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61  PerSector-1)>nPa
2c430 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  geCount ){.     
2c440 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f   nPage = nPageCo
2c450 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d  unt+1-pg1;.    }
2c460 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67  else{.      nPag
2c470 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74  e = nPagePerSect
2c480 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  or;.    }.    as
2c490 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20  sert(nPage>0);. 
2c4a0 20 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70     assert(pg1<=p
2c4b0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61  Pg->pgno);.    a
2c4c0 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65  ssert((pg1+nPage
2c4d0 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20  )>pPg->pgno);.. 
2c4e0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
2c4f0 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c  nPage && rc==SQL
2c500 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20  ITE_OK; ii++){. 
2c510 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70       Pgno pg = p
2c520 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67 48  g1+ii;.      PgH
2c530 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20  dr *pPage;.     
2c540 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67   if( pg==pPg->pg
2c550 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42 69  no || !sqlite3Bi
2c560 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d  tvecTest(pPager-
2c570 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29  >pInJournal, pg)
2c580 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
2c590 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  pg!=PAGER_MJ_PGN
2c5a0 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
2c5b0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2c5c0 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
2c5d0 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b  er, pg, &pPage);
2c5e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2c5f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2c600 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2c610 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61   pager_write(pPa
2c620 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
2c630 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67   if( pPage->flag
2c640 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
2c650 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  C ){.           
2c660 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
2c670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
2c680 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65  ssert(pPager->ne
2c690 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20  edSync);.       
2c6a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c6b0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
2c6c0 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
2c6d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c6e0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
2c6f0 66 28 20 28 70 50 61 67 65 20 3d 20 70 61 67 65  f( (pPage = page
2c700 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
2c710 20 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20   pg))!=0 ){.    
2c720 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66      if( pPage->f
2c730 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
2c740 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20  SYNC ){.        
2c750 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
2c760 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c770 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
2c780 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
2c790 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
2c7a0 2a 20 49 66 20 74 68 65 20 50 47 48 44 52 5f 4e  * If the PGHDR_N
2c7b0 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73  EED_SYNC flag is
2c7c0 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20   set for any of 
2c7d0 74 68 65 20 6e 50 61 67 65 20 70 61 67 65 73 20  the nPage pages 
2c7e0 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  .    ** starting
2c7f0 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74   at pg1, then it
2c800 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65 74   needs to be set
2c810 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d   for all of them
2c820 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a  . Because.    **
2c830 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20   writing to any 
2c840 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65 20 70  of these nPage p
2c850 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20  ages may damage 
2c860 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a  the others, the.
2c870 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
2c880 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e  ile must contain
2c890 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73   sync()ed copies
2c8a0 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a   of all of them.
2c8b0 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e      ** before an
2c8c0 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65  y of them can be
2c8d0 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
2c8e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2c8f0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
2c900 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c910 26 26 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  && needSync ){. 
2c920 20 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45       assert( !ME
2c930 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 6e  MDB && pPager->n
2c940 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  oSync==0 );.    
2c950 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
2c960 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Page; ii++){.   
2c970 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
2c980 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  e = pager_lookup
2c990 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29  (pPager, pg1+ii)
2c9a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
2c9b0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
2c9c0 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d   pPage->flags |=
2c9d0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
2c9e0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
2c9f0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
2ca00 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
2ca10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
2ca20 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65  sert(pPager->nee
2ca30 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20  dSync);.    }.. 
2ca40 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2ca50 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20  r->doNotSync==1 
2ca60 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
2ca70 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20  oNotSync = 0;.  
2ca80 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
2ca90 70 61 67 65 72 5f 77 72 69 74 65 28 70 44 62 50  pager_write(pDbP
2caa0 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
2cab0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2cac0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
2cad0 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e  he page given in
2cae0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61   the argument wa
2caf0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73  s previously pas
2cb00 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  sed.** to sqlite
2cb10 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 20 20  3PagerWrite().  
2cb20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
2cb30 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  return TRUE if i
2cb40 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68  t is ok.** to ch
2cb50 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  ange the content
2cb60 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   of the page..*/
2cb70 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
2cb80 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2cb90 49 73 77 72 69 74 65 61 62 6c 65 28 44 62 50 61  Iswriteable(DbPa
2cba0 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
2cbb0 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  rn pPg->flags&PG
2cbc0 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e  HDR_DIRTY;.}.#en
2cbd0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  dif../*.** A cal
2cbe0 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
2cbf0 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65  e tells the page
2cc00 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  r that it is not
2cc10 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a   necessary to.**
2cc20 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72   write the infor
2cc30 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70  mation on page p
2cc40 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  Pg back to the d
2cc50 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  isk, even though
2cc60 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69  .** that page mi
2cc70 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ght be marked as
2cc80 20 64 69 72 74 79 2e 20 20 54 68 69 73 20 68 61   dirty.  This ha
2cc90 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70  ppens, for examp
2cca0 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  le, when.** the 
2ccb0 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 61 64  page has been ad
2ccc0 64 65 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66  ded as a leaf of
2ccd0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e   the freelist an
2cce0 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74  d so its.** cont
2ccf0 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61  ent no longer ma
2cd00 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tters..**.** The
2cd10 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77   overlying softw
2cd20 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20  are layer calls 
2cd30 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
2cd40 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74  n all of the dat
2cd50 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65  a.** on the give
2cd60 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64  n page is unused
2cd70 2e 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b  . The pager mark
2cd80 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  s the page as cl
2cd90 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ean so.** that i
2cda0 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77  t does not get w
2cdb0 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a  ritten to disk..
2cdc0 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77  **.** Tests show
2cdd0 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d   that this optim
2cde0 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75 61 64  ization can quad
2cdf0 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20  ruple the speed 
2ce00 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c  of large .** DEL
2ce10 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  ETE operations..
2ce20 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
2ce30 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 50 67  agerDontWrite(Pg
2ce40 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
2ce50 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
2ce60 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
2ce70 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
2ce80 52 5f 44 49 52 54 59 29 20 26 26 20 70 50 61 67  R_DIRTY) && pPag
2ce90 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d  er->nSavepoint==
2cea0 30 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52  0 ){.    PAGERTR
2ceb0 41 43 45 28 28 22 44 4f 4e 54 5f 57 52 49 54 45  ACE(("DONT_WRITE
2cec0 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
2ced0 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41  ", pPg->pgno, PA
2cee0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
2cef0 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43  .    IOTRACE(("C
2cf00 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  LEAN %p %d\n", p
2cf10 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
2cf20 29 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  )).    pPg->flag
2cf30 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f  s |= PGHDR_DONT_
2cf40 57 52 49 54 45 3b 0a 23 69 66 64 65 66 20 53 51  WRITE;.#ifdef SQ
2cf50 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
2cf60 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
2cf70 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
2cf80 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
2cf90 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2cfa0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2cfb0 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e  lled to incremen
2cfc0 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
2cfd0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cfe0 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e   .** change-coun
2cff0 74 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61  ter, stored as a
2d000 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4-byte big-endi
2d010 61 6e 20 69 6e 74 65 67 65 72 20 73 74 61 72 74  an integer start
2d020 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74 65 20  ing at .** byte 
2d030 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74 68 65  offset 24 of the
2d040 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2a 0a   pager file..**.
2d050 2a 2a 20 49 66 20 74 68 65 20 69 73 44 69 72 65  ** If the isDire
2d060 63 74 4d 6f 64 65 20 66 6c 61 67 20 69 73 20 7a  ctMode flag is z
2d070 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 69  ero, then this i
2d080 73 20 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e  s done by callin
2d090 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  g .** sqlite3Pag
2d0a0 65 72 57 72 69 74 65 28 29 20 6f 6e 20 70 61 67  erWrite() on pag
2d0b0 65 20 31 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79  e 1, then modify
2d0c0 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ing the contents
2d0d0 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   of the.** page 
2d0e0 64 61 74 61 2e 20 49 6e 20 74 68 69 73 20 63 61  data. In this ca
2d0f0 73 65 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c  se the file will
2d100 20 62 65 20 75 70 64 61 74 65 64 20 77 68 65 6e   be updated when
2d110 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
2d120 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2d130 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
2d140 54 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65  The isDirectMode
2d150 20 66 6c 61 67 20 6d 61 79 20 6f 6e 6c 79 20 62   flag may only b
2d160 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  e non-zero if th
2d170 65 20 6c 69 62 72 61 72 79 20 77 61 73 20 63 6f  e library was co
2d180 6d 70 69 6c 65 64 0a 2a 2a 20 77 69 74 68 20 74  mpiled.** with t
2d190 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
2d1a0 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 6d 61  _ATOMIC_WRITE ma
2d1b0 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 49 6e 20  cro defined. In 
2d1c0 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 66  this case,.** if
2d1d0 20 69 73 44 69 72 65 63 74 20 69 73 20 6e 6f 6e   isDirect is non
2d1e0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
2d1f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
2d200 20 75 70 64 61 74 65 64 20 64 69 72 65 63 74 6c   updated directl
2d210 79 0a 2a 2a 20 62 79 20 77 72 69 74 69 6e 67 20  y.** by writing 
2d220 61 6e 20 75 70 64 61 74 65 64 20 76 65 72 73 69  an updated versi
2d230 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 75 73 69  on of page 1 usi
2d240 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 74 68 65  ng a call to the
2d250 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 57 72   .** sqlite3OsWr
2d260 69 74 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  ite() function..
2d270 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
2d280 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
2d290 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50  ounter(Pager *pP
2d2a0 61 67 65 72 2c 20 69 6e 74 20 69 73 44 69 72 65  ager, int isDire
2d2b0 63 74 4d 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72  ctMode){.  int r
2d2c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
2d2d0 20 20 2f 2a 20 44 65 63 6c 61 72 65 20 61 6e 64    /* Declare and
2d2e0 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 6e 73   initialize cons
2d2f0 74 61 6e 74 20 69 6e 74 65 67 65 72 20 27 69 73  tant integer 'is
2d300 44 69 72 65 63 74 27 2e 20 49 66 20 74 68 65 0a  Direct'. If the.
2d310 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74    ** atomic-writ
2d320 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
2d330 73 20 65 6e 61 62 6c 65 64 20 69 6e 20 74 68 69  s enabled in thi
2d340 73 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 69 73  s build, then is
2d350 44 69 72 65 63 74 0a 20 20 2a 2a 20 69 73 20 69  Direct.  ** is i
2d360 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68  nitialized to th
2d370 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  e value passed a
2d380 73 20 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f  s the isDirectMo
2d390 64 65 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a  de parameter.  *
2d3a0 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  * to this functi
2d3b0 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  on. Otherwise, i
2d3c0 74 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20  t is always set 
2d3d0 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20  to zero..  **.  
2d3e0 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74  ** The idea is t
2d3f0 68 61 74 20 69 66 20 74 68 65 20 61 74 6f 6d 69  hat if the atomi
2d400 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
2d410 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  tion is not.  **
2d420 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
2d430 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 20 63 6f  ile time, the co
2d440 6d 70 69 6c 65 72 20 63 61 6e 20 6f 6d 69 74 20  mpiler can omit 
2d450 74 68 65 20 74 65 73 74 73 20 6f 66 0a 20 20 2a  the tests of.  *
2d460 2a 20 27 69 73 44 69 72 65 63 74 27 20 62 65 6c  * 'isDirect' bel
2d470 6f 77 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 74  ow, as well as t
2d480 68 65 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65  he block enclose
2d490 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 69  d in the.  ** "i
2d4a0 66 28 20 69 73 44 69 72 65 63 74 20 29 22 20 63  f( isDirect )" c
2d4b0 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  ondition..  */.#
2d4c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
2d4d0 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
2d4e0 45 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45 43  E.# define DIREC
2d4f0 54 5f 4d 4f 44 45 20 30 0a 20 20 61 73 73 65 72  T_MODE 0.  asser
2d500 74 28 20 69 73 44 69 72 65 63 74 4d 6f 64 65 3d  t( isDirectMode=
2d510 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =0 );.  UNUSED_P
2d520 41 52 41 4d 45 54 45 52 28 69 73 44 69 72 65 63  ARAMETER(isDirec
2d530 74 4d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 23 20  tMode);.#else.# 
2d540 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f  define DIRECT_MO
2d550 44 45 20 69 73 44 69 72 65 63 74 4d 6f 64 65 0a  DE isDirectMode.
2d560 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
2d570 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
2d580 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
2d590 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
2d5a0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
2d5b0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53  e && pPager->dbS
2d5c0 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 50 67 48  ize>0 ){.    PgH
2d5d0 64 72 20 2a 70 50 67 48 64 72 3b 20 20 20 20 20  dr *pPgHdr;     
2d5e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2d5f0 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
2d600 31 20 2a 2f 0a 20 20 20 20 75 33 32 20 63 68 61  1 */.    u32 cha
2d610 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 20 20 20 20  nge_counter;    
2d620 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
2d630 6c 20 76 61 6c 75 65 20 6f 66 20 63 68 61 6e 67  l value of chang
2d640 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
2d650 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
2d660 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
2d670 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  e && isOpen(pPag
2d680 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20 20  er->fd) );..    
2d690 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f  /* Open page 1 o
2d6a0 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77  f the file for w
2d6b0 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72  riting. */.    r
2d6c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2d6d0 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26  Get(pPager, 1, &
2d6e0 70 50 67 48 64 72 29 3b 0a 20 20 20 20 61 73 73  pPgHdr);.    ass
2d6f0 65 72 74 28 20 70 50 67 48 64 72 3d 3d 30 20 7c  ert( pPgHdr==0 |
2d700 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc==SQLITE_OK 
2d710 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 61  );..    /* If pa
2d720 67 65 20 6f 6e 65 20 77 61 73 20 66 65 74 63 68  ge one was fetch
2d730 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ed successfully,
2d740 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
2d750 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a  on is not.    **
2d760 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 64 69   operating in di
2d770 72 65 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20  rect-mode, make 
2d780 70 61 67 65 20 31 20 77 72 69 74 61 62 6c 65 2e  page 1 writable.
2d790 20 20 57 68 65 6e 20 6e 6f 74 20 69 6e 20 0a 20    When not in . 
2d7a0 20 20 20 2a 2a 20 64 69 72 65 63 74 20 6d 6f 64     ** direct mod
2d7b0 65 2c 20 70 61 67 65 20 31 20 69 73 20 61 6c 77  e, page 1 is alw
2d7c0 61 79 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68  ays held in cach
2d7d0 65 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20  e and hence the 
2d7e0 50 61 67 65 72 47 65 74 28 29 0a 20 20 20 20 2a  PagerGet().    *
2d7f0 2a 20 61 62 6f 76 65 20 69 73 20 61 6c 77 61 79  * above is alway
2d800 73 20 73 75 63 63 65 73 73 66 75 6c 20 2d 20 68  s successful - h
2d810 65 6e 63 65 20 74 68 65 20 41 4c 57 41 59 53 20  ence the ALWAYS 
2d820 6f 6e 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  on rc==SQLITE_OK
2d830 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2d840 20 21 44 49 52 45 43 54 5f 4d 4f 44 45 20 26 26   !DIRECT_MODE &&
2d850 20 41 4c 57 41 59 53 28 72 63 3d 3d 53 51 4c 49   ALWAYS(rc==SQLI
2d860 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20  TE_OK) ){.      
2d870 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2d880 72 57 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a  rWrite(pPgHdr);.
2d890 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
2d8a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2d8b0 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65        /* Increme
2d8c0 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73  nt the value jus
2d8d0 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65  t read and write
2d8e0 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65   it back to byte
2d8f0 20 32 34 2e 20 2a 2f 0a 20 20 20 20 20 20 63 68   24. */.      ch
2d900 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73  ange_counter = s
2d910 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28  qlite3Get4byte((
2d920 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69  u8*)pPager->dbFi
2d930 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 20 20 63  leVers);.      c
2d940 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b  hange_counter++;
2d950 0a 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73  .      put32bits
2d960 28 28 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d  (((char*)pPgHdr-
2d970 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e  >pData)+24, chan
2d980 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20  ge_counter);..  
2d990 20 20 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f 72      /* Also stor
2d9a0 65 20 74 68 65 20 53 51 4c 69 74 65 20 76 65 72  e the SQLite ver
2d9b0 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20 62  sion number in b
2d9c0 79 74 65 73 20 39 36 2e 2e 39 39 20 2a 2f 0a 20  ytes 96..99 */. 
2d9d0 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28       put32bits((
2d9e0 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70  (char*)pPgHdr->p
2d9f0 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45  Data)+96, SQLITE
2da00 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29  _VERSION_NUMBER)
2da10 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  ;..      /* If r
2da20 75 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65 63 74  unning in direct
2da30 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 74 68 65   mode, write the
2da40 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67   contents of pag
2da50 65 20 31 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  e 1 to the file.
2da60 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 44 49   */.      if( DI
2da70 52 45 43 54 5f 4d 4f 44 45 20 29 7b 0a 20 20 20  RECT_MODE ){.   
2da80 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20       const void 
2da90 2a 7a 42 75 66 20 3d 20 70 50 67 48 64 72 2d 3e  *zBuf = pPgHdr->
2daa0 70 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 61  pData;.        a
2dab0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
2dac0 62 46 69 6c 65 53 69 7a 65 3e 30 20 29 3b 0a 20  bFileSize>0 );. 
2dad0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2dae0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
2daf0 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61  r->fd, zBuf, pPa
2db00 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30  ger->pageSize, 0
2db10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2db20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2db30 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
2db40 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
2db50 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  e = 1;.        }
2db60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2db70 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68        pPager->ch
2db80 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
2db90 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
2dba0 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  ..    /* Release
2dbb0 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65   the page refere
2dbc0 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  nce. */.    sqli
2dbd0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
2dbe0 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  gHdr);.  }.  ret
2dbf0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2dc00 20 53 79 6e 63 20 74 68 65 20 70 61 67 65 72 20   Sync the pager 
2dc10 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 20 54 68  file to disk. Th
2dc20 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  is is a no-op fo
2dc30 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  r in-memory file
2dc40 73 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20 77 69  s.** or pages wi
2dc50 74 68 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53  th the Pager.noS
2dc60 79 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a  ync flag set..**
2dc70 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
2dc80 6c 2c 20 6f 72 20 63 61 6c 6c 65 64 20 6f 6e 20  l, or called on 
2dc90 61 20 70 61 67 65 72 20 66 6f 72 20 77 68 69 63  a pager for whic
2dca0 68 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2c  h it is a no-op,
2dcb0 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
2dcc0 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
2dcd0 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  _OK. Otherwise, 
2dce0 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
2dcf0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
2dd00 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2dd10 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  rSync(Pager *pPa
2dd20 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ger){.  int rc; 
2dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2dd50 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2dd60 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
2dd70 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
2dd80 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  >noSync ){.    r
2dd90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2dda0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
2ddb0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
2ddc0 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
2ddd0 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
2dde0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2ddf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
2de00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2de10 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70   for the pager p
2de20 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70  Pager. zMaster p
2de30 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d  oints to the nam
2de40 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72  e.** of a master
2de50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
2de60 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
2de70 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e  tten into the in
2de80 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72  dividual.** jour
2de90 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65  nal file. zMaste
2dea0 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77  r may be NULL, w
2deb0 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65  hich is interpre
2dec0 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72  ted as no master
2ded0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73  .** journal (a s
2dee0 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
2def0 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
2df00 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2df10 65 6e 73 75 72 65 73 20 74 68 61 74 3a 0a 2a 2a  ensures that:.**
2df20 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61  .**   * The data
2df30 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65  base file change
2df40 2d 63 6f 75 6e 74 65 72 20 69 73 20 75 70 64 61  -counter is upda
2df50 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68 65 20  ted,.**   * the 
2df60 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
2df70 64 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61 74  d (unless the at
2df80 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
2df90 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64 29  ization is used)
2dfa0 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64 69 72  ,.**   * all dir
2dfb0 74 79 20 70 61 67 65 73 20 61 72 65 20 77 72 69  ty pages are wri
2dfc0 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
2dfd0 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a 20 20  base file, .**  
2dfe0 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20   * the database 
2dff0 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65  file is truncate
2e000 64 20 28 69 66 20 72 65 71 75 69 72 65 64 29 2c  d (if required),
2e010 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20   and.**   * the 
2e020 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79  database file sy
2e030 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  nced. .**.** The
2e040 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74   only thing that
2e050 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d   remains to comm
2e060 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
2e070 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c 69 7a  on is to finaliz
2e080 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c 20 74  e .** (delete, t
2e090 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20  runcate or zero 
2e0a0 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20 6f  the first part o
2e0b0 66 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  f) the journal f
2e0c0 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65 6c 65  ile (or .** dele
2e0d0 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
2e0e0 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70  urnal file if sp
2e0f0 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20  ecified)..**.** 
2e100 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61  Note that if zMa
2e110 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73  ster==NULL, this
2e120 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72   does not overwr
2e130 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76  ite a previous v
2e140 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74  alue.** passed t
2e150 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65  o an sqlite3Page
2e160 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
2e170 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ) call..**.** If
2e180 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d   the final param
2e190 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20  eter - noSync - 
2e1a0 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
2e1b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2e1c0 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74  itself.** is not
2e1d0 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61 6c   synced. The cal
2e1e0 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73 71  ler must call sq
2e1f0 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 29  lite3PagerSync()
2e200 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20   directly to.** 
2e210 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
2e220 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61  e file before ca
2e230 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73  lling CommitPhas
2e240 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74 65  eTwo() to delete
2e250 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
2e260 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73  file in this cas
2e270 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
2e280 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
2e290 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a 70  eOne(.  Pager *p
2e2a0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
2e2b0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
2e2c0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
2e2d0 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
2e2e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2e2f0 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  If not NULL, the
2e300 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2e310 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  name */.  int no
2e320 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20  Sync            
2e330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2e340 65 20 74 6f 20 6f 6d 69 74 20 74 68 65 20 78 53  e to omit the xS
2e350 79 6e 63 20 6f 6e 20 74 68 65 20 64 62 20 66 69  ync on the db fi
2e360 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  le */.){.  int r
2e370 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2e380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2e390 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
2e3a0 2f 2a 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a  /* The dbOrigSiz
2e3b0 65 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 69  e is never set i
2e3c0 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f  f journal_mode=O
2e3d0 46 46 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  FF */.  assert( 
2e3e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2e3f0 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
2e400 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 50  ALMODE_OFF || pP
2e410 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
2e420 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ==0 );..  /* If 
2e430 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 6f 63  a prior error oc
2e440 63 75 72 72 65 64 2c 20 72 65 70 6f 72 74 20 74  curred, report t
2e450 68 61 74 20 65 72 72 6f 72 20 61 67 61 69 6e 2e  hat error again.
2e460 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
2e470 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
2e480 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
2e490 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 50 41  ->errCode;..  PA
2e4a0 47 45 52 54 52 41 43 45 28 28 22 44 41 54 41 42  GERTRACE(("DATAB
2e4b0 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25  ASE SYNC: File=%
2e4c0 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 53 69  s zMaster=%s nSi
2e4d0 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  ze=%d\n", .     
2e4e0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2e4f0 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  me, zMaster, pPa
2e500 67 65 72 2d 3e 64 62 53 69 7a 65 29 29 3b 0a 0a  ger->dbSize));..
2e510 20 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20 70    if( MEMDB && p
2e520 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
2e530 64 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  d ){.    /* If t
2e540 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
2e550 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61  ory db, or no pa
2e560 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
2e570 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69  itten to, or thi
2e580 73 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f  s.    ** functio
2e590 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
2e5a0 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  en called, it is
2e5b0 20 6d 6f 73 74 6c 79 20 61 20 6e 6f 2d 6f 70 2e   mostly a no-op.
2e5c0 20 20 48 6f 77 65 76 65 72 2c 20 61 6e 79 0a 20    However, any. 
2e5d0 20 20 20 2a 2a 20 62 61 63 6b 75 70 20 69 6e 20     ** backup in 
2e5e0 70 72 6f 67 72 65 73 73 20 6e 65 65 64 73 20 74  progress needs t
2e5f0 6f 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a  o be restarted..
2e600 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
2e610 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
2e620 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
2e630 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
2e640 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
2e650 45 52 5f 53 59 4e 43 45 44 20 26 26 20 70 50 61  ER_SYNCED && pPa
2e660 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
2e670 29 7b 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  ){.    if( pager
2e680 55 73 65 4c 6f 67 28 70 50 61 67 65 72 29 20 29  UseLog(pPager) )
2e690 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  {.      PgHdr *p
2e6a0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
2e6b0 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
2e6c0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
2e6d0 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 20        if( pList 
2e6e0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2e6f0 73 71 6c 69 74 65 33 4c 6f 67 46 72 61 6d 65 73  sqlite3LogFrames
2e700 28 70 50 61 67 65 72 2d 3e 70 4c 6f 67 2c 20 70  (pPager->pLog, p
2e710 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
2e720 20 70 4c 69 73 74 2c 0a 20 20 20 20 20 20 20 20   pList,.        
2e730 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
2e740 7a 65 2c 20 31 2c 20 28 70 50 61 67 65 72 2d 3e  ze, 1, (pPager->
2e750 66 75 6c 6c 53 79 6e 63 20 3f 20 70 50 61 67 65  fullSync ? pPage
2e760 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3a 20  r->sync_flags : 
2e770 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  0).        );.  
2e780 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
2e790 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
2e7a0 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  l(pPager->pPCach
2e7b0 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
2e7c0 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c       /* The foll
2e7d0 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61  owing block upda
2e7e0 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63  tes the change-c
2e7f0 6f 75 6e 74 65 72 2e 20 45 78 61 63 74 6c 79 20  ounter. Exactly 
2e800 68 6f 77 20 69 74 0a 20 20 20 20 20 20 2a 2a 20  how it.      ** 
2e810 64 6f 65 73 20 74 68 69 73 20 64 65 70 65 6e 64  does this depend
2e820 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  s on whether or 
2e830 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 75  not the atomic-u
2e840 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  pdate optimizati
2e850 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20  on.      ** was 
2e860 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
2e870 6c 65 20 74 69 6d 65 2c 20 61 6e 64 20 69 66 20  le time, and if 
2e880 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
2e890 20 6d 65 65 74 73 20 74 68 65 20 0a 20 20 20 20   meets the .    
2e8a0 20 20 2a 2a 20 72 75 6e 74 69 6d 65 20 63 72 69    ** runtime cri
2e8b0 74 65 72 69 61 20 74 6f 20 75 73 65 20 74 68 65  teria to use the
2e8c0 20 6f 70 65 72 61 74 69 6f 6e 3a 20 0a 20 20 20   operation: .   
2e8d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
2e8e0 20 20 2a 20 54 68 65 20 66 69 6c 65 2d 73 79 73    * The file-sys
2e8f0 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65  tem supports the
2e900 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72   atomic-write pr
2e910 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20 20 20  operty for.     
2e920 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20   **      blocks 
2e930 6f 66 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a  of size page-siz
2e940 65 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a  e, and .      **
2e950 20 20 20 20 2a 20 54 68 69 73 20 63 6f 6d 6d 69      * This commi
2e960 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  t is not part of
2e970 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72   a multi-file tr
2e980 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20  ansaction, and. 
2e990 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 45 78 61       **    * Exa
2e9a0 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61  ctly one page ha
2e9b0 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  s been modified 
2e9c0 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65  and store in the
2e9d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
2e9e0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2e9f0 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
2ea00 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 65 6e 61  tion was not ena
2ea10 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20  bled at compile 
2ea20 74 69 6d 65 2c 20 74 68 65 6e 20 74 68 65 0a 20  time, then the. 
2ea30 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e       ** pager_in
2ea40 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
2ea50 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  () function is c
2ea60 61 6c 6c 65 64 20 74 6f 20 75 70 64 61 74 65 20  alled to update 
2ea70 74 68 65 20 63 68 61 6e 67 65 0a 20 20 20 20 20  the change.     
2ea80 20 2a 2a 20 63 6f 75 6e 74 65 72 20 69 6e 20 27   ** counter in '
2ea90 69 6e 64 69 72 65 63 74 2d 6d 6f 64 65 27 2e 20  indirect-mode'. 
2eaa0 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  If the optimizat
2eab0 69 6f 6e 20 69 73 20 63 6f 6d 70 69 6c 65 64 20  ion is compiled 
2eac0 69 6e 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20  in but.      ** 
2ead0 69 73 20 6e 6f 74 20 61 70 70 6c 69 63 61 62 6c  is not applicabl
2eae0 65 20 74 6f 20 74 68 69 73 20 74 72 61 6e 73 61  e to this transa
2eaf0 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c 69  ction, call sqli
2eb00 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65  te3JournalCreate
2eb10 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d  ().      ** to m
2eb20 61 6b 65 20 73 75 72 65 20 74 68 65 20 6a 6f 75  ake sure the jou
2eb30 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 61 63  rnal file has ac
2eb40 74 75 61 6c 6c 79 20 62 65 65 6e 20 63 72 65 61  tually been crea
2eb50 74 65 64 2c 20 74 68 65 6e 20 63 61 6c 6c 0a 20  ted, then call. 
2eb60 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e       ** pager_in
2eb70 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
2eb80 28 29 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  () to update the
2eb90 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
2eba0 69 6e 20 69 6e 64 69 72 65 63 74 0a 20 20 20 20  in indirect.    
2ebb0 20 20 2a 2a 20 6d 6f 64 65 2e 20 0a 20 20 20 20    ** mode. .    
2ebc0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 74    **.      ** Ot
2ebd0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
2ebe0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
2ebf0 62 6f 74 68 20 65 6e 61 62 6c 65 64 20 61 6e 64  both enabled and
2ec00 20 61 70 70 6c 69 63 61 62 6c 65 2c 0a 20 20 20   applicable,.   
2ec10 20 20 20 2a 2a 20 74 68 65 6e 20 63 61 6c 6c 20     ** then call 
2ec20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
2ec30 65 63 6f 75 6e 74 65 72 28 29 20 74 6f 20 75 70  ecounter() to up
2ec40 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d  date the change-
2ec50 63 6f 75 6e 74 65 72 0a 20 20 20 20 20 20 2a 2a  counter.      **
2ec60 20 69 6e 20 27 64 69 72 65 63 74 27 20 6d 6f 64   in 'direct' mod
2ec70 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
2ec80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2ec90 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 0a 20   will never be. 
2eca0 20 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20       ** created 
2ecb0 66 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61 63  for this transac
2ecc0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
2ecd0 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45   #ifdef SQLITE_E
2ece0 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
2ecf0 54 45 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  TE.      PgHdr *
2ed00 70 50 67 3b 0a 20 20 20 20 20 20 61 73 73 65 72  pPg;.      asser
2ed10 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2ed20 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72  ->jfd) || pPager
2ed30 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
2ed40 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2ed50 5f 4f 46 46 20 29 3b 0a 20 20 20 20 20 20 69 66  _OFF );.      if
2ed60 28 20 21 7a 4d 61 73 74 65 72 20 26 26 20 69 73  ( !zMaster && is
2ed70 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2ed80 29 20 0a 20 20 20 20 20 20 20 26 26 20 70 50 61  ) .       && pPa
2ed90 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
2eda0 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28  =jrnlBufferSize(
2edb0 70 50 61 67 65 72 29 20 0a 20 20 20 20 20 20 20  pPager) .       
2edc0 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
2edd0 65 3e 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e>=pPager->dbFil
2ede0 65 53 69 7a 65 0a 20 20 20 20 20 20 20 26 26 20  eSize.       && 
2edf0 28 30 3d 3d 28 70 50 67 20 3d 20 73 71 6c 69 74  (0==(pPg = sqlit
2ee00 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73  e3PcacheDirtyLis
2ee10 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
2ee20 65 29 29 20 7c 7c 20 30 3d 3d 70 50 67 2d 3e 70  e)) || 0==pPg->p
2ee30 44 69 72 74 79 29 0a 20 20 20 20 20 20 29 7b 0a  Dirty).      ){.
2ee40 20 20 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74          /* Updat
2ee50 65 20 74 68 65 20 64 62 20 66 69 6c 65 20 63 68  e the db file ch
2ee60 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 76 69 61  ange counter via
2ee70 20 74 68 65 20 64 69 72 65 63 74 2d 77 72 69 74   the direct-writ
2ee80 65 20 6d 65 74 68 6f 64 2e 20 54 68 65 20 0a 20  e method. The . 
2ee90 20 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77         ** follow
2eea0 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f  ing call will mo
2eeb0 64 69 66 79 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  dify the in-memo
2eec0 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
2eed0 6e 20 6f 66 20 70 61 67 65 20 31 20 0a 20 20 20  n of page 1 .   
2eee0 20 20 20 20 20 2a 2a 20 74 6f 20 69 6e 63 6c 75       ** to inclu
2eef0 64 65 20 74 68 65 20 75 70 64 61 74 65 64 20 63  de the updated c
2ef00 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 61 6e  hange counter an
2ef10 64 20 74 68 65 6e 20 77 72 69 74 65 20 70 61 67  d then write pag
2ef20 65 20 31 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  e 1 .        ** 
2ef30 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
2ef40 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 42  database file. B
2ef50 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 61 74  ecause of the at
2ef60 6f 6d 69 63 2d 77 72 69 74 65 20 0a 20 20 20 20  omic-write .    
2ef70 20 20 20 20 2a 2a 20 70 72 6f 70 65 72 74 79 20      ** property 
2ef80 6f 66 20 74 68 65 20 68 6f 73 74 20 66 69 6c 65  of the host file
2ef90 2d 73 79 73 74 65 6d 2c 20 74 68 69 73 20 69 73  -system, this is
2efa0 20 73 61 66 65 2e 0a 20 20 20 20 20 20 20 20 2a   safe..        *
2efb0 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  /.        rc = p
2efc0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
2efd0 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20  counter(pPager, 
2efe0 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
2eff0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2f000 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61  lite3JournalCrea
2f010 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  te(pPager->jfd);
2f020 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
2f030 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f040 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
2f050 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
2f060 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30 29  unter(pPager, 0)
2f070 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2f080 20 20 7d 0a 20 20 23 65 6c 73 65 0a 20 20 20 20    }.  #else.    
2f090 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
2f0a0 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
2f0b0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 23 65  pPager, 0);.  #e
2f0c0 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72  ndif.      if( r
2f0d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
2f0e0 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65  oto commit_phase
2f0f0 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 0a 20 20  _one_exit;.  .  
2f100 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74      /* If this t
2f110 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d  ransaction has m
2f120 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ade the database
2f130 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61   smaller, then a
2f140 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  ll pages.      *
2f150 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72 64 65  * being discarde
2f160 64 20 62 79 20 74 68 65 20 74 72 75 6e 63 61 74  d by the truncat
2f170 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74  ion must be writ
2f180 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
2f190 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  al.      ** file
2f1a0 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  . This can only 
2f1b0 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76  happen in auto-v
2f1c0 61 63 75 75 6d 20 6d 6f 64 65 2e 0a 20 20 20 20  acuum mode..    
2f1d0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42 65    **.      ** Be
2f1e0 66 6f 72 65 20 72 65 61 64 69 6e 67 20 74 68 65  fore reading the
2f1f0 20 70 61 67 65 73 20 77 69 74 68 20 70 61 67 65   pages with page
2f200 20 6e 75 6d 62 65 72 73 20 6c 61 72 67 65 72 20   numbers larger 
2f210 74 68 61 6e 20 74 68 65 20 0a 20 20 20 20 20 20  than the .      
2f220 2a 2a 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  ** current value
2f230 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65   of Pager.dbSize
2f240 2c 20 73 65 74 20 64 62 53 69 7a 65 20 62 61 63  , set dbSize bac
2f250 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 20  k to the value. 
2f260 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 74 20       ** that it 
2f270 74 6f 6f 6b 20 61 74 20 74 68 65 20 73 74 61 72  took at the star
2f280 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
2f290 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c  tion. Otherwise,
2f2a0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61   the.      ** ca
2f2b0 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61  lls to sqlite3Pa
2f2c0 67 65 72 47 65 74 28 29 20 72 65 74 75 72 6e 20  gerGet() return 
2f2d0 7a 65 72 6f 65 64 20 70 61 67 65 73 20 69 6e 73  zeroed pages ins
2f2e0 74 65 61 64 20 6f 66 20 0a 20 20 20 20 20 20 2a  tead of .      *
2f2f0 2a 20 72 65 61 64 69 6e 67 20 64 61 74 61 20 66  * reading data f
2f300 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
2f310 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a   file..      **.
2f320 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 6a 6f        ** When jo
2f330 75 72 6e 61 6c 5f 6d 6f 64 65 3d 3d 4f 46 46 20  urnal_mode==OFF 
2f340 74 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 69  the dbOrigSize i
2f350 73 20 61 6c 77 61 79 73 20 7a 65 72 6f 2c 20 73  s always zero, s
2f360 6f 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  o this.      ** 
2f370 62 6c 6f 63 6b 20 6e 65 76 65 72 20 72 75 6e 73  block never runs
2f380 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   if journal_mode
2f390 3d 4f 46 46 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  =OFF..      */. 
2f3a0 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
2f3b0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2f3c0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
2f3d0 2d 3e 64 62 53 69 7a 65 3c 70 50 61 67 65 72 2d  ->dbSize<pPager-
2f3e0 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20  >dbOrigSize .   
2f3f0 20 20 20 20 26 26 20 41 4c 57 41 59 53 28 70 50      && ALWAYS(pP
2f400 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2f410 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
2f420 4d 4f 44 45 5f 4f 46 46 29 0a 20 20 20 20 20 20  MODE_OFF).      
2f430 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
2f440 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
2f450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f460 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
2f470 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20   variable */.   
2f480 20 20 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20       const Pgno 
2f490 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a  iSkip = PAGER_MJ
2f4a0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 20 2f  _PGNO(pPager); /
2f4b0 2a 20 50 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 70  * Pending lock p
2f4c0 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  age */.        c
2f4d0 6f 6e 73 74 20 50 67 6e 6f 20 64 62 53 69 7a 65  onst Pgno dbSize
2f4e0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
2f4f0 65 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  e;       /* Data
2f500 62 61 73 65 20 69 6d 61 67 65 20 73 69 7a 65 20  base image size 
2f510 2a 2f 20 0a 20 20 20 20 20 20 20 20 70 50 61 67  */ .        pPag
2f520 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
2f530 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
2f540 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d  .        for( i=
2f550 64 62 53 69 7a 65 2b 31 3b 20 69 3c 3d 70 50 61  dbSize+1; i<=pPa
2f560 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
2f570 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20   i++ ){.        
2f580 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 42 69    if( !sqlite3Bi
2f590 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d  tvecTest(pPager-
2f5a0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29 20  >pInJournal, i) 
2f5b0 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20  && i!=iSkip ){. 
2f5c0 20 20 20 20 20 20 20 20 20 20 20 50 67 48 64 72             PgHdr
2f5d0 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
2f5e0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20       /* Page to 
2f5f0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 20  journal */.     
2f600 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2f610 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
2f620 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29 3b 0a  er, i, &pPage);.
2f630 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2f640 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2f650 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
2f660 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20  e_one_exit;.    
2f670 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2f680 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2f690 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2f6a0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
2f6b0 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
2f6c0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2f6d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2f6e0 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
2f6f0 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  ne_exit;.       
2f700 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2f710 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
2f720 62 53 69 7a 65 20 3d 20 64 62 53 69 7a 65 3b 0a  bSize = dbSize;.
2f730 20 20 20 20 20 20 7d 20 0a 20 20 23 65 6e 64 69        } .  #endi
2f740 66 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 57 72  f.  .      /* Wr
2f750 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
2f760 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f  ournal name into
2f770 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2f780 65 2e 20 49 66 20 61 20 6d 61 73 74 65 72 20 0a  e. If a master .
2f790 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
2f7a0 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61   file name has a
2f7b0 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
2f7c0 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
2f7d0 61 6c 20 66 69 6c 65 2c 20 0a 20 20 20 20 20 20  al file, .      
2f7e0 2a 2a 20 6f 72 20 69 66 20 7a 4d 61 73 74 65 72  ** or if zMaster
2f7f0 20 69 73 20 4e 55 4c 4c 20 28 6e 6f 20 6d 61 73   is NULL (no mas
2f800 74 65 72 20 6a 6f 75 72 6e 61 6c 29 2c 20 74 68  ter journal), th
2f810 65 6e 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  en this call is 
2f820 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 20 20 2a  a no-op..      *
2f830 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  /.      rc = wri
2f840 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
2f850 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
2f860 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2f870 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2f880 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
2f890 65 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20 20 20  e_exit;.  .     
2f8a0 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
2f8b0 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
2f8c0 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20  e atomic-update 
2f8d0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
2f8e0 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 75  being.      ** u
2f8f0 73 65 64 2c 20 74 68 69 73 20 63 61 6c 6c 20 77  sed, this call w
2f900 69 6c 6c 20 6e 6f 74 20 63 72 65 61 74 65 20 74  ill not create t
2f910 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2f920 6f 72 20 70 65 72 66 6f 72 6d 20 61 6e 79 0a 20  or perform any. 
2f930 20 20 20 20 20 2a 2a 20 72 65 61 6c 20 49 4f 2e       ** real IO.
2f940 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2f950 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
2f960 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
2f970 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2f980 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f  K ) goto commit_
2f990 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
2f9a0 20 20 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74    .      /* Writ
2f9b0 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  e all dirty page
2f9c0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
2f9d0 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  e file. */.     
2f9e0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
2f9f0 65 5f 70 61 67 65 6c 69 73 74 28 73 71 6c 69 74  e_pagelist(sqlit
2fa00 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73  e3PcacheDirtyLis
2fa10 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
2fa20 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  e));.      if( r
2fa30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2fa40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2fa50 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
2fa60 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20  _BLOCKED );.    
2fa70 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f      goto commit_
2fa80 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
2fa90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
2faa0 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e  lite3PcacheClean
2fab0 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61  All(pPager->pPCa
2fac0 63 68 65 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f  che);.  .      /
2fad0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  * If the file on
2fae0 20 64 69 73 6b 20 69 73 20 6e 6f 74 20 74 68 65   disk is not the
2faf0 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20 74 68   same size as th
2fb00 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
2fb10 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
2fb20 75 73 65 20 70 61 67 65 72 5f 74 72 75 6e 63 61  use pager_trunca
2fb30 74 65 20 74 6f 20 67 72 6f 77 20 6f 72 20 73 68  te to grow or sh
2fb40 72 69 6e 6b 20 74 68 65 20 66 69 6c 65 20 68 65  rink the file he
2fb50 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  re..      */.   
2fb60 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
2fb70 62 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 64  bSize!=pPager->d
2fb80 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  bFileSize ){.   
2fb90 20 20 20 20 20 50 67 6e 6f 20 6e 4e 65 77 20 3d       Pgno nNew =
2fba0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
2fbb0 2d 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  - (pPager->dbSiz
2fbc0 65 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  e==PAGER_MJ_PGNO
2fbd0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
2fbe0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2fbf0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
2fc00 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 20  EXCLUSIVE );.   
2fc10 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
2fc20 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
2fc30 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   nNew);.        
2fc40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2fc50 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f  K ) goto commit_
2fc60 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
2fc70 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
2fc80 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 73 79 6e   /* Finally, syn
2fc90 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
2fca0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ile. */.      if
2fcb0 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
2fcc0 63 20 26 26 20 21 6e 6f 53 79 6e 63 20 29 7b 0a  c && !noSync ){.
2fcd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2fce0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
2fcf0 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  r->fd, pPager->s
2fd00 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20  ync_flags);.    
2fd10 20 20 7d 0a 20 20 20 20 20 20 49 4f 54 52 41 43    }.      IOTRAC
2fd20 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22  E(("DBSYNC %p\n"
2fd30 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 7d  , pPager)).    }
2fd40 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ..    pPager->st
2fd50 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43  ate = PAGER_SYNC
2fd60 45 44 3b 0a 20 20 7d 0a 0a 63 6f 6d 6d 69 74 5f  ED;.  }..commit_
2fd70 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3a 0a  phase_one_exit:.
2fd80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2fd90 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  ./*.** When this
2fda0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2fdb0 6c 65 64 2c 20 74 68 65 20 64 61 74 61 62 61 73  led, the databas
2fdc0 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  e file has been 
2fdd0 63 6f 6d 70 6c 65 74 65 6c 79 0a 2a 2a 20 75 70  completely.** up
2fde0 64 61 74 65 64 20 74 6f 20 72 65 66 6c 65 63 74  dated to reflect
2fdf0 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64   the changes mad
2fe00 65 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  e by the current
2fe10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
2fe20 0a 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69  .** synced to di
2fe30 73 6b 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  sk. The journal 
2fe40 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73 74  file still exist
2fe50 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  s in the file-sy
2fe60 73 74 65 6d 20 0a 2a 2a 20 74 68 6f 75 67 68 2c  stem .** though,
2fe70 20 61 6e 64 20 69 66 20 61 20 66 61 69 6c 75 72   and if a failur
2fe80 65 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73  e occurs at this
2fe90 20 70 6f 69 6e 74 20 69 74 20 77 69 6c 6c 20 65   point it will e
2fea0 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 62 65 20  ventually.** be 
2feb0 75 73 65 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f  used as a hot-jo
2fec0 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 63 75  urnal and the cu
2fed0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
2fee0 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
2fef0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2ff00 6f 6e 20 66 69 6e 61 6c 69 7a 65 73 20 74 68 65  on finalizes the
2ff10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 65   journal file, e
2ff20 69 74 68 65 72 20 62 79 20 64 65 6c 65 74 69 6e  ither by deletin
2ff30 67 2c 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6e  g, .** truncatin
2ff40 67 20 6f 72 20 70 61 72 74 69 61 6c 6c 79 20 7a  g or partially z
2ff50 65 72 6f 69 6e 67 20 69 74 2c 20 73 6f 20 74 68  eroing it, so th
2ff60 61 74 20 69 74 20 63 61 6e 6e 6f 74 20 62 65 20  at it cannot be 
2ff70 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 68 6f 74  used .** for hot
2ff80 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
2ff90 6b 2e 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20  k. Once this is 
2ffa0 64 6f 6e 65 20 74 68 65 20 74 72 61 6e 73 61 63  done the transac
2ffb0 74 69 6f 6e 20 69 73 0a 2a 2a 20 69 72 72 65 76  tion is.** irrev
2ffc0 6f 63 61 62 6c 79 20 63 6f 6d 6d 69 74 74 65 64  ocably committed
2ffd0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
2ffe0 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 49  ror occurs, an I
2fff0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
30000 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
30010 20 70 61 67 65 72 0a 2a 2a 20 6d 6f 76 65 73 20   pager.** moves 
30020 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73  into the error s
30030 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tate. Otherwise,
30040 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
30050 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
30060 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
30070 74 50 68 61 73 65 54 77 6f 28 50 61 67 65 72 20  tPhaseTwo(Pager 
30080 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
30090 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
300a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
300b0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
300c0 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  */..  /* This ro
300d0 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74  utine should not
300e0 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 61 20   be called if a 
300f0 70 72 69 6f 72 20 65 72 72 6f 72 20 68 61 73 20  prior error has 
30100 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20 42  occurred..  ** B
30110 75 74 20 69 66 20 28 64 75 65 20 74 6f 20 61 20  ut if (due to a 
30120 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 65 6c 73  coding error els
30130 65 77 68 65 72 65 20 69 6e 20 74 68 65 20 73 79  ewhere in the sy
30140 73 74 65 6d 29 20 69 74 20 64 6f 65 73 20 67 65  stem) it does ge
30150 74 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 6a  t.  ** called, j
30160 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73  ust return the s
30170 61 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20 77  ame error code w
30180 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
30190 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20  thing. */.  if( 
301a0 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72  NEVER(pPager->er
301b0 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20  rCode) ) return 
301c0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
301d0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
301e0 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20  tion should not 
301f0 62 65 20 63 61 6c 6c 65 64 20 69 66 20 74 68 65  be called if the
30200 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
30210 20 61 74 20 6c 65 61 73 74 0a 20 20 2a 2a 20 50   at least.  ** P
30220 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74  AGER_RESERVED st
30230 61 74 65 2e 20 41 6e 64 20 69 6e 64 65 65 64 20  ate. And indeed 
30240 53 51 4c 69 74 65 20 6e 65 76 65 72 20 64 6f 65  SQLite never doe
30250 73 20 74 68 69 73 2e 20 42 75 74 20 69 74 20 69  s this. But it i
30260 73 0a 20 20 2a 2a 20 6e 69 63 65 20 74 6f 20 68  s.  ** nice to h
30270 61 76 65 20 74 68 69 73 20 64 65 66 65 6e 73 69  ave this defensi
30280 76 65 20 74 65 73 74 20 68 65 72 65 20 61 6e 79  ve test here any
30290 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  way..  */.  if( 
302a0 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 73 74  NEVER(pPager->st
302b0 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56  ate<PAGER_RESERV
302c0 45 44 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ED) ) return SQL
302d0 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a  ITE_ERROR;..  /*
302e0 20 41 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   An optimization
302f0 2e 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  . If the databas
30300 65 20 77 61 73 20 6e 6f 74 20 61 63 74 75 61 6c  e was not actual
30310 6c 79 20 6d 6f 64 69 66 69 65 64 20 64 75 72 69  ly modified duri
30320 6e 67 0a 20 20 2a 2a 20 74 68 69 73 20 74 72 61  ng.  ** this tra
30330 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 70 61  nsaction, the pa
30340 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
30350 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  n exclusive-mode
30360 20 61 6e 64 20 69 73 0a 20 20 2a 2a 20 75 73 69   and is.  ** usi
30370 6e 67 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f  ng persistent jo
30380 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20 74 68 69  urnals, then thi
30390 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
303a0 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  no-op..  **.  **
303b0 20 54 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   The start of th
303c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
303d0 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e  urrently contain
303e0 73 20 61 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e  s a single journ
303f0 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64 65 72 20  al .  ** header 
30400 77 69 74 68 20 74 68 65 20 6e 52 65 63 20 66 69  with the nRec fi
30410 65 6c 64 20 73 65 74 20 74 6f 20 30 2e 20 49 66  eld set to 0. If
30420 20 73 75 63 68 20 61 20 6a 6f 75 72 6e 61 6c 20   such a journal 
30430 69 73 20 75 73 65 64 20 61 73 0a 20 20 2a 2a 20  is used as.  ** 
30440 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 64 75  a hot-journal du
30450 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ring hot-journal
30460 20 72 6f 6c 6c 62 61 63 6b 2c 20 30 20 63 68 61   rollback, 0 cha
30470 6e 67 65 73 20 77 69 6c 6c 20 62 65 20 6d 61 64  nges will be mad
30480 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61  e.  ** to the da
30490 74 61 62 61 73 65 20 66 69 6c 65 2e 20 53 6f 20  tabase file. So 
304a0 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
304b0 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6a 6f 75   to zero the jou
304c0 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64 65  rnal .  ** heade
304d0 72 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67  r. Since the pag
304e0 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69  er is in exclusi
304f0 76 65 20 6d 6f 64 65 2c 20 74 68 65 72 65 20 69  ve mode, there i
30500 73 20 6e 6f 20 6e 65 65 64 0a 20 20 2a 2a 20 74  s no need.  ** t
30510 6f 20 64 72 6f 70 20 61 6e 79 20 6c 6f 63 6b 73  o drop any locks
30520 20 65 69 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20   either..  */.  
30530 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f  if( pPager->dbMo
30540 64 69 66 69 65 64 3d 3d 30 20 26 26 20 70 50 61  dified==0 && pPa
30550 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
30560 64 65 20 0a 20 20 20 26 26 20 70 50 61 67 65 72  de .   && pPager
30570 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
30580 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
30590 5f 50 45 52 53 49 53 54 0a 20 20 29 7b 0a 20 20  _PERSIST.  ){.  
305a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
305b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
305c0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
305d0 67 65 72 29 20 29 3b 0a 20 20 20 20 72 65 74 75  ger) );.    retu
305e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
305f0 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  }..  PAGERTRACE(
30600 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20  ("COMMIT %d\n", 
30610 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
30620 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
30630 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
30640 52 5f 53 59 4e 43 45 44 20 7c 7c 20 4d 45 4d 44  R_SYNCED || MEMD
30650 42 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64 62  B || !pPager->db
30660 4d 6f 64 69 66 69 65 64 20 29 3b 0a 20 20 72 63  Modified );.  rc
30670 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
30680 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
30690 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
306a0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 61  er);.  return pa
306b0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
306c0 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , rc);.}../*.** 
306d0 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61  Rollback all cha
306e0 6e 67 65 73 2e 20 54 68 65 20 64 61 74 61 62 61  nges. The databa
306f0 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f  se falls back to
30700 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f   PAGER_SHARED mo
30710 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  de..**.** This f
30720 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73  unction performs
30730 20 74 77 6f 20 74 61 73 6b 73 3a 0a 2a 2a 0a 2a   two tasks:.**.*
30740 2a 20 20 20 31 29 20 49 74 20 72 6f 6c 6c 73 20  *   1) It rolls 
30750 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  back the journal
30760 20 66 69 6c 65 2c 20 72 65 73 74 6f 72 69 6e 67   file, restoring
30770 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69   all database fi
30780 6c 65 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20  le and .**      
30790 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
307a0 70 61 67 65 73 20 74 6f 20 74 68 65 20 73 74 61  pages to the sta
307b0 74 65 20 74 68 65 79 20 77 65 72 65 20 69 6e 20  te they were in 
307c0 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
307d0 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 77 61 73  tion.**      was
307e0 20 6f 70 65 6e 65 64 2c 20 61 6e 64 0a 2a 2a 20   opened, and.** 
307f0 20 20 32 29 20 49 74 20 66 69 6e 61 6c 69 7a 65    2) It finalize
30800 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
30810 6c 65 2c 20 73 6f 20 74 68 61 74 20 69 74 20 69  le, so that it i
30820 73 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 20 68  s not used for h
30830 6f 74 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62  ot.**      rollb
30840 61 63 6b 20 61 74 20 61 6e 79 20 70 6f 69 6e 74  ack at any point
30850 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 0a   in the future..
30860 2a 2a 0a 2a 2a 20 73 75 62 6a 65 63 74 20 74 6f  **.** subject to
30870 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71   the following q
30880 75 61 6c 69 66 69 63 61 74 69 6f 6e 73 3a 0a 2a  ualifications:.*
30890 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20 6a 6f  *.** * If the jo
308a0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
308b0 74 20 79 65 74 20 6f 70 65 6e 20 77 68 65 6e 20  t yet open when 
308c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
308d0 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 74 68   called,.**   th
308e0 65 6e 20 6f 6e 6c 79 20 28 32 29 20 69 73 20 70  en only (2) is p
308f0 65 72 66 6f 72 6d 65 64 2e 20 49 6e 20 74 68 69  erformed. In thi
30900 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20  s case there is 
30910 6e 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  no journal file.
30920 2a 2a 20 20 20 74 6f 20 72 6f 6c 6c 20 62 61 63  **   to roll bac
30930 6b 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 69 6e  k..**.** * If in
30940 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   an error state 
30950 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
30960 45 5f 46 55 4c 4c 2c 20 74 68 65 6e 20 74 61 73  E_FULL, then tas
30970 6b 20 28 31 29 20 69 73 20 0a 2a 2a 20 20 20 70  k (1) is .**   p
30980 65 72 66 6f 72 6d 65 64 2e 20 49 66 20 73 75 63  erformed. If suc
30990 63 65 73 73 66 75 6c 2c 20 74 61 73 6b 20 28 32  cessful, task (2
309a0 29 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ). Regardless of
309b0 20 74 68 65 20 6f 75 74 63 6f 6d 65 0a 2a 2a 20   the outcome.** 
309c0 20 20 6f 66 20 65 69 74 68 65 72 2c 20 74 68 65    of either, the
309d0 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72   error state err
309e0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
309f0 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
30a00 72 0a 2a 2a 20 20 20 28 69 2e 65 2e 20 65 69 74  r.**   (i.e. eit
30a10 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  her SQLITE_IOERR
30a20 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   or SQLITE_CORRU
30a30 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20  PT)..**.** * If 
30a40 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
30a50 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73  PAGER_RESERVED s
30a60 74 61 74 65 2c 20 74 68 65 6e 20 61 74 74 65 6d  tate, then attem
30a70 70 74 20 28 31 29 2e 20 57 68 65 74 68 65 72 0a  pt (1). Whether.
30a80 2a 2a 20 20 20 6f 72 20 6e 6f 74 20 28 31 29 20  **   or not (1) 
30a90 69 73 20 73 75 63 63 75 73 73 66 75 6c 2c 20 61  is succussful, a
30aa0 6c 73 6f 20 61 74 74 65 6d 70 74 20 28 32 29 2e  lso attempt (2).
30ab0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
30ac0 72 65 74 75 72 6e 0a 2a 2a 20 20 20 53 51 4c 49  return.**   SQLI
30ad0 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65  TE_OK. Otherwise
30ae0 2c 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f  , enter the erro
30af0 72 20 73 74 61 74 65 20 61 6e 64 20 72 65 74 75  r state and retu
30b00 72 6e 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a  rn the first .**
30b10 20 20 20 65 72 72 6f 72 20 63 6f 64 65 20 65 6e     error code en
30b20 63 6f 75 6e 74 65 72 65 64 2e 20 0a 2a 2a 0a 2a  countered. .**.*
30b30 2a 20 20 20 49 6e 20 74 68 69 73 20 63 61 73 65  *   In this case
30b40 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61   there is no cha
30b50 6e 63 65 20 74 68 61 74 20 74 68 65 20 64 61 74  nce that the dat
30b60 61 62 61 73 65 20 77 61 73 20 77 72 69 74 74 65  abase was writte
30b70 6e 20 74 6f 2e 20 0a 2a 2a 20 20 20 53 6f 20 69  n to. .**   So i
30b80 73 20 73 61 66 65 20 74 6f 20 66 69 6e 61 6c 69  s safe to finali
30b90 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
30ba0 69 6c 65 20 65 76 65 6e 20 69 66 20 74 68 65 20  ile even if the 
30bb0 70 6c 61 79 62 61 63 6b 20 0a 2a 2a 20 20 20 28  playback .**   (
30bc0 6f 70 65 72 61 74 69 6f 6e 20 31 29 20 66 61 69  operation 1) fai
30bd0 6c 65 64 2e 20 48 6f 77 65 76 65 72 20 74 68 65  led. However the
30be0 20 70 61 67 65 72 20 6d 75 73 74 20 65 6e 74 65   pager must ente
30bf0 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
30c00 65 0a 2a 2a 20 20 20 61 73 20 74 68 65 20 63 6f  e.**   as the co
30c10 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e  ntents of the in
30c20 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 61 72  -memory cache ar
30c30 65 20 6e 6f 77 20 73 75 73 70 65 63 74 2e 0a 2a  e now suspect..*
30c40 2a 0a 2a 2a 20 2a 20 46 69 6e 61 6c 6c 79 2c 20  *.** * Finally, 
30c50 69 66 20 69 6e 20 50 41 47 45 52 5f 45 58 43 4c  if in PAGER_EXCL
30c60 55 53 49 56 45 20 73 74 61 74 65 2c 20 74 68 65  USIVE state, the
30c70 6e 20 61 74 74 65 6d 70 74 20 28 31 29 2e 20 4f  n attempt (1). O
30c80 6e 6c 79 0a 2a 2a 20 20 20 61 74 74 65 6d 70 74  nly.**   attempt
30c90 20 28 32 29 20 69 66 20 28 31 29 20 69 73 20 73   (2) if (1) is s
30ca0 75 63 63 65 73 73 66 75 6c 2e 20 52 65 74 75 72  uccessful. Retur
30cb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
30cc0 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 20 20  uccessful,.**   
30cd0 6f 74 68 65 72 77 69 73 65 20 65 6e 74 65 72 20  otherwise enter 
30ce0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
30cf0 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
30d00 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 74  rror code from t
30d10 68 65 20 0a 2a 2a 20 20 20 66 61 69 6c 69 6e 67  he .**   failing
30d20 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a   operation..**.*
30d30 2a 20 20 20 49 6e 20 74 68 69 73 20 63 61 73 65  *   In this case
30d40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30d50 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  le may have been
30d60 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 53 6f 20   written to. So 
30d70 69 66 20 74 68 65 0a 2a 2a 20 20 20 70 6c 61 79  if the.**   play
30d80 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 64  back operation d
30d90 69 64 20 6e 6f 74 20 73 75 63 63 65 65 64 20 69  id not succeed i
30da0 74 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73  t would not be s
30db0 61 66 65 20 74 6f 20 66 69 6e 61 6c 69 7a 65 0a  afe to finalize.
30dc0 2a 2a 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c  **   the journal
30dd0 20 66 69 6c 65 2e 20 49 74 20 6e 65 65 64 73 20   file. It needs 
30de0 74 6f 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68  to be left in th
30df0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 6f  e file-system so
30e00 20 74 68 61 74 0a 2a 2a 20 20 20 73 6f 6d 65 20   that.**   some 
30e10 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 61  other process ca
30e20 6e 20 75 73 65 20 69 74 20 74 6f 20 72 65 73 74  n use it to rest
30e30 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
30e40 20 73 74 61 74 65 20 28 62 79 0a 2a 2a 20 20 20   state (by.**   
30e50 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
30e60 62 61 63 6b 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  back)..*/.int sq
30e70 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
30e80 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
30e90 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
30ea0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
30eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
30ec0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50 41  urn code */.  PA
30ed0 47 45 52 54 52 41 43 45 28 28 22 52 4f 4c 4c 42  GERTRACE(("ROLLB
30ee0 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ACK %d\n", PAGER
30ef0 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
30f00 69 66 28 20 70 61 67 65 72 55 73 65 4c 6f 67 28  if( pagerUseLog(
30f10 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69  pPager) ){.    i
30f20 6e 74 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d  nt rc2;.    rc =
30f30 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76   sqlite3PagerSav
30f40 65 70 6f 69 6e 74 28 70 50 61 67 65 72 2c 20 53  epoint(pPager, S
30f50 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
30f60 4b 2c 20 2d 31 29 3b 0a 20 20 20 20 72 63 32 20  K, -1);.    rc2 
30f70 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
30f80 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
30f90 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
30fa0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
30fb0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
30fc0 20 72 63 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66   rc2;.  }else if
30fd0 28 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  ( !pPager->dbMod
30fe0 69 66 69 65 64 20 7c 7c 20 21 69 73 4f 70 65 6e  ified || !isOpen
30ff0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
31000 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
31010 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
31020 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
31030 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 7d 65  setMaster);.  }e
31040 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
31050 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65  errCode && pPage
31060 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
31070 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69  TE_FULL ){.    i
31080 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
31090 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
310a0 45 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  E ){.      pager
310b0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
310c0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
310d0 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
310e0 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Code;.  }else{. 
310f0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
31100 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
31110 52 56 45 44 20 29 7b 0a 20 20 20 20 20 20 69 6e  RVED ){.      in
31120 74 20 72 63 32 3b 0a 20 20 20 20 20 20 72 63 20  t rc2;.      rc 
31130 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
31140 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
31150 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 65     rc2 = pager_e
31160 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
31170 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
31180 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  etMaster);.     
31190 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
311a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
311b0 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a   = rc2;.      }.
311c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
311d0 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
311e0 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
311f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
31200 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
31210 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
31220 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  lid = 0;.    }..
31230 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72      /* If an err
31240 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
31250 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20   a ROLLBACK, we 
31260 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72  can no longer tr
31270 75 73 74 20 74 68 65 20 70 61 67 65 72 0a 20 20  ust the pager.  
31280 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63    ** cache. So c
31290 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28  all pager_error(
312a0 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74  ) on the way out
312b0 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72   to make any err
312c0 6f 72 20 0a 20 20 20 20 2a 2a 20 70 65 72 73 69  or .    ** persi
312d0 73 74 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  stent..    */.  
312e0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
312f0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
31300 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
31310 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
31320 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74   TRUE if the dat
31330 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70  abase file is op
31340 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20  ened read-only. 
31350 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
31360 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
31370 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20   is (in theory) 
31380 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20  writable..*/.u8 
31390 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
313a0 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50  adonly(Pager *pP
313b0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
313c0 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
313d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
313e0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
313f0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
31400 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20  e pager..*/.int 
31410 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
31420 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
31430 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  er){.  return sq
31440 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
31450 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
31460 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  che);.}../*.** R
31470 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 78  eturn the approx
31480 69 6d 61 74 65 20 6e 75 6d 62 65 72 20 6f 66 20  imate number of 
31490 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
314a0 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 73 65  currently.** use
314b0 64 20 62 79 20 74 68 65 20 70 61 67 65 72 20 61  d by the pager a
314c0 6e 64 20 69 74 73 20 61 73 73 6f 63 69 61 74 65  nd its associate
314d0 64 20 63 61 63 68 65 2e 0a 2a 2f 0a 69 6e 74 20  d cache..*/.int 
314e0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 65 6d 55  sqlite3PagerMemU
314f0 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  sed(Pager *pPage
31500 72 29 7b 0a 20 20 69 6e 74 20 70 65 72 50 61 67  r){.  int perPag
31510 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
31520 70 61 67 65 53 69 7a 65 20 2b 20 70 50 61 67 65  pageSize + pPage
31530 72 2d 3e 6e 45 78 74 72 61 20 2b 20 32 30 3b 0a  r->nExtra + 20;.
31540 20 20 72 65 74 75 72 6e 20 70 65 72 50 61 67 65    return perPage
31550 53 69 7a 65 2a 73 71 6c 69 74 65 33 50 63 61 63  Size*sqlite3Pcac
31560 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
31570 65 72 2d 3e 70 50 43 61 63 68 65 29 0a 20 20 20  er->pPCache).   
31580 20 20 20 20 20 20 20 20 2b 20 73 71 6c 69 74 65          + sqlite
31590 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 50 61 67  3MallocSize(pPag
315a0 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  er);.}../*.** Re
315b0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
315c0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
315d0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
315e0 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  age..*/.int sqli
315f0 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
31600 6f 75 6e 74 28 44 62 50 61 67 65 20 2a 70 50 61  ount(DbPage *pPa
31610 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  ge){.  return sq
31620 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52  lite3PcachePageR
31630 65 66 63 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a  efcount(pPage);.
31640 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
31650 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73  _TEST./*.** This
31660 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
31670 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
31680 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a   analysis only..
31690 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50  */.int *sqlite3P
316a0 61 67 65 72 53 74 61 74 73 28 50 61 67 65 72 20  agerStats(Pager 
316b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74  *pPager){.  stat
316c0 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20  ic int a[11];.  
316d0 61 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 50 63  a[0] = sqlite3Pc
316e0 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
316f0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
31700 20 61 5b 31 5d 20 3d 20 73 71 6c 69 74 65 33 50   a[1] = sqlite3P
31710 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70  cachePagecount(p
31720 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
31730 0a 20 20 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65  .  a[2] = sqlite
31740 33 50 63 61 63 68 65 47 65 74 43 61 63 68 65 73  3PcacheGetCaches
31750 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
31760 63 68 65 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70  che);.  a[3] = p
31770 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
31780 69 64 20 3f 20 28 69 6e 74 29 20 70 50 61 67 65  id ? (int) pPage
31790 72 2d 3e 64 62 53 69 7a 65 20 3a 20 2d 31 3b 0a  r->dbSize : -1;.
317a0 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d    a[4] = pPager-
317b0 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d  >state;.  a[5] =
317c0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
317d0 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65  ;.  a[6] = pPage
317e0 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20  r->nHit;.  a[7] 
317f0 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b  = pPager->nMiss;
31800 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a  .  a[8] = 0;  /*
31810 20 55 73 65 64 20 74 6f 20 62 65 20 70 50 61 67   Used to be pPag
31820 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61  er->nOvfl */.  a
31830 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  [9] = pPager->nR
31840 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70  ead;.  a[10] = p
31850 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20  Pager->nWrite;. 
31860 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e   return a;.}.#en
31870 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
31880 6e 20 74 72 75 65 20 69 66 20 74 68 69 73 20 69  n true if this i
31890 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  s an in-memory p
318a0 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ager..*/.int sql
318b0 69 74 65 33 50 61 67 65 72 49 73 4d 65 6d 64 62  ite3PagerIsMemdb
318c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
318d0 0a 20 20 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b  .  return MEMDB;
318e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
318f0 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 61  that there are a
31900 74 20 6c 65 61 73 74 20 6e 53 61 76 65 70 6f 69  t least nSavepoi
31910 6e 74 20 73 61 76 65 70 6f 69 6e 74 73 20 6f 70  nt savepoints op
31920 65 6e 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  en. If there are
31930 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 6c 65  .** currently le
31940 73 73 20 74 68 61 6e 20 6e 53 61 76 65 70 6f 69  ss than nSavepoi
31950 6e 74 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 6f  nts open, then o
31960 70 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  pen one or more 
31970 73 61 76 65 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f  savepoints.** to
31980 20 6d 61 6b 65 20 75 70 20 74 68 65 20 64 69 66   make up the dif
31990 66 65 72 65 6e 63 65 2e 20 49 66 20 74 68 65 20  ference. If the 
319a0 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f  number of savepo
319b0 69 6e 74 73 20 69 73 20 61 6c 72 65 61 64 79 0a  ints is already.
319c0 2a 2a 20 65 71 75 61 6c 20 74 6f 20 6e 53 61 76  ** equal to nSav
319d0 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69  epoint, then thi
319e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
319f0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
31a00 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
31a10 69 6f 6e 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  ion fails, SQLIT
31a20 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
31a30 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ned. If an error
31a40 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c   .** occurs whil
31a50 65 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 73 75  e opening the su
31a60 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  b-journal file, 
31a70 74 68 65 6e 20 61 6e 20 49 4f 20 65 72 72 6f 72  then an IO error
31a80 20 63 6f 64 65 20 69 73 0a 2a 2a 20 72 65 74 75   code is.** retu
31a90 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
31aa0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
31ab0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
31ac0 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 50 61 67  penSavepoint(Pag
31ad0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
31ae0 6e 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  nSavepoint){.  i
31af0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
31b00 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
31b10 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
31b20 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
31b30 20 6e 43 75 72 72 65 6e 74 20 3d 20 70 50 61 67   nCurrent = pPag
31b40 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
31b50 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
31b60 74 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65  t number of save
31b70 70 6f 69 6e 74 73 20 2a 2f 0a 0a 20 20 69 66 28  points */..  if(
31b80 20 6e 53 61 76 65 70 6f 69 6e 74 3e 6e 43 75 72   nSavepoint>nCur
31b90 72 65 6e 74 20 26 26 20 70 50 61 67 65 72 2d 3e  rent && pPager->
31ba0 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  useJournal ){.  
31bb0 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
31bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
31be0 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
31bf0 2f 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  /.    PagerSavep
31c00 6f 69 6e 74 20 2a 61 4e 65 77 3b 20 20 20 20 20  oint *aNew;     
31c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31c20 20 4e 65 77 20 50 61 67 65 72 2e 61 53 61 76 65   New Pager.aSave
31c30 70 6f 69 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20  point array */. 
31c40 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20     int nPage;   
31c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
31c70 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 66  ze of database f
31c80 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d  ile */..    rc =
31c90 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
31ca0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
31cb0 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
31cc0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
31cd0 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65  .    /* Grow the
31ce0 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
31cf0 74 20 61 72 72 61 79 20 75 73 69 6e 67 20 72 65  t array using re
31d00 61 6c 6c 6f 63 28 29 2e 20 52 65 74 75 72 6e 20  alloc(). Return 
31d10 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20  SQLITE_NOMEM.   
31d20 20 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f 63   ** if the alloc
31d30 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20 4f 74 68  ation fails. Oth
31d40 65 72 77 69 73 65 2c 20 7a 65 72 6f 20 74 68 65  erwise, zero the
31d50 20 6e 65 77 20 70 6f 72 74 69 6f 6e 20 69 6e 20   new portion in 
31d60 63 61 73 65 20 61 20 0a 20 20 20 20 2a 2a 20 6d  case a .    ** m
31d70 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
31d80 63 75 72 73 20 77 68 69 6c 65 20 70 6f 70 75 6c  curs while popul
31d90 61 74 69 6e 67 20 69 74 20 69 6e 20 74 68 65 20  ating it in the 
31da0 66 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20 62 65  for(...) loop be
31db0 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  low..    */.    
31dc0 61 4e 65 77 20 3d 20 28 50 61 67 65 72 53 61 76  aNew = (PagerSav
31dd0 65 70 6f 69 6e 74 20 2a 29 73 71 6c 69 74 65 33  epoint *)sqlite3
31de0 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  Realloc(.       
31df0 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
31e00 69 6e 74 2c 20 73 69 7a 65 6f 66 28 50 61 67 65  int, sizeof(Page
31e10 72 53 61 76 65 70 6f 69 6e 74 29 2a 6e 53 61 76  rSavepoint)*nSav
31e20 65 70 6f 69 6e 74 0a 20 20 20 20 29 3b 0a 20 20  epoint.    );.  
31e30 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a 20    if( !aNew ){. 
31e40 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
31e50 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
31e60 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77      memset(&aNew
31e70 5b 6e 43 75 72 72 65 6e 74 5d 2c 20 30 2c 20 28  [nCurrent], 0, (
31e80 6e 53 61 76 65 70 6f 69 6e 74 2d 6e 43 75 72 72  nSavepoint-nCurr
31e90 65 6e 74 29 20 2a 20 73 69 7a 65 6f 66 28 50 61  ent) * sizeof(Pa
31ea0 67 65 72 53 61 76 65 70 6f 69 6e 74 29 29 3b 0a  gerSavepoint));.
31eb0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76      pPager->aSav
31ec0 65 70 6f 69 6e 74 20 3d 20 61 4e 65 77 3b 0a 20  epoint = aNew;. 
31ed0 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65     pPager->nSave
31ee0 70 6f 69 6e 74 20 3d 20 6e 53 61 76 65 70 6f 69  point = nSavepoi
31ef0 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75  nt;..    /* Popu
31f00 6c 61 74 65 20 74 68 65 20 50 61 67 65 72 53 61  late the PagerSa
31f10 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72  vepoint structur
31f20 65 73 20 6a 75 73 74 20 61 6c 6c 6f 63 61 74 65  es just allocate
31f30 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69  d. */.    for(ii
31f40 3d 6e 43 75 72 72 65 6e 74 3b 20 69 69 3c 6e 53  =nCurrent; ii<nS
31f50 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
31f60 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e  .      aNew[ii].
31f70 6e 4f 72 69 67 20 3d 20 6e 50 61 67 65 3b 0a 20  nOrig = nPage;. 
31f80 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28       if( isOpen(
31f90 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
31fa0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
31fb0 66 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ff>0 ){.        
31fc0 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74  aNew[ii].iOffset
31fd0 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
31fe0 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c  alOff;.      }el
31ff0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77  se{.        aNew
32000 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 4a  [ii].iOffset = J
32010 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
32020 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
32030 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 53       aNew[ii].iS
32040 75 62 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e  ubRec = pPager->
32050 6e 53 75 62 52 65 63 3b 0a 20 20 20 20 20 20 61  nSubRec;.      a
32060 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  New[ii].pInSavep
32070 6f 69 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69  oint = sqlite3Bi
32080 74 76 65 63 43 72 65 61 74 65 28 6e 50 61 67 65  tvecCreate(nPage
32090 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 61 4e  );.      if( !aN
320a0 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f  ew[ii].pInSavepo
320b0 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  int ){.        r
320c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
320d0 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
320e0 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74  }..    /* Open t
320f0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20  he sub-journal, 
32100 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
32110 65 61 64 79 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a  eady opened. */.
32120 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62      rc = openSub
32130 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
32140 0a 20 20 20 20 61 73 73 65 72 74 54 72 75 6e 63  .    assertTrunc
32150 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  ateConstraint(pP
32160 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  ager);.  }..  re
32170 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
32180 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
32190 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c  is called to rol
321a0 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65  lback or release
321b0 20 28 63 6f 6d 6d 69 74 29 20 61 20 73 61 76 65   (commit) a save
321c0 70 6f 69 6e 74 2e 0a 2a 2a 20 54 68 65 20 73 61  point..** The sa
321d0 76 65 70 6f 69 6e 74 20 74 6f 20 72 65 6c 65 61  vepoint to relea
321e0 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e  se or rollback n
321f0 65 65 64 20 6e 6f 74 20 62 65 20 74 68 65 20 6d  eed not be the m
32200 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 0a 2a 2a  ost recently .**
32210 20 63 72 65 61 74 65 64 20 73 61 76 65 70 6f 69   created savepoi
32220 6e 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  nt..**.** Parame
32230 74 65 72 20 6f 70 20 69 73 20 61 6c 77 61 79 73  ter op is always
32240 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e   either SAVEPOIN
32250 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 20 53 41  T_ROLLBACK or SA
32260 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e  VEPOINT_RELEASE.
32270 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 53 41 56  .** If it is SAV
32280 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20  EPOINT_RELEASE, 
32290 74 68 65 6e 20 72 65 6c 65 61 73 65 20 61 6e 64  then release and
322a0 20 64 65 73 74 72 6f 79 20 74 68 65 20 73 61 76   destroy the sav
322b0 65 70 6f 69 6e 74 20 77 69 74 68 0a 2a 2a 20 69  epoint with.** i
322c0 6e 64 65 78 20 69 53 61 76 65 70 6f 69 6e 74 2e  ndex iSavepoint.
322d0 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f   If it is SAVEPO
322e0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
322f0 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20  en rollback all 
32300 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 61 74 20  changes.** that 
32310 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 73 69  have occurred si
32320 6e 63 65 20 74 68 65 20 73 70 65 63 69 66 69 65  nce the specifie
32330 64 20 73 61 76 65 70 6f 69 6e 74 20 77 61 73 20  d savepoint was 
32340 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  created..**.** T
32350 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74 6f 20  he savepoint to 
32360 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65  rollback or rele
32370 61 73 65 20 69 73 20 69 64 65 6e 74 69 66 69 65  ase is identifie
32380 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 0a  d by parameter .
32390 2a 2a 20 69 53 61 76 65 70 6f 69 6e 74 2e 20 41  ** iSavepoint. A
323a0 20 76 61 6c 75 65 20 6f 66 20 30 20 6d 65 61 6e   value of 0 mean
323b0 73 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  s to operate on 
323c0 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73 61  the outermost sa
323d0 76 65 70 6f 69 6e 74 0a 2a 2a 20 28 74 68 65 20  vepoint.** (the 
323e0 66 69 72 73 74 20 63 72 65 61 74 65 64 29 2e 20  first created). 
323f0 41 20 76 61 6c 75 65 20 6f 66 20 28 50 61 67 65  A value of (Page
32400 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29 20  r.nSavepoint-1) 
32410 6d 65 61 6e 73 20 6f 70 65 72 61 74 65 0a 2a 2a  means operate.**
32420 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
32430 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 73 61  ently created sa
32440 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 53 61 76  vepoint. If iSav
32450 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65  epoint is greate
32460 72 20 74 68 61 6e 0a 2a 2a 20 28 50 61 67 65 72  r than.** (Pager
32470 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29 2c 20  .nSavepoint-1), 
32480 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
32490 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
324a0 2a 0a 2a 2a 20 49 66 20 61 20 6e 65 67 61 74 69  *.** If a negati
324b0 76 65 20 76 61 6c 75 65 20 69 73 20 70 61 73 73  ve value is pass
324c0 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
324d0 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ion, then the cu
324e0 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  rrent.** transac
324f0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
32500 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66  ack. This is dif
32510 66 65 72 65 6e 74 20 74 6f 20 63 61 6c 6c 69 6e  ferent to callin
32520 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  g .** sqlite3Pag
32530 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65 63  erRollback() bec
32540 61 75 73 65 20 74 68 69 73 20 66 75 6e 63 74 69  ause this functi
32550 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 74 65 72 6d  on does not term
32560 69 6e 61 74 65 0a 2a 2a 20 74 68 65 20 74 72 61  inate.** the tra
32570 6e 73 61 63 74 69 6f 6e 20 6f 72 20 75 6e 6c 6f  nsaction or unlo
32580 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ck the database,
32590 20 69 74 20 6a 75 73 74 20 72 65 73 74 6f 72 65   it just restore
325a0 73 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e  s the .** conten
325b0 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ts of the databa
325c0 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
325d0 61 6c 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a  al state. .**.**
325e0 20 49 6e 20 61 6e 79 20 63 61 73 65 2c 20 61 6c   In any case, al
325f0 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69 74  l savepoints wit
32600 68 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74  h an index great
32610 65 72 20 74 68 61 6e 20 69 53 61 76 65 70 6f 69  er than iSavepoi
32620 6e 74 20 0a 2a 2a 20 61 72 65 20 64 65 73 74 72  nt .** are destr
32630 6f 79 65 64 2e 20 49 66 20 74 68 69 73 20 69 73  oyed. If this is
32640 20 61 20 72 65 6c 65 61 73 65 20 6f 70 65 72 61   a release opera
32650 74 69 6f 6e 20 28 6f 70 3d 3d 53 41 56 45 50 4f  tion (op==SAVEPO
32660 49 4e 54 5f 52 45 4c 45 41 53 45 29 2c 0a 2a 2a  INT_RELEASE),.**
32670 20 74 68 65 6e 20 73 61 76 65 70 6f 69 6e 74 20   then savepoint 
32680 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 61 6c  iSavepoint is al
32690 73 6f 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a  so destroyed..**
326a0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
326b0 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  n may return SQL
326c0 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
326d0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
326e0 20 66 61 69 6c 73 2c 0a 2a 2a 20 6f 72 20 61 6e   fails,.** or an
326f0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
32700 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
32710 63 75 72 73 20 77 68 69 6c 65 20 72 6f 6c 6c 69  curs while rolli
32720 6e 67 20 62 61 63 6b 20 61 20 0a 2a 2a 20 73 61  ng back a .** sa
32730 76 65 70 6f 69 6e 74 2e 20 49 66 20 6e 6f 20 65  vepoint. If no e
32740 72 72 6f 72 73 20 6f 63 63 75 72 2c 20 53 51 4c  rrors occur, SQL
32750 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
32760 65 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69  ed..*/ .int sqli
32770 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e  te3PagerSavepoin
32780 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
32790 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61   int op, int iSa
327a0 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20  vepoint){.  int 
327b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
327c0 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53  .  assert( op==S
327d0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
327e0 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   || op==SAVEPOIN
327f0 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20  T_ROLLBACK );.  
32800 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69  assert( iSavepoi
32810 6e 74 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 53 41 56  nt>=0 || op==SAV
32820 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
32830 29 3b 0a 0a 20 20 69 66 28 20 69 53 61 76 65 70  );..  if( iSavep
32840 6f 69 6e 74 3c 70 50 61 67 65 72 2d 3e 6e 53 61  oint<pPager->nSa
32850 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 69  vepoint ){.    i
32860 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
32870 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
32880 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  riable */.    in
32890 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20  t nNew;         
328a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
328b0 6d 61 69 6e 69 6e 67 20 73 61 76 65 70 6f 69 6e  maining savepoin
328c0 74 73 20 61 66 74 65 72 20 74 68 69 73 20 6f 70  ts after this op
328d0 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 67  . */..    /* Fig
328e0 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
328f0 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69 6c 6c   savepoints will
32900 20 73 74 69 6c 6c 20 62 65 20 61 63 74 69 76 65   still be active
32910 20 61 66 74 65 72 20 74 68 69 73 0a 20 20 20 20   after this.    
32920 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53 74  ** operation. St
32930 6f 72 65 20 74 68 69 73 20 76 61 6c 75 65 20 69  ore this value i
32940 6e 20 6e 4e 65 77 2e 20 54 68 65 6e 20 66 72 65  n nNew. Then fre
32950 65 20 72 65 73 6f 75 72 63 65 73 20 61 73 73 6f  e resources asso
32960 63 69 61 74 65 64 20 0a 20 20 20 20 2a 2a 20 77  ciated .    ** w
32970 69 74 68 20 61 6e 79 20 73 61 76 65 70 6f 69 6e  ith any savepoin
32980 74 73 20 74 68 61 74 20 61 72 65 20 64 65 73 74  ts that are dest
32990 72 6f 79 65 64 20 62 79 20 74 68 69 73 20 6f 70  royed by this op
329a0 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  eration..    */.
329b0 20 20 20 20 6e 4e 65 77 20 3d 20 69 53 61 76 65      nNew = iSave
329c0 70 6f 69 6e 74 20 2b 20 28 28 20 6f 70 3d 3d 53  point + (( op==S
329d0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
329e0 20 29 20 3f 20 30 20 3a 20 31 29 3b 0a 20 20 20   ) ? 0 : 1);.   
329f0 20 66 6f 72 28 69 69 3d 6e 4e 65 77 3b 20 69 69   for(ii=nNew; ii
32a00 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
32a10 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
32a20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
32a30 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61  estroy(pPager->a
32a40 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49  Savepoint[ii].pI
32a50 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  nSavepoint);.   
32a60 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e   }.    pPager->n
32a70 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e 4e 65 77  Savepoint = nNew
32a80 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
32a90 73 20 69 73 20 61 20 72 65 6c 65 61 73 65 20 6f  s is a release o
32aa0 66 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20  f the outermost 
32ab0 73 61 76 65 70 6f 69 6e 74 2c 20 74 72 75 6e 63  savepoint, trunc
32ac0 61 74 65 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  ate .    ** the 
32ad0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 7a  sub-journal to z
32ae0 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ero bytes in siz
32af0 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 70  e. */.    if( op
32b00 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
32b10 41 53 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ASE ){.      if(
32b20 20 6e 4e 65 77 3d 3d 30 20 26 26 20 69 73 4f 70   nNew==0 && isOp
32b30 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
32b40 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   ){.        /* O
32b50 6e 6c 79 20 74 72 75 6e 63 61 74 65 20 69 66 20  nly truncate if 
32b60 69 74 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  it is an in-memo
32b70 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  ry sub-journal. 
32b80 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  */.        if( s
32b90 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e  qlite3IsMemJourn
32ba0 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  al(pPager->sjfd)
32bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
32bc0 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
32bd0 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  cate(pPager->sjf
32be0 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  d, 0);.         
32bf0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
32c00 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
32c10 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
32c20 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b  er->nSubRec = 0;
32c30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
32c40 20 20 20 2f 2a 20 45 6c 73 65 20 74 68 69 73 20     /* Else this 
32c50 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70  is a rollback op
32c60 65 72 61 74 69 6f 6e 2c 20 70 6c 61 79 62 61 63  eration, playbac
32c70 6b 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  k the specified 
32c80 73 61 76 65 70 6f 69 6e 74 2e 0a 20 20 20 20 2a  savepoint..    *
32c90 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 74  * If this is a t
32ca0 65 6d 70 2d 66 69 6c 65 2c 20 69 74 20 69 73 20  emp-file, it is 
32cb0 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 74 68  possible that th
32cc0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
32cd0 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 79 65  as.    ** not ye
32ce0 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 20 49  t been opened. I
32cf0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
32d00 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20 63  e have been no c
32d10 68 61 6e 67 65 73 20 74 6f 0a 20 20 20 20 2a 2a  hanges to.    **
32d20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
32d30 6c 65 2c 20 73 6f 20 74 68 65 20 70 6c 61 79 62  le, so the playb
32d40 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 63 61  ack operation ca
32d50 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20  n be skipped..  
32d60 20 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66    */.    else if
32d70 28 20 70 61 67 65 72 55 73 65 4c 6f 67 28 70 50  ( pagerUseLog(pP
32d80 61 67 65 72 29 20 7c 7c 20 69 73 4f 70 65 6e 28  ager) || isOpen(
32d90 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
32da0 20 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70        PagerSavep
32db0 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74  oint *pSavepoint
32dc0 20 3d 20 28 6e 4e 65 77 3d 3d 30 29 3f 30 3a 26   = (nNew==0)?0:&
32dd0 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
32de0 6e 74 5b 6e 4e 65 77 2d 31 5d 3b 0a 20 20 20 20  nt[nNew-1];.    
32df0 20 20 72 63 20 3d 20 70 61 67 65 72 50 6c 61 79    rc = pagerPlay
32e00 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 70 50  backSavepoint(pP
32e10 61 67 65 72 2c 20 70 53 61 76 65 70 6f 69 6e 74  ager, pSavepoint
32e20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
32e30 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 29  rc!=SQLITE_DONE)
32e40 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 7d 0a 20  ;.    }.  .  }. 
32e50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
32e60 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
32e70 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
32e80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
32e90 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
32ea0 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46  r *sqlite3PagerF
32eb0 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  ilename(Pager *p
32ec0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
32ed0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
32ee0 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  me;.}../*.** Ret
32ef0 75 72 6e 20 74 68 65 20 56 46 53 20 73 74 72 75  urn the VFS stru
32f00 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 70 61  cture for the pa
32f10 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71  ger..*/.const sq
32f20 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c 69 74  lite3_vfs *sqlit
32f30 65 33 50 61 67 65 72 56 66 73 28 50 61 67 65 72  e3PagerVfs(Pager
32f40 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
32f50 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 56 66 73  urn pPager->pVfs
32f60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
32f70 6e 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c  n the file handl
32f80 65 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  e for the databa
32f90 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  se file associat
32fa0 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 70  ed.** with the p
32fb0 61 67 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68  ager.  This migh
32fc0 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  t return NULL if
32fd0 20 74 68 65 20 66 69 6c 65 20 68 61 73 0a 2a 2a   the file has.**
32fe0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70   not yet been op
32ff0 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  ened..*/.sqlite3
33000 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65 33 50 61  _file *sqlite3Pa
33010 67 65 72 46 69 6c 65 28 50 61 67 65 72 20 2a 70  gerFile(Pager *p
33020 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
33030 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a   pPager->fd;.}..
33040 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
33050 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
33060 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
33070 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
33080 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a  r *sqlite3PagerJ
33090 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72  ournalname(Pager
330a0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
330b0 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  urn pPager->zJou
330c0 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rnal;.}../*.** R
330d0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 66 73  eturn true if fs
330e0 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20  ync() calls are 
330f0 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69  disabled for thi
33100 73 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e  s pager.  Return
33110 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79   FALSE.** if fsy
33120 6e 63 28 29 73 20 61 72 65 20 65 78 65 63 75 74  nc()s are execut
33130 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a  ed normally..*/.
33140 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
33150 4e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50  Nosync(Pager *pP
33160 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
33170 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
33180 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
33190 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a  _HAS_CODEC./*.**
331a0 20 53 65 74 20 6f 72 20 72 65 74 72 69 65 76 65   Set or retrieve
331b0 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74   the codec for t
331c0 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 73 74 61  his pager.*/.sta
331d0 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
331e0 50 61 67 65 72 53 65 74 43 6f 64 65 63 28 0a 20  PagerSetCodec(. 
331f0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a   Pager *pPager,.
33200 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63    void *(*xCodec
33210 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
33220 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20  no,int),.  void 
33230 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  (*xCodecSizeChng
33240 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29  )(void*,int,int)
33250 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  ,.  void (*xCode
33260 63 46 72 65 65 29 28 76 6f 69 64 2a 29 2c 0a 20  cFree)(void*),. 
33270 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 0a 29 7b   void *pCodec.){
33280 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
33290 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67  CodecFree ) pPag
332a0 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70  er->xCodecFree(p
332b0 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a  Pager->pCodec);.
332c0 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
332d0 20 3d 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62   = pPager->memDb
332e0 20 3f 20 30 20 3a 20 78 43 6f 64 65 63 3b 0a 20   ? 0 : xCodec;. 
332f0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53   pPager->xCodecS
33300 69 7a 65 43 68 6e 67 20 3d 20 78 43 6f 64 65 63  izeChng = xCodec
33310 53 69 7a 65 43 68 6e 67 3b 0a 20 20 70 50 61 67  SizeChng;.  pPag
33320 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 3d  er->xCodecFree =
33330 20 78 43 6f 64 65 63 46 72 65 65 3b 0a 20 20 70   xCodecFree;.  p
33340 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 20 3d 20  Pager->pCodec = 
33350 70 43 6f 64 65 63 3b 0a 20 20 70 61 67 65 72 52  pCodec;.  pagerR
33360 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72  eportSize(pPager
33370 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
33380 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65   *sqlite3PagerGe
33390 74 43 6f 64 65 63 28 50 61 67 65 72 20 2a 70 50  tCodec(Pager *pP
333a0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
333b0 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 3b 0a  pPager->pCodec;.
333c0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
333d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
333e0 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d  TOVACUUM./*.** M
333f0 6f 76 65 20 74 68 65 20 70 61 67 65 20 70 50 67  ove the page pPg
33400 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e   to location pgn
33410 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a  o in the file..*
33420 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  *.** There must 
33430 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73  be no references
33440 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 72 65   to the page pre
33450 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20  viously located 
33460 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69 63  at.** pgno (whic
33470 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c 64  h we call pPgOld
33480 29 20 74 68 6f 75 67 68 20 74 68 61 74 20 70 61  ) though that pa
33490 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f  ge is allowed to
334a0 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2e   be.** in cache.
334b0 20 20 49 66 20 74 68 65 20 70 61 67 65 20 70 72    If the page pr
334c0 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64  eviously located
334d0 20 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20   at pgno is not 
334e0 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68  already.** in th
334f0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
33500 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 75  al, it is not pu
33510 74 20 74 68 65 72 65 20 62 79 20 62 79 20 74 68  t there by by th
33520 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
33530 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * References to 
33540 74 68 65 20 70 61 67 65 20 70 50 67 20 72 65 6d  the page pPg rem
33550 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74  ain valid. Updat
33560 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d  ing any.** meta-
33570 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
33580 77 69 74 68 20 70 50 67 20 28 69 2e 65 2e 20 64  with pPg (i.e. d
33590 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ata stored in th
335a0 65 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a  e nExtra bytes.*
335b0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  * allocated alon
335c0 67 20 77 69 74 68 20 74 68 65 20 70 61 67 65 29  g with the page)
335d0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
335e0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
335f0 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72  ller..**.** A tr
33600 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
33610 65 20 61 63 74 69 76 65 20 77 68 65 6e 20 74 68  e active when th
33620 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
33630 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f  lled. It used to
33640 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20   be.** required 
33650 74 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74  that a statement
33660 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
33670 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74   not active, but
33680 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f   this restrictio
33690 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65  n.** has been re
336a0 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20 49 4e  moved (CREATE IN
336b0 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76  DEX needs to mov
336c0 65 20 61 20 70 61 67 65 20 77 68 65 6e 20 61 20  e a page when a 
336d0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61  statement.** tra
336e0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
336f0 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ve)..**.** If th
33700 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e  e fourth argumen
33710 74 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 69 73 20  t, isCommit, is 
33720 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
33730 68 69 73 20 70 61 67 65 20 69 73 20 62 65 69 6e  his page is bein
33740 67 0a 2a 2a 20 6d 6f 76 65 64 20 61 73 20 70 61  g.** moved as pa
33750 72 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  rt of a database
33760 20 72 65 6f 72 67 61 6e 69 7a 61 74 69 6f 6e 20   reorganization 
33770 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68 65 20  just before the 
33780 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
33790 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74  is being committ
337a0 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
337b0 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  , it is guarante
337c0 65 64 20 74 68 61 74 20 74 68 65 20 64 61 74 61  ed that the data
337d0 62 61 73 65 20 70 61 67 65 20 0a 2a 2a 20 70 50  base page .** pP
337e0 67 20 72 65 66 65 72 73 20 74 6f 20 77 69 6c 6c  g refers to will
337f0 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20   not be written 
33800 74 6f 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  to again within 
33810 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
33820 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
33830 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e  ction may return
33840 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72   SQLITE_NOMEM or
33850 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
33860 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a  e if an error.**
33870 20 6f 63 63 75 72 73 2e 20 4f 74 68 65 72 77 69   occurs. Otherwi
33880 73 65 2c 20 69 74 20 72 65 74 75 72 6e 73 20 53  se, it returns S
33890 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
338a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
338b0 65 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  epage(Pager *pPa
338c0 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70 50 67  ger, DbPage *pPg
338d0 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 69 6e 74  , Pgno pgno, int
338e0 20 69 73 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67   isCommit){.  Pg
338f0 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 20 20 20  Hdr *pPgOld;    
33900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
33910 65 20 70 61 67 65 20 62 65 69 6e 67 20 6f 76 65  e page being ove
33920 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 50  rwritten. */.  P
33930 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  gno needSyncPgno
33940 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f   = 0;       /* O
33950 6c 64 20 76 61 6c 75 65 20 6f 66 20 70 50 67 2d  ld value of pPg-
33960 3e 70 67 6e 6f 2c 20 69 66 20 73 79 6e 63 20 69  >pgno, if sync i
33970 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  s required */.  
33980 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
33990 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
339a0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
339b0 20 50 67 6e 6f 20 6f 72 69 67 50 67 6e 6f 3b 20   Pgno origPgno; 
339c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
339d0 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   The original pa
339e0 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20  ge number */..  
339f0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
33a00 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20  f>0 );..  /* In 
33a10 6f 72 64 65 72 20 74 6f 20 62 65 20 61 62 6c 65  order to be able
33a20 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 6e   to rollback, an
33a30 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
33a40 61 73 65 20 6d 75 73 74 20 6a 6f 75 72 6e 61 6c  ase must journal
33a50 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77  .  ** the page w
33a60 65 20 61 72 65 20 6d 6f 76 69 6e 67 20 66 72 6f  e are moving fro
33a70 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45  m..  */.  if( ME
33a80 4d 44 42 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  MDB ){.    rc = 
33a90 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
33aa0 65 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20  e(pPg);.    if( 
33ab0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
33ac0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
33ad0 20 70 61 67 65 20 62 65 69 6e 67 20 6d 6f 76 65   page being move
33ae0 64 20 69 73 20 64 69 72 74 79 20 61 6e 64 20 68  d is dirty and h
33af0 61 73 20 6e 6f 74 20 62 65 65 6e 20 73 61 76 65  as not been save
33b00 64 20 62 79 20 74 68 65 20 6c 61 74 65 73 74 0a  d by the latest.
33b10 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2c 20    ** savepoint, 
33b20 74 68 65 6e 20 73 61 76 65 20 74 68 65 20 63 75  then save the cu
33b30 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f  rrent contents o
33b40 66 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  f the page into 
33b50 74 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f  the .  ** sub-jo
33b60 75 72 6e 61 6c 20 6e 6f 77 2e 20 54 68 69 73 20  urnal now. This 
33b70 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 68  is required to h
33b80 61 6e 64 6c 65 20 74 68 65 20 66 6f 6c 6c 6f 77  andle the follow
33b90 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 20 20  ing scenario:.  
33ba0 2a 2a 0a 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b  **.  **   BEGIN;
33bb0 0a 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e  .  **     <journ
33bc0 61 6c 20 70 61 67 65 20 58 2c 20 74 68 65 6e 20  al page X, then 
33bd0 6d 6f 64 69 66 79 20 69 74 20 69 6e 20 6d 65 6d  modify it in mem
33be0 6f 72 79 3e 0a 20 20 2a 2a 20 20 20 20 20 53 41  ory>.  **     SA
33bf0 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 2a  VEPOINT one;.  *
33c00 2a 20 20 20 20 20 20 20 3c 4d 6f 76 65 20 70 61  *       <Move pa
33c10 67 65 20 58 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  ge X to location
33c20 20 59 3e 0a 20 20 2a 2a 20 20 20 20 20 52 4f 4c   Y>.  **     ROL
33c30 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20  LBACK TO one;.  
33c40 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 61 67 65 20  **.  ** If page 
33c50 58 20 77 65 72 65 20 6e 6f 74 20 77 72 69 74 74  X were not writt
33c60 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  en to the sub-jo
33c70 75 72 6e 61 6c 20 68 65 72 65 2c 20 69 74 20 77  urnal here, it w
33c80 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65  ould not.  ** be
33c90 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 72 65 73   possible to res
33ca0 74 6f 72 65 20 69 74 73 20 63 6f 6e 74 65 6e 74  tore its content
33cb0 73 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c  s when the "ROLL
33cc0 42 41 43 4b 20 54 4f 20 6f 6e 65 22 0a 20 20 2a  BACK TO one".  *
33cd0 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 72 65  * statement were
33ce0 20 69 73 20 70 72 6f 63 65 73 73 65 64 2e 0a 20   is processed.. 
33cf0 20 2a 2a 0a 20 20 2a 2a 20 73 75 62 6a 6f 75 72   **.  ** subjour
33d00 6e 61 6c 50 61 67 65 28 29 20 6d 61 79 20 6e 65  nalPage() may ne
33d10 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  ed to allocate s
33d20 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 70 50  pace to store pP
33d30 67 2d 3e 70 67 6e 6f 20 69 6e 74 6f 0a 20 20 2a  g->pgno into.  *
33d40 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61  * one or more sa
33d50 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 2e  vepoint bitvecs.
33d60 20 54 68 69 73 20 69 73 20 74 68 65 20 72 65 61   This is the rea
33d70 73 6f 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  son this functio
33d80 6e 0a 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72  n.  ** may retur
33d90 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a  n SQLITE_NOMEM..
33da0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e    */.  if( pPg->
33db0 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
33dc0 59 0a 20 20 20 26 26 20 73 75 62 6a 52 65 71 75  Y.   && subjRequ
33dd0 69 72 65 73 50 61 67 65 28 70 50 67 29 0a 20 20  iresPage(pPg).  
33de0 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   && SQLITE_OK!=(
33df0 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
33e00 61 67 65 28 70 50 67 29 29 0a 20 20 29 7b 0a 20  age(pPg)).  ){. 
33e10 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
33e20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  }..  PAGERTRACE(
33e30 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25  ("MOVE %d page %
33e40 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20  d (needSync=%d) 
33e50 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20  moves to %d\n", 
33e60 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70  .      PAGERID(p
33e70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
33e80 6f 2c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  o, (pPg->flags&P
33e90 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f  GHDR_NEED_SYNC)?
33ea0 31 3a 30 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 49  1:0, pgno));.  I
33eb0 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25 70  OTRACE(("MOVE %p
33ec0 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %d %d\n", pPage
33ed0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67  r, pPg->pgno, pg
33ee0 6e 6f 29 29 0a 0a 20 20 2f 2a 20 49 66 20 74 68  no))..  /* If th
33ef0 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20  e journal needs 
33f00 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62  to be sync()ed b
33f10 65 66 6f 72 65 20 70 61 67 65 20 70 50 67 2d 3e  efore page pPg->
33f20 70 67 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62 65  pgno can.  ** be
33f30 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 73 74 6f   written to, sto
33f40 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20  re pPg->pgno in 
33f50 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  local variable n
33f60 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a  eedSyncPgno..  *
33f70 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69 73  *.  ** If the is
33f80 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  Commit flag is s
33f90 65 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  et, there is no 
33fa0 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
33fb0 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 6a   that.  ** the j
33fc0 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20  ournal needs to 
33fd0 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  be sync()ed befo
33fe0 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  re database page
33ff0 20 70 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a   pPg->pgno .  **
34000 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
34010 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68  to. The caller h
34020 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69  as already promi
34030 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65  sed not to write
34040 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69   to it..  */.  i
34050 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  f( (pPg->flags&P
34060 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 20  GHDR_NEED_SYNC) 
34070 26 26 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b 0a  && !isCommit ){.
34080 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f      needSyncPgno
34090 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
340a0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 49 6e    assert( pageIn
340b0 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20  Journal(pPg) || 
340c0 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
340d0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a  ->dbOrigSize );.
340e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
340f0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
34100 54 59 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  TY );.    assert
34110 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
34120 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nc );.  }..  /* 
34130 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e  If the cache con
34140 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69 74  tains a page wit
34150 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67  h page-number pg
34160 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20  no, remove it.  
34170 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68  ** from its hash
34180 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66   chain. Also, if
34190 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
341a0 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20  ync was set for 
341b0 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20  .  ** page pgno 
341c0 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65  before the 'move
341d0 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20  ' operation, it 
341e0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61  needs to be reta
341f0 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74  ined .  ** for t
34200 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68  he page moved th
34210 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d  ere..  */.  pPg-
34220 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52  >flags &= ~PGHDR
34230 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 70 50  _NEED_SYNC;.  pP
34240 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  gOld = pager_loo
34250 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
34260 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  );.  assert( !pP
34270 67 4f 6c 64 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e  gOld || pPgOld->
34280 6e 52 65 66 3d 3d 31 20 29 3b 0a 20 20 69 66 28  nRef==1 );.  if(
34290 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 70   pPgOld ){.    p
342a0 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70 50  Pg->flags |= (pP
342b0 67 4f 6c 64 2d 3e 66 6c 61 67 73 26 50 47 48 44  gOld->flags&PGHD
342c0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20 20  R_NEED_SYNC);.  
342d0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
342e0 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64       /* Do not d
342f0 69 73 63 61 72 64 20 70 61 67 65 73 20 66 72 6f  iscard pages fro
34300 6d 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  m an in-memory d
34310 61 74 61 62 61 73 65 20 73 69 6e 63 65 20 77 65  atabase since we
34320 20 6d 69 67 68 74 0a 20 20 20 20 20 20 2a 2a 20   might.      ** 
34330 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  need to rollback
34340 20 6c 61 74 65 72 2e 20 20 4a 75 73 74 20 6d 6f   later.  Just mo
34350 76 65 20 74 68 65 20 70 61 67 65 20 6f 75 74 20  ve the page out 
34360 6f 66 20 74 68 65 20 77 61 79 2e 20 2a 2f 0a 20  of the way. */. 
34370 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
34380 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
34390 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
343a0 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67 4f  3PcacheMove(pPgO
343b0 6c 64 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ld, pPager->dbSi
343c0 7a 65 2b 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ze+1);.    }else
343d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
343e0 63 61 63 68 65 44 72 6f 70 28 70 50 67 4f 6c 64  cacheDrop(pPgOld
343f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
34400 6f 72 69 67 50 67 6e 6f 20 3d 20 70 50 67 2d 3e  origPgno = pPg->
34410 70 67 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 50  pgno;.  sqlite3P
34420 63 61 63 68 65 4d 6f 76 65 28 70 50 67 2c 20 70  cacheMove(pPg, p
34430 67 6e 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  gno);.  sqlite3P
34440 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
34450 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  Pg);.  pPager->d
34460 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 0a  bModified = 1;..
34470 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67    if( needSyncPg
34480 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  no ){.    /* If 
34490 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20  needSyncPgno is 
344a0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
344b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
344c0 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20  needs to be .   
344d0 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66   ** sync()ed bef
344e0 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
344f0 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62  written to datab
34500 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65  ase file page ne
34510 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20  edSyncPgno..    
34520 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f  ** Currently, no
34530 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74   such page exist
34540 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61  s in the page-ca
34550 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20  che and the .   
34560 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e 61 6c 65   ** "is journale
34570 64 22 20 62 69 74 76 65 63 20 66 6c 61 67 20 68  d" bitvec flag h
34580 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69  as been set. Thi
34590 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  s needs to be re
345a0 6d 65 64 69 65 64 20 62 79 0a 20 20 20 20 2a 2a  medied by.    **
345b0 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 70 61 67   loading the pag
345c0 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72  e into the pager
345d0 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74 69  -cache and setti
345e0 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  ng the PgHdr.nee
345f0 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 66 6c  dSync .    ** fl
34600 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ag..    **.    *
34610 2a 20 49 66 20 74 68 65 20 61 74 74 65 6d 70 74  * If the attempt
34620 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 70 61 67   to load the pag
34630 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 2d  e into the page-
34640 63 61 63 68 65 20 66 61 69 6c 73 2c 20 28 64 75  cache fails, (du
34650 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20 6d 61  e.    ** to a ma
34660 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61 69  lloc() or IO fai
34670 6c 75 72 65 29 2c 20 63 6c 65 61 72 20 74 68 65  lure), clear the
34680 20 62 69 74 20 69 6e 20 74 68 65 20 70 49 6e 4a   bit in the pInJ
34690 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20  ournal[].    ** 
346a0 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65  array. Otherwise
346b0 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  , if the page is
346c0 20 6c 6f 61 64 65 64 20 61 6e 64 20 77 72 69 74   loaded and writ
346d0 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20 20 20  ten again in.   
346e0 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63   ** this transac
346f0 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62 65 20  tion, it may be 
34700 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
34710 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66  atabase file bef
34720 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74 20 69 73  ore.    ** it is
34730 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
34740 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
34750 68 69 73 20 77 61 79 2c 20 69 74 20 6d 61 79 20  his way, it may 
34760 65 6e 64 20 75 70 20 69 6e 0a 20 20 20 20 2a 2a  end up in.    **
34770 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
34780 65 20 74 77 69 63 65 2c 20 62 75 74 20 74 68 61  e twice, but tha
34790 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c  t is not a probl
347a0 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  em..    **.    *
347b0 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50 61 67  * The sqlite3Pag
347c0 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d 61 79  erGet() call may
347d0 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e   cause the journ
347e0 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d  al to sync. So m
347f0 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
34800 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79  the Pager.needSy
34810 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  nc flag is set t
34820 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 50  oo..    */.    P
34830 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20  gHdr *pPgHdr;.  
34840 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
34850 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
34860 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
34870 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e  gerGet(pPager, n
34880 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50  eedSyncPgno, &pP
34890 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72  gHdr);.    if( r
348a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
348b0 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 53 79        if( needSy
348c0 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ncPgno<=pPager->
348d0 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20  dbOrigSize ){.  
348e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
348f0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 21  ager->pTmpSpace!
34900 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =0 );.        sq
34910 6c 69 74 65 33 42 69 74 76 65 63 43 6c 65 61 72  lite3BitvecClear
34920 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
34930 6e 61 6c 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e  nal, needSyncPgn
34940 6f 2c 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  o, pPager->pTmpS
34950 70 61 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pace);.      }. 
34960 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
34970 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
34980 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
34990 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
349a0 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26 26  er->noSync==0 &&
349b0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70   !MEMDB );.    p
349c0 50 67 48 64 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  PgHdr->flags |= 
349d0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
349e0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
349f0 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 48  heMakeDirty(pPgH
34a00 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  dr);.    sqlite3
34a10 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
34a20 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  r);.  }..  /*.  
34a30 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ** For an in-mem
34a40 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6d 61  ory database, ma
34a50 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72 69 67  ke sure the orig
34a60 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 69 6e  inal page contin
34a70 75 65 73 0a 20 20 2a 2a 20 74 6f 20 65 78 69 73  ues.  ** to exis
34a80 74 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 74  t, in case the t
34a90 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73  ransaction needs
34aa0 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20   to roll back.  
34ab0 55 73 65 20 70 50 67 4f 6c 64 0a 20 20 2a 2a 20  Use pPgOld.  ** 
34ac0 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  as the original 
34ad0 70 61 67 65 20 73 69 6e 63 65 20 69 74 20 68 61  page since it ha
34ae0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
34af0 6c 6c 6f 63 61 74 65 64 2e 0a 20 20 2a 2f 0a 20  llocated..  */. 
34b00 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
34b10 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
34b20 6f 76 65 28 70 50 67 4f 6c 64 2c 20 6f 72 69 67  ove(pPgOld, orig
34b30 50 67 6e 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74  Pgno);.    sqlit
34b40 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
34b50 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Old);.  }..  ret
34b60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
34b70 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
34b80 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
34b90 74 6f 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  to the data for 
34ba0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
34bb0 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ge..*/.void *sql
34bc0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
34bd0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
34be0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
34bf0 65 66 3e 30 20 7c 7c 20 70 50 67 2d 3e 70 50 61  ef>0 || pPg->pPa
34c00 67 65 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20 20  ger->memDb );.  
34c10 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 44 61 74  return pPg->pDat
34c20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  a;.}../*.** Retu
34c30 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
34c40 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61  the Pager.nExtra
34c50 20 62 79 74 65 73 20 6f 66 20 22 65 78 74 72 61   bytes of "extra
34c60 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f  " space .** allo
34c70 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
34c80 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
34c90 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  age..*/.void *sq
34ca0 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
34cb0 72 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ra(DbPage *pPg){
34cc0 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70  .  return pPg->p
34cd0 45 78 74 72 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Extra;.}../*.** 
34ce0 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b  Get/set the lock
34cf0 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69  ing-mode for thi
34d00 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74  s pager. Paramet
34d10 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65  er eMode must be
34d20 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52   one.** of PAGER
34d30 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
34d40 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  RY, PAGER_LOCKIN
34d50 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20  GMODE_NORMAL or 
34d60 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  .** PAGER_LOCKIN
34d70 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e  GMODE_EXCLUSIVE.
34d80 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   If the paramete
34d90 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c  r is not _QUERY,
34da0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63   then.** the loc
34db0 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74  king-mode is set
34dc0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70   to the value sp
34dd0 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  ecified..**.** T
34de0 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
34df0 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47 45  e is either PAGE
34e00 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
34e10 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52  RMAL or.** PAGER
34e20 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
34e30 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69  LUSIVE, indicati
34e40 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 28  ng the current (
34e50 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64  possibly updated
34e60 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64  ).** locking-mod
34e70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
34e80 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64  3PagerLockingMod
34e90 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
34ea0 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61   int eMode){.  a
34eb0 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41  ssert( eMode==PA
34ec0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
34ed0 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20 20  QUERY.          
34ee0 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
34ef0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
34f00 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20  RMAL.           
34f10 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
34f20 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
34f30 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
34f40 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
34f50 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b  GMODE_QUERY<0 );
34f60 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
34f70 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
34f80 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f  MAL>=0 && PAGER_
34f90 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
34fa0 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66  USIVE>=0 );.  if
34fb0 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70  ( eMode>=0 && !p
34fc0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
34fd0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
34fe0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28  xclusiveMode = (
34ff0 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20  u8)eMode;.  }.  
35000 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67  return (int)pPag
35010 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
35020 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f  e;.}../*.** Get/
35030 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  set the journal-
35040 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61  mode for this pa
35050 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65  ger. Parameter e
35060 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65  Mode must be one
35070 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50 41   of:.**.**    PA
35080 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
35090 51 55 45 52 59 0a 2a 2a 20 20 20 20 50 41 47 45  QUERY.**    PAGE
350a0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
350b0 4c 45 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52  LETE.**    PAGER
350c0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
350d0 4e 43 41 54 45 0a 2a 2a 20 20 20 20 50 41 47 45  NCATE.**    PAGE
350e0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
350f0 52 53 49 53 54 0a 2a 2a 20 20 20 20 50 41 47 45  RSIST.**    PAGE
35100 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
35110 46 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  F.**    PAGER_JO
35120 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
35130 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
35140 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 0a 2a 2a 0a  RNALMODE_WAL.**.
35150 2a 2a 20 49 66 20 74 68 65 20 70 61 72 61 6d 65  ** If the parame
35160 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52  ter is not _QUER
35170 59 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  Y, then the jour
35180 6e 61 6c 5f 6d 6f 64 65 20 69 73 20 73 65 74 20  nal_mode is set 
35190 74 6f 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  to the.** value 
351a0 73 70 65 63 69 66 69 65 64 20 69 66 20 74 68 65  specified if the
351b0 20 63 68 61 6e 67 65 20 69 73 20 61 6c 6c 6f 77   change is allow
351c0 65 64 2e 20 54 68 65 20 63 68 61 6e 67 65 20 6d  ed. The change m
351d0 61 79 20 62 65 20 64 69 73 61 6c 6c 6f 77 65 64  ay be disallowed
351e0 0a 2a 2a 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c  .** for the foll
351f0 6f 77 69 6e 67 20 72 65 61 73 6f 6e 73 3a 0a 2a  owing reasons:.*
35200 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 69 6e 2d  *.**   *  An in-
35210 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
35220 63 61 6e 20 6f 6e 6c 79 20 68 61 76 65 20 69 74  can only have it
35230 73 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 73  s journal_mode s
35240 65 74 20 74 6f 20 5f 4f 46 46 0a 2a 2a 20 20 20  et to _OFF.**   
35250 20 20 20 6f 72 20 5f 4d 45 4d 4f 52 59 2e 0a 2a     or _MEMORY..*
35260 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 6a 6f  *.**   *  The jo
35270 75 72 6e 61 6c 20 6d 6f 64 65 20 6d 61 79 20 6e  urnal mode may n
35280 6f 74 20 62 65 20 63 68 61 6e 67 65 64 20 77 68  ot be changed wh
35290 69 6c 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ile a transactio
352a0 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 0a  n is active..**.
352b0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
352c0 69 6e 64 69 63 61 74 65 20 74 68 65 20 63 75 72  indicate the cur
352d0 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75  rent (possibly u
352e0 70 64 61 74 65 64 29 20 6a 6f 75 72 6e 61 6c 2d  pdated) journal-
352f0 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mode..*/.int sql
35300 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
35310 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67  Mode(Pager *pPag
35320 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a  er, int eMode){.
35330 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
35340 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
35350 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20  DE_QUERY.       
35360 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
35370 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
35380 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20  _DELETE.        
35390 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
353a0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
353b0 54 52 55 4e 43 41 54 45 0a 20 20 20 20 20 20 20  TRUNCATE.       
353c0 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
353d0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
353e0 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20 20 20  _PERSIST.       
353f0 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
35400 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
35410 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20  _OFF .          
35420 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
35430 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
35440 4c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  L .            |
35450 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
35460 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
35470 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  Y );.  assert( P
35480 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
35490 5f 51 55 45 52 59 3c 30 20 29 3b 0a 0a 20 20 69  _QUERY<0 );..  i
354a0 66 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  f( eMode==PAGER_
354b0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
354c0 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  .   && pPager->j
354d0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
354e0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
354f0 4c 45 54 45 0a 20 20 29 7b 0a 20 20 20 20 70 50  LETE.  ){.    pP
35500 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
35510 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
35520 4c 4d 4f 44 45 5f 57 41 4c 3b 0a 20 20 7d 65 6c  LMODE_WAL;.  }el
35530 73 65 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 0a  se if( eMode>=0.
35540 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 74     && (pPager->t
35550 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 65 4d  empFile==0 || eM
35560 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
35570 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 26  ALMODE_WAL).   &
35580 26 20 28 21 4d 45 4d 44 42 20 7c 7c 20 65 4d 6f  & (!MEMDB || eMo
35590 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
355a0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 7c 7c 65 4d  LMODE_MEMORY||eM
355b0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
355c0 41 4c 4d 4f 44 45 5f 4f 46 46 29 0a 20 20 20 26  ALMODE_OFF).   &
355d0 26 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  & !pPager->dbMod
355e0 69 66 69 65 64 0a 20 20 20 26 26 20 28 21 69 73  ified.   && (!is
355f0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
35600 29 20 7c 7c 20 30 3d 3d 70 50 61 67 65 72 2d 3e  ) || 0==pPager->
35610 6a 6f 75 72 6e 61 6c 4f 66 66 29 0a 20 20 29 7b  journalOff).  ){
35620 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28  .    if( isOpen(
35630 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
35640 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
35650 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
35660 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
35670 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
35680 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
35690 20 26 20 31 29 3d 3d 31 20 29 3b 0a 20 20 20 20   & 1)==1 );.    
356a0 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
356b0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
356c0 53 54 20 26 20 31 29 3d 3d 31 20 29 3b 0a 20 20  ST & 1)==1 );.  
356d0 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
356e0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
356f0 45 54 45 20 26 20 31 29 3d 3d 30 20 29 3b 0a 20  ETE & 1)==0 );. 
35700 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
35710 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
35720 4d 4f 52 59 20 26 20 31 29 3d 3d 30 20 29 3b 0a  MORY & 1)==0 );.
35730 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
35740 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
35750 46 46 20 26 20 31 29 3d 3d 30 20 29 3b 0a 20 20  FF & 1)==0 );.  
35760 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6a    if( (pPager->j
35770 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 31 29 3d  ournalMode & 1)=
35780 3d 31 20 26 26 20 28 65 4d 6f 64 65 20 26 20 31  =1 && (eMode & 1
35790 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
357a0 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
357b0 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  iveMode ){.     
357c0 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
357d0 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
357e0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
357f0 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   0);.    }..    
35800 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
35810 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b  ode = (u8)eMode;
35820 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69  .  }.  return (i
35830 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  nt)pPager->journ
35840 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  alMode;.}../*.**
35850 20 47 65 74 2f 73 65 74 20 74 68 65 20 73 69 7a   Get/set the siz
35860 65 2d 6c 69 6d 69 74 20 75 73 65 64 20 66 6f 72  e-limit used for
35870 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72   persistent jour
35880 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  nal files..**.**
35890 20 53 65 74 74 69 6e 67 20 74 68 65 20 73 69 7a   Setting the siz
358a0 65 20 6c 69 6d 69 74 20 74 6f 20 2d 31 20 6d 65  e limit to -1 me
358b0 61 6e 73 20 6e 6f 20 6c 69 6d 69 74 20 69 73 20  ans no limit is 
358c0 65 6e 66 6f 72 63 65 64 2e 0a 2a 2a 20 41 6e 20  enforced..** An 
358d0 61 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 61  attempt to set a
358e0 20 6c 69 6d 69 74 20 73 6d 61 6c 6c 65 72 20 74   limit smaller t
358f0 68 61 6e 20 2d 31 20 69 73 20 61 20 6e 6f 2d 6f  han -1 is a no-o
35900 70 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65  p..*/.i64 sqlite
35910 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69 7a  3PagerJournalSiz
35920 65 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50  eLimit(Pager *pP
35930 61 67 65 72 2c 20 69 36 34 20 69 4c 69 6d 69 74  ager, i64 iLimit
35940 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 3e  ){.  if( iLimit>
35950 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50 61 67 65  =-1 ){.    pPage
35960 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
35970 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b 0a 20 20  mit = iLimit;.  
35980 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  }.  return pPage
35990 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
359a0 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  mit;.}../*.** Re
359b0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
359c0 6f 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 42  o the pPager->pB
359d0 61 63 6b 75 70 20 76 61 72 69 61 62 6c 65 2e 20  ackup variable. 
359e0 54 68 65 20 62 61 63 6b 75 70 20 6d 6f 64 75 6c  The backup modul
359f0 65 0a 2a 2a 20 69 6e 20 62 61 63 6b 75 70 2e 63  e.** in backup.c
35a00 20 6d 61 69 6e 74 61 69 6e 73 20 74 68 65 20 63   maintains the c
35a10 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 76  ontent of this v
35a20 61 72 69 61 62 6c 65 2e 20 54 68 69 73 20 6d 6f  ariable. This mo
35a30 64 75 6c 65 0a 2a 2a 20 75 73 65 73 20 69 74 20  dule.** uses it 
35a40 6f 70 61 71 75 65 6c 79 20 61 73 20 61 6e 20 61  opaquely as an a
35a50 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74  rgument to sqlit
35a60 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
35a70 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33  ) and.** sqlite3
35a80 42 61 63 6b 75 70 55 70 64 61 74 65 28 29 20 6f  BackupUpdate() o
35a90 6e 6c 79 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  nly..*/.sqlite3_
35aa0 62 61 63 6b 75 70 20 2a 2a 73 71 6c 69 74 65 33  backup **sqlite3
35ab0 50 61 67 65 72 42 61 63 6b 75 70 50 74 72 28 50  PagerBackupPtr(P
35ac0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
35ad0 20 72 65 74 75 72 6e 20 26 70 50 61 67 65 72 2d   return &pPager-
35ae0 3e 70 42 61 63 6b 75 70 3b 0a 7d 0a 0a 2f 2a 0a  >pBackup;.}../*.
35af0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
35b00 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
35b10 74 68 65 20 75 73 65 72 20 69 6e 76 6f 6b 65 73  the user invokes
35b20 20 22 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f   "PRAGMA checkpo
35b30 69 6e 74 22 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  int"..*/.int sql
35b40 69 74 65 33 50 61 67 65 72 43 68 65 63 6b 70 6f  ite3PagerCheckpo
35b50 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
35b60 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
35b70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
35b80 70 50 61 67 65 72 2d 3e 70 4c 6f 67 20 29 7b 0a  pPager->pLog ){.
35b90 20 20 20 20 75 38 20 2a 7a 42 75 66 20 3d 20 28      u8 *zBuf = (
35ba0 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  u8 *)pPager->pTm
35bb0 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d  pSpace;.    rc =
35bc0 20 73 71 6c 69 74 65 33 4c 6f 67 43 68 65 63 6b   sqlite3LogCheck
35bd0 70 6f 69 6e 74 28 70 50 61 67 65 72 2d 3e 70 4c  point(pPager->pL
35be0 6f 67 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20  og, pPager->fd, 
35bf0 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72  .        (pPager
35c00 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 20 3a 20 70  ->noSync ? 0 : p
35c10 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
35c20 73 29 2c 0a 20 20 20 20 20 20 20 20 7a 42 75 66  s),.        zBuf
35c30 2c 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  , pPager->xBusyH
35c40 61 6e 64 6c 65 72 2c 20 70 50 61 67 65 72 2d 3e  andler, pPager->
35c50 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 0a  pBusyHandlerArg.
35c60 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74      );.  }.  ret
35c70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73  urn rc;.}..int s
35c80 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 67 43 61  qlite3PagerLogCa
35c90 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
35ca0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
35cb0 73 71 6c 69 74 65 33 4c 6f 67 43 61 6c 6c 62 61  sqlite3LogCallba
35cc0 63 6b 28 70 50 61 67 65 72 2d 3e 70 4c 6f 67 29  ck(pPager->pLog)
35cd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
35ce0 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
35cf0 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 20  the write-ahead 
35d00 6c 6f 67 20 66 69 6c 65 20 66 6f 72 20 70 61 67  log file for pag
35d10 65 72 20 70 50 61 67 65 72 2e 20 49 66 0a 2a 2a  er pPager. If.**
35d20 20 74 68 65 20 6c 6f 67 20 63 6f 6e 6e 65 63 74   the log connect
35d30 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ion is already o
35d40 70 65 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69  pen, this functi
35d50 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
35d60 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
35d70 6d 75 73 74 20 62 65 20 68 6f 6c 64 69 6e 67 20  must be holding 
35d80 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e  a SHARED lock on
35d90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35da0 6c 65 20 74 6f 20 63 61 6c 6c 0a 2a 2a 20 74 68  le to call.** th
35db0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
35dc0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
35dd0 4f 70 65 6e 4c 6f 67 28 50 61 67 65 72 20 2a 70  OpenLog(Pager *p
35de0 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 69 73 4f  Pager, int *pisO
35df0 70 65 6e 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pen){.  int rc =
35e00 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
35e10 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
35e20 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  n code */..  ass
35e30 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
35e40 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
35e50 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
35e60 72 2d 3e 70 4c 6f 67 20 29 7b 0a 0a 20 20 20 20  r->pLog ){..    
35e70 2f 2a 20 4f 70 65 6e 20 74 68 65 20 63 6f 6e 6e  /* Open the conn
35e80 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 6f  ection to the lo
35e90 67 20 66 69 6c 65 2e 20 49 66 20 74 68 69 73 20  g file. If this 
35ea0 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 2c  operation fails,
35eb0 20 0a 20 20 20 20 2a 2a 20 28 65 2e 67 2e 20 64   .    ** (e.g. d
35ec0 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 28 29 20 66  ue to malloc() f
35ed0 61 69 6c 75 72 65 29 2c 20 75 6e 6c 6f 63 6b 20  ailure), unlock 
35ee0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
35ef0 65 20 61 6e 64 20 0a 20 20 20 20 2a 2a 20 72 65  e and .    ** re
35f00 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
35f10 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  de..    */.    r
35f20 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 4f 70  c = sqlite3LogOp
35f30 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  en(pPager->pVfs,
35f40 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
35f50 6d 65 2c 20 26 70 50 61 67 65 72 2d 3e 70 4c 6f  me, &pPager->pLo
35f60 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  g);.    if( rc==
35f70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
35f80 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
35f90 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
35fa0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 3b 0a  OURNALMODE_WAL;.
35fb0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
35fc0 20 20 20 2a 70 69 73 4f 70 65 6e 20 3d 20 31 3b     *pisOpen = 1;
35fd0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
35fe0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
35ff0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
36000 6c 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 74 68  lled to close th
36010 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
36020 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 70 72 69  the log file pri
36030 6f 72 0a 2a 2a 20 74 6f 20 73 77 69 74 63 68 69  or.** to switchi
36040 6e 67 20 66 72 6f 6d 20 57 41 4c 20 74 6f 20 72  ng from WAL to r
36050 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2e 0a 2a 2a  ollback mode..**
36060 0a 2a 2a 20 42 65 66 6f 72 65 20 63 6c 6f 73 69  .** Before closi
36070 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c  ng the log file,
36080 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
36090 74 74 65 6d 70 74 73 20 74 6f 20 74 61 6b 65 20  ttempts to take 
360a0 61 6e 20 0a 2a 2a 20 45 58 43 4c 55 53 49 56 45  an .** EXCLUSIVE
360b0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
360c0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
360d0 68 69 73 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62  his cannot be ob
360e0 74 61 69 6e 65 64 2c 20 61 6e 0a 2a 2a 20 65 72  tained, an.** er
360f0 72 6f 72 20 28 53 51 4c 49 54 45 5f 42 55 53 59  ror (SQLITE_BUSY
36100 29 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  ) is returned an
36110 64 20 74 68 65 20 6c 6f 67 20 63 6f 6e 6e 65 63  d the log connec
36120 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6c 6f 73  tion is not clos
36130 65 64 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  ed..** If succes
36140 73 66 75 6c 2c 20 74 68 65 20 45 58 43 4c 55 53  sful, the EXCLUS
36150 49 56 45 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  IVE lock is not 
36160 72 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20  released before 
36170 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e  returning..*/.in
36180 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c  t sqlite3PagerCl
36190 6f 73 65 4c 6f 67 28 50 61 67 65 72 20 2a 70 50  oseLog(Pager *pP
361a0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
361b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
361c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
361d0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
361e0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
361f0 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  AL );..  /* If t
36200 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 6e  he log file is n
36210 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  ot already open,
36220 20 62 75 74 20 64 6f 65 73 20 65 78 69 73 74 20   but does exist 
36230 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
36240 65 6d 2c 0a 20 20 2a 2a 20 69 74 20 6d 61 79 20  em,.  ** it may 
36250 6e 65 65 64 20 74 6f 20 62 65 20 63 68 65 63 6b  need to be check
36260 70 6f 69 6e 74 65 64 20 62 65 66 6f 72 65 20 74  pointed before t
36270 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61  he connection ca
36280 6e 20 73 77 69 74 63 68 20 74 6f 0a 20 20 2a 2a  n switch to.  **
36290 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2e 20   rollback mode. 
362a0 4f 70 65 6e 20 69 74 20 6e 6f 77 20 73 6f 20 74  Open it now so t
362b0 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 0a  his can happen..
362c0 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67    */.  if( !pPag
362d0 65 72 2d 3e 70 4c 6f 67 20 29 7b 0a 20 20 20 20  er->pLog ){.    
362e0 69 6e 74 20 6c 6f 67 65 78 69 73 74 73 20 3d 20  int logexists = 
362f0 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
36300 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
36310 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  ->fd, SQLITE_LOC
36320 4b 5f 53 48 41 52 45 44 29 3b 0a 20 20 20 20 69  K_SHARED);.    i
36330 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36340 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
36350 61 67 65 72 48 61 73 57 41 4c 28 70 50 61 67 65  agerHasWAL(pPage
36360 72 2c 20 26 6c 6f 67 65 78 69 73 74 73 29 3b 0a  r, &logexists);.
36370 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
36380 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c  ==SQLITE_OK && l
36390 6f 67 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  ogexists ){.    
363a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f    rc = sqlite3Lo
363b0 67 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56  gOpen(pPager->pV
363c0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  fs, pPager->zFil
363d0 65 6e 61 6d 65 2c 20 26 70 50 61 67 65 72 2d 3e  ename, &pPager->
363e0 70 4c 6f 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pLog);.    }.  }
363f0 0a 20 20 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b  .    .  /* Check
36400 70 6f 69 6e 74 20 61 6e 64 20 63 6c 6f 73 65 20  point and close 
36410 74 68 65 20 6c 6f 67 2e 20 42 65 63 61 75 73 65  the log. Because
36420 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
36430 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 0a 20 20  ck is held on.  
36440 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
36450 66 69 6c 65 2c 20 74 68 65 20 6c 6f 67 20 61 6e  file, the log an
36460 64 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 66 69  d log-summary fi
36470 6c 65 73 20 77 69 6c 6c 20 62 65 20 64 65 6c 65  les will be dele
36480 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ted..  */.  if( 
36490 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
364a0 20 70 50 61 67 65 72 2d 3e 70 4c 6f 67 20 29 7b   pPager->pLog ){
364b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
364c0 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
364d0 66 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  fd, SQLITE_LOCK_
364e0 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 20 20  EXCLUSIVE);.    
364f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
36500 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
36510 73 71 6c 69 74 65 33 4c 6f 67 43 6c 6f 73 65 28  sqlite3LogClose(
36520 70 50 61 67 65 72 2d 3e 70 4c 6f 67 2c 20 70 50  pPager->pLog, pP
36530 61 67 65 72 2d 3e 66 64 2c 0a 20 20 20 20 20 20  ager->fd,.      
36540 20 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e    (pPager->noSyn
36550 63 20 3f 20 30 20 3a 20 70 50 61 67 65 72 2d 3e  c ? 0 : pPager->
36560 73 79 6e 63 5f 66 6c 61 67 73 29 2c 20 0a 20 20  sync_flags), .  
36570 20 20 20 20 20 20 28 75 38 2a 29 70 50 61 67 65        (u8*)pPage
36580 72 2d 3e 70 54 6d 70 53 70 61 63 65 0a 20 20 20  r->pTmpSpace.   
36590 20 20 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67     );.      pPag
365a0 65 72 2d 3e 70 4c 6f 67 20 3d 20 30 3b 0a 20 20  er->pLog = 0;.  
365b0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
365c0 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f   rc;.}..#endif /
365d0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  * SQLITE_OMIT_DI
365e0 53 4b 49 4f 20 2a 2f 0a                          SKIO */.