/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 3b2527d9d65a43880a98546ea84559271bb6d970:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 2f 2a 0a 2a 2a 2a 2a  "wal.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: 20 20 75 33 32 20 61 57 61 6c 44 61 74 61 5b 57    u32 aWalData[W
2660: 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e 44 41  AL_SAVEPOINT_NDA
2670: 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 57  TA];        /* W
2680: 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63 6f 6e  AL savepoint con
2690: 74 65 78 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  text */.};../*.*
26a0: 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61  * A open page ca
26b0: 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  che is an instan
26c0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
26d0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
26e0: 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a  *.** errCode.**.
26f0: 2a 2a 20 20 20 50 61 67 65 72 2e 65 72 72 43 6f  **   Pager.errCo
2700: 64 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  de may be set to
2710: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53   SQLITE_IOERR, S
2720: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f  QLITE_CORRUPT, o
2730: 72 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49 54 45  r.**   or SQLITE
2740: 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20  _FULL. Once one 
2750: 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72  of the first thr
2760: 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73  ee errors occurs
2770: 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a  , it persists.**
2780: 20 20 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e     and is return
2790: 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  ed as the result
27a0: 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20   of every major 
27b0: 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20  pager API call. 
27c0: 20 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49 54 45   The.**   SQLITE
27d0: 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64  _FULL return cod
27e0: 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69  e is slightly di
27f0: 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73  fferent. It pers
2800: 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20  ists only until 
2810: 74 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20 73 75  the.**   next su
2820: 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63  ccessful rollbac
2830: 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f  k is performed o
2840: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
2850: 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20 53 51  e. Also,.**   SQ
2860: 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e  LITE_FULL does n
2870: 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71  ot affect the sq
2880: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
2890: 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
28a0: 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20 41 50  Lookup().**   AP
28b0: 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69  Is, they may sti
28c0: 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63 63 65  ll be used succe
28d0: 73 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 64  ssfully..**.** d
28e0: 62 53 69 7a 65 56 61 6c 69 64 2c 20 64 62 53 69  bSizeValid, dbSi
28f0: 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 2c 20  ze, dbOrigSize, 
2900: 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a 2a 2a  dbFileSize.**.**
2910: 20 20 20 4d 61 6e 61 67 69 6e 67 20 74 68 65 20     Managing the 
2920: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
2930: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67  base file in pag
2940: 65 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20 63  es is a little c
2950: 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20 20  omplicated..**  
2960: 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61   The variable Pa
2970: 67 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74 61  ger.dbSize conta
2980: 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ins the number o
2990: 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68 65  f pages that the
29a0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 69   database.**   i
29b0: 6d 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 63  mage currently c
29c0: 6f 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65 20  ontains. As the 
29d0: 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 67  database image g
29e0: 72 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73 20  rows or shrinks 
29f0: 74 68 69 73 0a 2a 2a 20 20 20 76 61 72 69 61 62  this.**   variab
2a00: 6c 65 20 69 73 20 75 70 64 61 74 65 64 2e 20 54  le is updated. T
2a10: 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67 65  he variable Page
2a20: 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e  r.dbFileSize con
2a30: 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  tains the number
2a40: 0a 2a 2a 20 20 20 6f 66 20 70 61 67 65 73 20 69  .**   of pages i
2a50: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2a60: 69 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 62 65  ile. This may be
2a70: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
2a80: 50 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a 2a 20  Pager.dbSize.** 
2a90: 20 20 69 66 20 73 6f 6d 65 20 70 61 67 65 73 20    if some pages 
2aa0: 68 61 76 65 20 62 65 65 6e 20 61 70 70 65 6e 64  have been append
2ab0: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
2ac0: 73 65 20 69 6d 61 67 65 20 62 75 74 20 6e 6f 74  se image but not
2ad0: 20 79 65 74 20 77 72 69 74 74 65 6e 0a 2a 2a 20   yet written.** 
2ae0: 20 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20 63    out from the c
2af0: 61 63 68 65 20 74 6f 20 74 68 65 20 61 63 74 75  ache to the actu
2b00: 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  al file on disk.
2b10: 20 4f 72 20 69 66 20 74 68 65 20 69 6d 61 67 65   Or if the image
2b20: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 74   has been.**   t
2b30: 72 75 6e 63 61 74 65 64 20 62 79 20 61 6e 20 69  runcated by an i
2b40: 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
2b50: 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65  m operation. The
2b60: 20 50 61 67 65 72 2e 64 62 4f 72 69 67 53 69 7a   Pager.dbOrigSiz
2b70: 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20  e variable.**   
2b80: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d  contains the num
2b90: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
2ba0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
2bb0: 67 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ge when the curr
2bc0: 65 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73 61 63  ent.**   transac
2bd0: 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e  tion was opened.
2be0: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
2bf0: 20 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74 68   all three of th
2c00: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 69 73  ese variables is
2c10: 0a 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61 72 61  .**   only guara
2c20: 6e 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72 72  nteed to be corr
2c30: 65 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c 65  ect if the boole
2c40: 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 56  an Pager.dbSizeV
2c50: 61 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a 2a  alid is true..**
2c60: 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e 64 65  .**   TODO: Unde
2c70: 72 20 77 68 61 74 20 63 6f 6e 64 69 74 69 6f 6e  r what condition
2c80: 73 20 69 73 20 64 62 53 69 7a 65 56 61 6c 69 64  s is dbSizeValid
2c90: 20 73 65 74 3f 20 43 6c 65 61 72 65 64 3f 0a 2a   set? Cleared?.*
2ca0: 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74  *.** changeCount
2cb0: 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Done.**.**   Thi
2cc0: 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  s boolean variab
2cd0: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  le is used to ma
2ce0: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
2cf0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
2d00: 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74  .**   (the 4-byt
2d10: 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61  e header field a
2d20: 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  t byte offset 24
2d30: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2d40: 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20   file) is .**   
2d50: 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65  not updated more
2d60: 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65   often than nece
2d70: 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ssary. .**.**   
2d80: 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  It is set to tru
2d90: 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67  e when the chang
2da0: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
2db0: 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63  is updated, whic
2dc0: 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79  h .**   can only
2dd0: 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78   happen if an ex
2de0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
2df0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
2e00: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
2e10: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73  It is cleared (s
2e20: 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65  et to false) whe
2e30: 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69  never an exclusi
2e40: 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20  ve lock is .**  
2e50: 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e   relinquished on
2e60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e70: 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20  le. Each time a 
2e80: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2e90: 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54  ommitted,.**   T
2ea0: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
2eb0: 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65  ne flag is inspe
2ec0: 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74  cted. If it is t
2ed0: 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66  rue, the work of
2ee0: 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74  .**   updating t
2ef0: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2f00: 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72  r is omitted for
2f10: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
2f20: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
2f30: 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d    This mechanism
2f40: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e   means that when
2f50: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
2f60: 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f  usive mode, a co
2f70: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e  nnection .**   n
2f80: 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20  eed only update 
2f90: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
2fa0: 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65  er once, for the
2fb0: 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69   first transacti
2fc0: 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65  on.**   committe
2fd0: 64 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64 69 66  d..**.** dbModif
2fe0: 69 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ied.**.**   The 
2ff0: 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67 20  dbModified flag 
3000: 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20  is set whenever 
3010: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
3020: 69 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a 20 20  is dirtied..**  
3030: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 61   It is cleared a
3040: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63  t the end of eac
3050: 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  h transaction..*
3060: 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 75 73 65  *.**   It is use
3070: 64 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  d when committin
3080: 67 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20 65  g or otherwise e
3090: 6e 64 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  nding a transact
30a0: 69 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74 68 65  ion. If.**   the
30b0: 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67   dbModified flag
30c0: 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 6c   is clear then l
30d0: 65 73 73 20 77 6f 72 6b 20 68 61 73 20 74 6f 20  ess work has to 
30e0: 62 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 6a  be done..**.** j
30f0: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 0a 2a 2a  ournalStarted.**
3100: 0a 2a 2a 20 20 20 54 68 69 73 20 66 6c 61 67 20  .**   This flag 
3110: 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20  is set whenever 
3120: 74 68 65 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  the the main jou
3130: 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 20 61  rnal is opened a
3140: 6e 64 0a 2a 2a 20 20 20 69 6e 69 74 69 61 6c 69  nd.**   initiali
3150: 7a 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  zed.**.**   The 
3160: 70 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c  point of this fl
3170: 61 67 20 69 73 20 74 68 61 74 20 69 74 20 6d 75  ag is that it mu
3180: 73 74 20 62 65 20 73 65 74 20 61 66 74 65 72 20  st be set after 
3190: 74 68 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20  the .**   first 
31a0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
31b0: 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  n a journal file
31c0: 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
31d0: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41   to disk..**   A
31e0: 66 74 65 72 20 74 68 69 73 20 68 61 73 20 68 61  fter this has ha
31f0: 70 70 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65  ppened, new page
3200: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
3210: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20  e database .**  
3220: 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65   do not need the
3230: 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
3240: 20 66 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68   flag set, as th
3250: 65 79 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a  ey do not need.*
3260: 2a 20 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20  *   to wait for 
3270: 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62  a journal sync b
3280: 65 66 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62  efore they can b
3290: 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
32a0: 0a 2a 2a 20 20 20 74 68 65 20 64 61 74 61 62 61  .**   the databa
32b0: 73 65 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e  se file (see fun
32c0: 63 74 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74  ction pager_writ
32d0: 65 28 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73  e())..**   .** s
32e0: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
32f0: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   This variable i
3300: 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65  s used to ensure
3310: 20 74 68 61 74 20 74 68 65 20 6d 61 73 74 65 72   that the master
3320: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
3330: 6d 65 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29  me.**   (if any)
3340: 20 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e   is only written
3350: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
3360: 6c 20 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a  l file once..**.
3370: 2a 2a 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74  **   When commit
3380: 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
3390: 6f 6e 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  on, the master j
33a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
33b0: 20 28 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d   (if any).**   m
33c0: 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ay be written in
33d0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
33e0: 69 6c 65 20 77 68 69 6c 65 20 74 68 65 20 70 61  ile while the pa
33f0: 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a  ger is still in.
3400: 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52  **   PAGER_RESER
3410: 56 45 44 20 73 74 61 74 65 20 28 73 65 65 20 43  VED state (see C
3420: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
3430: 66 6f 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e  for the action).
3440: 20 49 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74   It.**   then at
3450: 74 65 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64  tempts to upgrad
3460: 65 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76  e to an exclusiv
3470: 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20  e lock. If this 
3480: 61 74 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69  attempt.**   fai
3490: 6c 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  ls, then SQLITE_
34a0: 42 55 53 59 20 6d 61 79 20 62 65 20 72 65 74 75  BUSY may be retu
34b0: 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
34c0: 20 61 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a   and the user.**
34d0: 20 20 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74     may attempt t
34e0: 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
34f0: 6e 73 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c  nsaction again l
3500: 61 74 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a  ater (calling.**
3510: 20 20 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e     CommitPhaseOn
3520: 65 28 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73  e() again). This
3530: 20 66 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f   flag is used to
3540: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
3550: 20 0a 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f   .**   master jo
3560: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e  urnal name is on
3570: 6c 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ly written to th
3580: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
3590: 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69  he first.**   ti
35a0: 6d 65 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  me CommitPhaseOn
35b0: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
35c0: 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 79 6e 63 0a 2a  *.** doNotSync.*
35d0: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 65 6e 61 62  *.**   When enab
35e0: 6c 65 64 2c 20 63 61 63 68 65 20 73 70 69 6c 6c  led, cache spill
35f0: 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64  s are prohibited
3600: 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
3610: 20 66 69 6c 65 20 63 61 6e 6e 6f 74 0a 2a 2a 20   file cannot.** 
3620: 20 20 62 65 20 73 79 6e 63 65 64 2e 20 20 54 68    be synced.  Th
3630: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 73  is variable is s
3640: 65 74 20 61 6e 64 20 63 6c 65 61 72 65 64 20 62  et and cleared b
3650: 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  y sqlite3PagerWr
3660: 69 74 65 28 29 20 0a 2a 2a 20 20 20 69 6e 20 6f  ite() .**   in o
3670: 72 64 65 72 20 74 6f 20 70 72 65 76 65 6e 74 20  rder to prevent 
3680: 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 66  a journal sync f
3690: 72 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e  rom happening in
36a0: 20 62 65 74 77 65 65 6e 20 74 68 65 0a 2a 2a 20   between the.** 
36b0: 20 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 6f 66    journalling of
36c0: 20 74 77 6f 20 70 61 67 65 73 20 6f 6e 20 74 68   two pages on th
36d0: 65 20 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a 2a  e same sector..*
36e0: 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a  *.** needSync.**
36f0: 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74 20 6d  .**   TODO: It m
3700: 69 67 68 74 20 62 65 20 65 61 73 69 65 72 20 74  ight be easier t
3710: 6f 20 73 65 74 20 74 68 69 73 20 76 61 72 69 61  o set this varia
3720: 62 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f 75 72  ble in writeJour
3730: 6e 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20 61 6e  nalHdr().**   an
3740: 64 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  d writeMasterJou
3750: 72 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43 68 61  rnal() only. Cha
3760: 6e 67 65 20 69 74 73 20 6d 65 61 6e 69 6e 67 20  nge its meaning 
3770: 74 6f 20 22 75 6e 73 79 6e 63 65 64 20 64 61 74  to "unsynced dat
3780: 61 0a 2a 2a 20 20 20 68 61 73 20 62 65 65 6e 20  a.**   has been 
3790: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
37a0: 6f 75 72 6e 61 6c 22 2e 0a 2a 2a 0a 2a 2a 20 73  ournal"..**.** s
37b0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
37c0: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
37d0: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
37e0: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
37f0: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
3800: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
3810: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
3820: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
3830: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
3840: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
3850: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
3860: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
3870: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
3880: 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 72 75 63   files..*/.struc
3890: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
38a0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
38b0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
38c0: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
38d0: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
38e0: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
38f0: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
3900: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
3910: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
3920: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
3930: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
3940: 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68 65      /* On of the
3950: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
3960: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
3970: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3990: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
39a0: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
39b0: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65  ile */.  u8 noRe
39c0: 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20  adlock;         
39d0: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62       /* Do not b
39e0: 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20  other to obtain 
39f0: 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75  readlocks */.  u
3a00: 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20  8 noSync;       
3a10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
3a20: 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f   not sync the jo
3a30: 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f  urnal if true */
3a40: 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20  .  u8 fullSync; 
3a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3a60: 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73  * Do extra syncs
3a70: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
3a80: 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a  for robustness *
3a90: 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c 61 67  /.  u8 sync_flag
3aa0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
3ab0: 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e  /* One of SYNC_N
3ac0: 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55  ORMAL or SYNC_FU
3ad0: 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  LL */.  u8 tempF
3ae0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
3af0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
3b00: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
3b10: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
3b20: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
3b30: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
3b40: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
3b50: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
3b60: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
3b70: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3b80: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
3b90: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20  ile I/O */.  u8 
3ba0: 73 61 66 65 4a 72 6e 6c 48 61 6e 64 6c 65 3b 20  safeJrnlHandle; 
3bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3bc0: 20 69 66 20 6a 72 6e 6c 20 6d 61 79 20 62 65 20   if jrnl may be 
3bd0: 68 65 6c 64 20 6f 70 65 6e 20 77 69 74 68 20 6e  held open with n
3be0: 6f 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20  o lock */..  /* 
3bf0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
3c00: 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f  ock contains tho
3c10: 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73  se class members
3c20: 20 74 68 61 74 20 61 72 65 20 64 79 6e 61 6d 69   that are dynami
3c30: 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f 64 69 66  cally.  ** modif
3c40: 69 65 64 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61  ied during norma
3c50: 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 54 68  l operations. Th
3c60: 65 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65  e other variable
3c70: 73 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  s in this struct
3c80: 75 72 65 0a 20 20 2a 2a 20 61 72 65 20 65 69 74  ure.  ** are eit
3c90: 68 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 72  her constant thr
3ca0: 6f 75 67 68 6f 75 74 20 74 68 65 20 6c 69 66 65  oughout the life
3cb0: 74 69 6d 65 20 6f 66 20 74 68 65 20 70 61 67 65  time of the page
3cc0: 72 2c 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20  r, or else.  ** 
3cd0: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 63 6f  used to store co
3ce0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 70 61 72 61  nfiguration para
3cf0: 6d 65 74 65 72 73 20 74 68 61 74 20 61 66 66 65  meters that affe
3d00: 63 74 20 74 68 65 20 77 61 79 20 74 68 65 20 70  ct the way the p
3d10: 61 67 65 72 20 0a 20 20 2a 2a 20 6f 70 65 72 61  ager .  ** opera
3d20: 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  tes..  **.  ** T
3d30: 68 65 20 27 73 74 61 74 65 27 20 76 61 72 69 61  he 'state' varia
3d40: 62 6c 65 20 69 73 20 64 65 73 63 72 69 62 65 64  ble is described
3d50: 20 69 6e 20 6d 6f 72 65 20 64 65 74 61 69 6c 20   in more detail 
3d60: 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 0a 20  along with the. 
3d70: 20 2a 2a 20 64 65 73 63 72 69 70 74 69 6f 6e 73   ** descriptions
3d80: 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20 69   of the values i
3d90: 74 20 6d 61 79 20 74 61 6b 65 20 2d 20 50 41 47  t may take - PAG
3da0: 45 52 5f 55 4e 4c 4f 43 4b 20 65 74 63 2e 20 4d  ER_UNLOCK etc. M
3db0: 61 6e 79 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  any of the.  ** 
3dc0: 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65 73 20  other variables 
3dd0: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
3de0: 65 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74  e described in t
3df0: 68 65 20 63 6f 6d 6d 65 6e 74 20 64 69 72 65 63  he comment direc
3e00: 74 6c 79 20 0a 20 20 2a 2a 20 61 62 6f 76 65 20  tly .  ** above 
3e10: 74 68 69 73 20 63 6c 61 73 73 20 64 65 66 69 6e  this class defin
3e20: 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 75 38  ition..  */.  u8
3e30: 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20   state;         
3e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
3e50: 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52  ER_UNLOCK, _SHAR
3e60: 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20 65  ED, _RESERVED, e
3e70: 74 63 2e 20 2a 2f 0a 20 20 75 38 20 64 62 4d 6f  tc. */.  u8 dbMo
3e80: 64 69 66 69 65 64 3b 20 20 20 20 20 20 20 20 20  dified;         
3e90: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3ea0: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 63 68  there are any ch
3eb0: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 44 62 20  anges to the Db 
3ec0: 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63  */.  u8 needSync
3ed0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3ee0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66   /* True if an f
3ef0: 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64  sync() is needed
3f00: 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
3f10: 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53  */.  u8 journalS
3f20: 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20 20  tarted;         
3f30: 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61 64   /* True if head
3f40: 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73  er of journal is
3f50: 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20   synced */.  u8 
3f60: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b  changeCountDone;
3f70: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
3f80: 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69  after incrementi
3f90: 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  ng the change-co
3fa0: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65  unter */.  u8 se
3fb0: 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  tMaster;        
3fc0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3fd0: 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73  f a m-j name has
3fe0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
3ff0: 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f   jrnl */.  u8 do
4000: 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20 20  NotSync;        
4010: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
4020: 6e 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20 64  n. While true, d
4030: 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20  o not spill the 
4040: 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 64 62  cache */.  u8 db
4050: 53 69 7a 65 56 61 6c 69 64 3b 20 20 20 20 20 20  SizeValid;      
4060: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 77 68         /* Set wh
4070: 65 6e 20 64 62 53 69 7a 65 20 69 73 20 63 6f 72  en dbSize is cor
4080: 72 65 63 74 20 2a 2f 0a 20 20 75 38 20 73 75 62  rect */.  u8 sub
4090: 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20 20  jInMemory;      
40a0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
40b0: 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   use in-memory s
40c0: 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20  ub-journals */. 
40d0: 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20   Pgno dbSize;   
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
40f0: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
4100: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
4110: 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69 67  */.  Pgno dbOrig
4120: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
4130: 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72   /* dbSize befor
4140: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  e the current tr
4150: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50  ansaction */.  P
4160: 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b 20  gno dbFileSize; 
4170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4180: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
4190: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
41a0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43  le */.  int errC
41b0: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
41c0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65      /* One of se
41d0: 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65  veral kinds of e
41e0: 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  rrors */.  int n
41f0: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
4200: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20         /* Pages 
4210: 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63 65  journalled since
4220: 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20 77   last j-header w
4230: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32 20  ritten */.  u32 
4240: 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20  cksumInit;      
4250: 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69          /* Quasi
4260: 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64  -random value ad
4270: 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65  ded to every che
4280: 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20 6e  cksum */.  u32 n
4290: 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20 20  SubRec;         
42a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
42b0: 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69 74   of records writ
42c0: 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72 6e  ten to sub-journ
42d0: 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  al */.  Bitvec *
42e0: 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  pInJournal;     
42f0: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
4300: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
4310: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
4320: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
4330: 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20 20  ile *fd;        
4340: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
4350: 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62 61  iptor for databa
4360: 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
4370: 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20  file *jfd;      
4380: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
4390: 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e 20  riptor for main 
43a0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c  journal */.  sql
43b0: 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64 3b  ite3_file *sjfd;
43c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
43d0: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
43e0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  sub-journal */. 
43f0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b   i64 journalOff;
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4410: 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f 66  Current write of
4420: 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  fset in the jour
4430: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
4440: 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20  4 journalHdr;   
4450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
4460: 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76  e offset to prev
4470: 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61  ious journal hea
4480: 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  der */.  i64 jou
4490: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20  rnalSizeLimit;  
44a0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d       /* Size lim
44b0: 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e  it for persisten
44c0: 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  t journal files 
44d0: 2a 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f  */.  PagerSavepo
44e0: 69 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b  int *aSavepoint;
44f0: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74   /* Array of act
4500: 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a  ive savepoints *
4510: 2f 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69  /.  int nSavepoi
4520: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
4530: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
4540: 6d 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f  ments in aSavepo
4550: 69 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20  int[] */.  char 
4560: 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20  dbFileVers[16]; 
4570: 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65         /* Change
4580: 73 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62  s whenever datab
4590: 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73  ase file changes
45a0: 20 2a 2f 0a 20 20 75 33 32 20 73 65 63 74 6f 72   */.  u32 sector
45b0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
45c0: 20 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63    /* Assumed sec
45d0: 74 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20  tor size during 
45e0: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 75  rollback */..  u
45f0: 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20  16 nExtra;      
4600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
4610: 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
4620: 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  s to each in-mem
4630: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 31  ory page */.  i1
4640: 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  6 nReserve;     
4650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4660: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
4670: 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65 61  tes at end of ea
4680: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32  ch page */.  u32
4690: 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20   vfsFlags;      
46a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
46b0: 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66  s for sqlite3_vf
46c0: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 69  s.xOpen() */.  i
46d0: 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20  nt pageSize;    
46e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
46f0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
4700: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e   a page */.  Pgn
4710: 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20  o mxPgno;       
4720: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
4730: 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65  mum allowed size
4740: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
4750: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
4760: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
4770: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
4780: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
4790: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
47a0: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
47b0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
47c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
47d0: 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
47e0: 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20  ler)(void*); /* 
47f0: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
4800: 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   when busy */.  
4810: 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
4820: 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43  erArg;      /* C
4830: 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20  ontext argument 
4840: 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72  for xBusyHandler
4850: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
4860: 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69  E_TEST.  int nHi
4870: 74 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20  t, nMiss;       
4880: 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69       /* Cache hi
4890: 74 73 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a  ts and missing *
48a0: 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e  /.  int nRead, n
48b0: 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
48c0: 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65  /* Database page
48d0: 73 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a  s read/written *
48e0: 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20  /.#endif.  void 
48f0: 28 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50  (*xReiniter)(DbP
4900: 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74  age*); /* Call t
4910: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
4920: 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73   reloading pages
4930: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
4940: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f  E_HAS_CODEC.  vo
4950: 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f  id *(*xCodec)(vo
4960: 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
4970: 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20  nt); /* Routine 
4980: 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20  for en/decoding 
4990: 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28  data */.  void (
49a0: 2a 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29  *xCodecSizeChng)
49b0: 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b  (void*,int,int);
49c0: 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70 61   /* Notify of pa
49d0: 67 65 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20  ge size changes 
49e0: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  */.  void (*xCod
49f0: 65 63 46 72 65 65 29 28 76 6f 69 64 2a 29 3b 20  ecFree)(void*); 
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
4a10: 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68  estructor for th
4a20: 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69  e codec */.  voi
4a30: 64 20 2a 70 43 6f 64 65 63 3b 20 20 20 20 20 20  d *pCodec;      
4a40: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
4a50: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43  t argument to xC
4a60: 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20  odec... methods 
4a70: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72  */.#endif.  char
4a80: 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20   *pTmpSpace;    
4a90: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
4aa0: 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  .pageSize bytes 
4ab0: 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70  of space for tmp
4ac0: 20 75 73 65 20 2a 2f 0a 20 20 50 43 61 63 68 65   use */.  PCache
4ad0: 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20   *pPCache;      
4ae0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
4af0: 20 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f   to page cache o
4b00: 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
4b10: 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b  e3_backup *pBack
4b20: 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  up;    /* Pointe
4b30: 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67  r to list of ong
4b40: 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63  oing backup proc
4b50: 65 73 73 65 73 20 2a 2f 0a 23 69 66 6e 64 65 66  esses */.#ifndef
4b60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
4b70: 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20  .  Wal *pWal;   
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4b90: 2a 20 57 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  * Write-ahead lo
4ba0: 67 20 75 73 65 64 20 62 79 20 22 6a 6f 75 72 6e  g used by "journ
4bb0: 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a  al_mode=wal" */.
4bc0: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
4bd0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
4be0: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20  lobal variables 
4bf0: 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73  hold counters us
4c00: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
4c10: 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e  g purposes only.
4c20: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
4c30: 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69  s do not exist i
4c40: 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69  n.** a non-testi
4c50: 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65  ng build.  These
4c60: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e   variables are n
4c70: 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a  ot thread-safe..
4c80: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
4c90: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
4ca0: 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
4cb0: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
4cc0: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
4cd0: 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44  ages read from D
4ce0: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
4cf0: 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
4d00: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  ount = 0;   /* N
4d10: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
4d20: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44  ges written to D
4d30: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
4d40: 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
4d50: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
4d60: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
4d70: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
4d80: 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41  l */.# define PA
4d90: 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b  GER_INCR(v)  v++
4da0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4db0: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65  PAGER_INCR(v).#e
4dc0: 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ndif..../*.** Jo
4dd0: 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69  urnal files begi
4de0: 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  n with the follo
4df0: 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e  wing magic strin
4e00: 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20  g.  The data.** 
4e10: 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  was obtained fro
4e20: 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20  m /dev/random.  
4e30: 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  It is used only 
4e40: 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  as a sanity chec
4e50: 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76  k..**.** Since v
4e60: 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68  ersion 2.8.0, th
4e70: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  e journal format
4e80: 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69   contains additi
4e90: 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63  onal sanity.** c
4ea0: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
4eb0: 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77  ion.  If the pow
4ec0: 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74  er fails while t
4ed0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
4ee0: 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20  ing.** written, 
4ef0: 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62  semi-random garb
4f00: 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61  age data might a
4f10: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75  ppear in the jou
4f20: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74  rnal.** file aft
4f30: 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  er power is rest
4f40: 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74  ored.  If an att
4f50: 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64  empt is then mad
4f60: 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65  e.** to roll the
4f70: 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74   journal back, t
4f80: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c  he database coul
4f90: 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  d be corrupted. 
4fa0: 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a   The additional.
4fb0: 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  ** sanity checki
4fc0: 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74  ng data is an at
4fd0: 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65  tempt to discove
4fe0: 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e  r the garbage in
4ff0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
5000: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a  and ignore it..*
5010: 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20  *.** The sanity 
5020: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
5030: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77  tion for the new
5040: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
5050: 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61  consists.** of a
5060: 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d   32-bit checksum
5070: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66   on each page of
5080: 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63   data.  The chec
5090: 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68  ksum covers both
50a0: 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
50b0: 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67  ber and the pPag
50c0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
50d0: 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74  es of data for t
50e0: 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73  he page..** This
50f0: 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61   cksum is initia
5100: 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69  lized to a 32-bi
5110: 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74  t random value t
5120: 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74  hat appears in t
5130: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
5140: 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74  le right after t
5150: 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20  he header.  The 
5160: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a  random initializ
5170: 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c  er is important,
5180: 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62  .** because garb
5190: 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70  age data that ap
51a0: 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64  pears at the end
51b0: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73   of a journal is
51c0: 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20   likely.** data 
51d0: 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e  that was once in
51e0: 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61   other files tha
51f0: 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  t have now been 
5200: 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65  deleted.  If the
5210: 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61  .** garbage data
5220: 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62   came from an ob
5230: 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66  solete journal f
5240: 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75  ile, the checksu
5250: 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63  ms might.** be c
5260: 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20  orrect.  But by 
5270: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
5280: 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e   checksum to ran
5290: 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a  dom value which.
52a0: 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  ** is different 
52b0: 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61  for every journa
52c0: 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74  l, we minimize t
52d0: 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61  hat risk..*/.sta
52e0: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
52f0: 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c  ed char aJournal
5300: 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78  Magic[] = {.  0x
5310: 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20  d9, 0xd5, 0x05, 
5320: 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31  0xf9, 0x20, 0xa1
5330: 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b  , 0x63, 0xd7,.};
5340: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ../*.** The size
5350: 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68 20   of the of each 
5360: 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74  page record in t
5370: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69  he journal is gi
5380: 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f  ven by.** the fo
5390: 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a  llowing macro..*
53a0: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
53b0: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20  L_PG_SZ(pPager) 
53c0: 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53   ((pPager->pageS
53d0: 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a  ize) + 8)../*.**
53e0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
53f0: 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  der size for thi
5400: 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69 73  s pager. This is
5410: 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d   usually the sam
5420: 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20  e .** size as a 
5430: 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
5440: 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74  or. See also set
5450: 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f  SectorSize()..*/
5460: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
5470: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
5480: 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
5490: 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ize)../*.** The 
54a0: 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74  macro MEMDB is t
54b0: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65  rue if we are de
54c0: 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e  aling with an in
54d0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
54e0: 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20  ..** We do this 
54f0: 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68  as a macro so th
5500: 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45  at if the SQLITE
5510: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d  _OMIT_MEMORYDB m
5520: 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20  acro is set,.** 
5530: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d  the value of MEM
5540: 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e  DB will be a con
5550: 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f  stant and the co
5560: 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69  mpiler will opti
5570: 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65  mize.** out code
5580: 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65   that would neve
5590: 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69  r execute..*/.#i
55a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
55b0: 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69  _MEMORYDB.# defi
55c0: 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65  ne MEMDB 0.#else
55d0: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
55e0: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65  pPager->memDb.#e
55f0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
5600: 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61  maximum legal pa
5610: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e  ge number is (2^
5620: 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66  31 - 1)..*/.#def
5630: 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47  ine PAGER_MAX_PG
5640: 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a 23  NO 2147483647..#
5650: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f  ifndef NDEBUG ./
5660: 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a  *.** Usage:.**.*
5670: 2a 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65  *   assert( asse
5680: 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
5690: 50 61 67 65 72 29 20 29 3b 0a 2a 2f 0a 73 74 61  Pager) );.*/.sta
56a0: 74 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70  tic int assert_p
56b0: 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72  ager_state(Pager
56c0: 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 2f 2a   *pPager){..  /*
56d0: 20 41 20 74 65 6d 70 2d 66 69 6c 65 20 69 73 20   A temp-file is 
56e0: 61 6c 77 61 79 73 20 69 6e 20 50 41 47 45 52 5f  always in PAGER_
56f0: 45 58 43 4c 55 53 49 56 45 20 6f 72 20 50 41 47  EXCLUSIVE or PAG
5700: 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74 65 2e  ER_SYNCED state.
5710: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
5720: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  ager->tempFile==
5730: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61  0 || pPager->sta
5740: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
5750: 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  IVE );..  /* The
5760: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
5770: 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20   flag is always 
5780: 73 65 74 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c  set for temp-fil
5790: 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
57a0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
57b0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63  ==0 || pPager->c
57c0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29  hangeCountDone )
57d0: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  ;..  return 1;.}
57e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
57f0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
5800: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
5810: 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67   write page *pPg
5820: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
5830: 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65  urnal..** A page
5840: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69   needs to be wri
5850: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75  tten into the su
5860: 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65  b-journal if the
5870: 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a  re exists one.**
5880: 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61   or more open sa
5890: 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69  vepoints for whi
58a0: 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ch:.**.**   * Th
58b0: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
58c0: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
58d0: 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65  ual to PagerSave
58e0: 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64  point.nOrig, and
58f0: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20  .**   * The bit 
5900: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
5910: 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
5920: 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a   is not set in.*
5930: 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
5940: 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
5950: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
5960: 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
5970: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
5980: 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67   Pgno pgno = pPg
5990: 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
59a0: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
59b0: 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a  Pager;.  int i;.
59c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
59d0: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
59e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72   i++){.    Pager
59f0: 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26  Savepoint *p = &
5a00: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
5a10: 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  nt[i];.    if( p
5a20: 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26  ->nOrig>=pgno &&
5a30: 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65   0==sqlite3Bitve
5a40: 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76 65  cTest(p->pInSave
5a50: 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a  point, pgno) ){.
5a60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
5a70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
5a80: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
5a90: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
5aa0: 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
5ab0: 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
5ac0: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
5ad0: 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e   int pageInJourn
5ae0: 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  al(PgHdr *pPg){.
5af0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
5b00: 42 69 74 76 65 63 54 65 73 74 28 70 50 67 2d 3e  BitvecTest(pPg->
5b10: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
5b20: 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
5b30: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
5b40: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66  32-bit integer f
5b50: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69  rom the given fi
5b60: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
5b70: 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65  Store the intege
5b80: 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61  r.** that is rea
5b90: 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74  d in *pRes.  Ret
5ba0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
5bb0: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
5bc0: 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72  ed, or an.** err
5bd0: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
5be0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
5bf0: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65  .**.** All value
5c00: 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20  s are stored on 
5c10: 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69  disk as big-endi
5c20: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
5c30: 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c  t read32bits(sql
5c40: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
5c50: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a  64 offset, u32 *
5c60: 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pRes){.  unsigne
5c70: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
5c80: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
5c90: 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73  OsRead(fd, ac, s
5ca0: 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65  izeof(ac), offse
5cb0: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
5cc0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
5cd0: 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65  pRes = sqlite3Ge
5ce0: 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a  t4byte(ac);.  }.
5cf0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
5d00: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
5d10: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
5d20: 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
5d30: 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20  r in big-endian 
5d40: 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23  byte order..*/.#
5d50: 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73  define put32bits
5d60: 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75  (A,B)  sqlite3Pu
5d70: 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29  t4byte((u8*)A,B)
5d80: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
5d90: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
5da0: 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69  nto the given fi
5db0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
5dc0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
5dd0: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  .** on success o
5de0: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
5df0: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
5e00: 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
5e10: 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69  ic int write32bi
5e20: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
5e30: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
5e40: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61   u32 val){.  cha
5e50: 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32  r ac[4];.  put32
5e60: 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20  bits(ac, val);. 
5e70: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
5e80: 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34  sWrite(fd, ac, 4
5e90: 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a  , offset);.}../*
5ea0: 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
5eb0: 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69   to this macro i
5ec0: 73 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  s a file descrip
5ed0: 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69 74 65  tor (type sqlite
5ee0: 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74  3_file*)..** Ret
5ef0: 75 72 6e 20 30 20 69 66 20 69 74 20 69 73 20 6e  urn 0 if it is n
5f00: 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d  ot open, or non-
5f10: 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20 31 29  zero (but not 1)
5f20: 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a   if it is..**.**
5f30: 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61 74   This is so that
5f40: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e   expressions can
5f50: 20 62 65 20 77 72 69 74 74 65 6e 20 61 73 3a 0a   be written as:.
5f60: 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f 70  **.**   if( isOp
5f70: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
5f80: 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73  ){ ....**.** ins
5f90: 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20  tead of.**.**   
5fa0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d  if( pPager->jfd-
5fb0: 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e 2e  >pMethods ){ ...
5fc0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f 70  .*/.#define isOp
5fd0: 65 6e 28 70 46 64 29 20 28 28 70 46 64 29 2d 3e  en(pFd) ((pFd)->
5fe0: 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a  pMethods)../*.**
5ff0: 20 49 66 20 66 69 6c 65 20 70 46 64 20 69 73 20   If file pFd is 
6000: 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74  open, call sqlit
6010: 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20  e3OsUnlock() on 
6020: 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  it..*/.static in
6030: 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  t osUnlock(sqlit
6040: 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69 6e  e3_file *pFd, in
6050: 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20  t eLock){.  if( 
6060: 21 69 73 4f 70 65 6e 28 70 46 64 29 20 29 7b 0a  !isOpen(pFd) ){.
6070: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6080: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
6090: 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  rn sqlite3OsUnlo
60a0: 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a  ck(pFd, eLock);.
60b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
60c0: 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65  nction determine
60d0: 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
60e0: 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
60f0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  e optimization.*
6100: 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69  * can be used wi
6110: 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54  th this pager. T
6120: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
6130: 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a  can be used if:.
6140: 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76  **.**  (a) the v
6150: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
6160: 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74   OsDeviceCharact
6170: 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63  eristics() indic
6180: 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  ates that.**    
6190: 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67    a database pag
61a0: 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e  e may be written
61b0: 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64   atomically, and
61c0: 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c  .**  (b) the val
61d0: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
61e0: 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73  sSectorSize() is
61f0: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
6200: 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  ual.**      to t
6210: 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
6220: 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 61  .** The optimiza
6230: 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77  tion is also alw
6240: 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20  ays enabled for 
6250: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
6260: 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72   It is.** an err
6270: 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20  or to call this 
6280: 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61 67  function if pPag
6290: 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20  er is opened on 
62a0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  an in-memory.** 
62b0: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
62c0: 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  If the optimizat
62d0: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  ion cannot be us
62e0: 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  ed, 0 is returne
62f0: 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65 20  d. If it can be 
6300: 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  used,.** then th
6310: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
6320: 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20   is the size of 
6330: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6340: 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74   when it.** cont
6350: 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61  ains rollback da
6360: 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f  ta for exactly o
6370: 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64  ne page..*/.#ifd
6380: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6390: 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74  _ATOMIC_WRITE.st
63a0: 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66  atic int jrnlBuf
63b0: 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70  ferSize(Pager *p
63c0: 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
63d0: 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66  ( !MEMDB );.  if
63e0: 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
63f0: 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 64  ile ){.    int d
6400: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
6410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6420: 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  Device character
6430: 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e  istics */.    in
6440: 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20  t nSector;      
6450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6460: 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a  /* Sector size *
6470: 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65  /.    int szPage
6480: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6490: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
64a0: 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73  size */..    ass
64b0: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
64c0: 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20 64  er->fd) );.    d
64d0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
64e0: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
64f0: 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
6500: 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70 50      nSector = pP
6510: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
6520: 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70  ;.    szPage = p
6530: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
6540: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c  ..    assert(SQL
6550: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
6560: 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a  512==(512>>8));.
6570: 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
6580: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
6590: 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
65a0: 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26 28      if( 0==(dc&(
65b0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
65c0: 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29  MIC|(szPage>>8))
65d0: 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61   || nSector>szPa
65e0: 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ge) ){.      ret
65f0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
6600: 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e  ..  return JOURN
6610: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
6620: 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) + JOURNAL_PG_S
6630: 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e  Z(pPager);.}.#en
6640: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51  dif../*.** If SQ
6650: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
6660: 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e   is defined then
6670: 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69   we do some sani
6680: 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f  ty checking.** o
6690: 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e  n the cache usin
66a0: 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f  g a hash functio
66b0: 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  n.  This is used
66c0: 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20   for testing.** 
66d0: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
66e0: 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ly..*/.#ifdef SQ
66f0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
6700: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
6710: 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74  32-bit hash of t
6720: 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72  he page data for
6730: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
6740: 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61  c u32 pager_data
6750: 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20  hash(int nByte, 
6760: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
6770: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73  Data){.  u32 has
6780: 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  h = 0;.  int i;.
6790: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79    for(i=0; i<nBy
67a0: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61  te; i++){.    ha
67b0: 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29  sh = (hash*1039)
67c0: 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d   + pData[i];.  }
67d0: 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a  .  return hash;.
67e0: 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  }.static u32 pag
67f0: 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  er_pagehash(PgHd
6800: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74  r *pPage){.  ret
6810: 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61  urn pager_dataha
6820: 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72  sh(pPage->pPager
6830: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73  ->pageSize, (uns
6840: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61  igned char *)pPa
6850: 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74  ge->pData);.}.st
6860: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
6870: 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48  set_pagehash(PgH
6880: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50  dr *pPage){.  pP
6890: 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  age->pageHash = 
68a0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
68b0: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
68c0: 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d  The CHECK_PAGE m
68d0: 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48  acro takes a PgH
68e0: 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65  dr* as an argume
68f0: 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48  nt. If SQLITE_CH
6900: 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20  ECK_PAGES.** is 
6910: 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45  defined, and NDE
6920: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
6930: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
6940: 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73  statement checks
6950: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
6960: 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74  e is either dirt
6970: 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68  y or still match
6980: 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65  es the calculate
6990: 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a  d page-hash..*/.
69a0: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
69b0: 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28  GE(x) checkPage(
69c0: 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  x).static void c
69d0: 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a  heckPage(PgHdr *
69e0: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
69f0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
6a00: 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ger;.  assert( !
6a10: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c  pPg->pageHash ||
6a20: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
6a30: 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e  .      || (pPg->
6a40: 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
6a50: 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48  Y) || pPg->pageH
6a60: 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68  ash==pager_pageh
6a70: 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23  ash(pPg) );.}..#
6a80: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67  else.#define pag
6a90: 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29  er_datahash(X,Y)
6aa0: 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65    0.#define page
6ab0: 72 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30  r_pagehash(X)  0
6ac0: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
6ad0: 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f  AGE(x).#endif  /
6ae0: 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  * SQLITE_CHECK_P
6af0: 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57  AGES */../*.** W
6b00: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
6b10: 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ed the journal f
6b20: 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
6b30: 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65  ager must be ope
6b40: 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  n..** This funct
6b50: 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
6b60: 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a 6f  read a master jo
6b70: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
6b80: 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64  from the .** end
6b90: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64   of the file and
6ba0: 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  , if successful,
6bb0: 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f 20   copies it into 
6bc0: 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64 20  memory supplied 
6bd0: 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65  .** by the calle
6be0: 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  r. See comments 
6bf0: 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74 65  above writeMaste
6c00: 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 74  rJournal() for t
6c10: 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65  he format.** use
6c20: 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61 73  d to store a mas
6c30: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
6c40: 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e 64   name at the end
6c50: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   of a journal fi
6c60: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65  le..**.** zMaste
6c70: 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  r must point to 
6c80: 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c  a buffer of at l
6c90: 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74  east nMaster byt
6ca0: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a  es allocated by.
6cb0: 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54  ** the caller. T
6cc0: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71  his should be sq
6cd0: 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68  lite3_vfs.mxPath
6ce0: 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72  name+1 (to ensur
6cf0: 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e  e there is.** en
6d00: 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77 72  ough space to wr
6d10: 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
6d20: 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66  ournal name). If
6d30: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
6d40: 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74  nal.** name in t
6d50: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f  he journal is lo
6d60: 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65  nger than nMaste
6d70: 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69  r bytes (includi
6d80: 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  ng a.** nul-term
6d90: 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68  inator), then th
6da0: 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73  is is handled as
6db0: 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   if no master jo
6dc0: 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65  urnal name.** we
6dd0: 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  re present in th
6de0: 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
6df0: 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
6e00: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
6e10: 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68 65  s present at the
6e20: 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72   end of the jour
6e30: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65  nal.** file, the
6e40: 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 69  n it is copied i
6e50: 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70  nto the buffer p
6e60: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
6e70: 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74  ster. A.** nul-t
6e80: 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69  erminator byte i
6e90: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
6ea0: 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69  e buffer followi
6eb0: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  ng the master.**
6ec0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
6ed0: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20  me..**.** If it 
6ee0: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  is determined th
6ef0: 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  at no master jou
6f00: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
6f10: 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d  s present .** zM
6f20: 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20  aster[0] is set 
6f30: 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f  to 0 and SQLITE_
6f40: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  OK returned..**.
6f50: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
6f60: 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61 64  ccurs while read
6f70: 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
6f80: 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51  rnal file, an SQ
6f90: 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  Lite.** error co
6fa0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
6fb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
6fc0: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
6fd0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a  sqlite3_file *pJ
6fe0: 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74  rnl, char *zMast
6ff0: 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72 29  er, u32 nMaster)
7000: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
7010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7020: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
7030: 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20 20  .  u32 len;     
7040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7050: 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   Length in bytes
7060: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
7070: 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34  al name */.  i64
7080: 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
7090: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
70a0: 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
70b0: 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70  f journal file p
70c0: 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  Jrnl */.  u32 ck
70d0: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
70e0: 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b       /* MJ check
70f0: 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20 66  sum value read f
7100: 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  rom journal */. 
7110: 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20   u32 u;         
7120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
7130: 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
7140: 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  nter */.  unsign
7150: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
7160: 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72  ];   /* A buffer
7170: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
7180: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a  ic header */.  z
7190: 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27  Master[0] = '\0'
71a0: 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  ;..  if( SQLITE_
71b0: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
71c0: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e  3OsFileSize(pJrn
71d0: 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20  l, &szJ)).   || 
71e0: 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c  szJ<16.   || SQL
71f0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
7200: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
7210: 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20  szJ-16, &len)). 
7220: 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65    || len>=nMaste
7230: 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  r .   || SQLITE_
7240: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
7250: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  bits(pJrnl, szJ-
7260: 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20  12, &cksum)).   
7270: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
7280: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
7290: 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c  d(pJrnl, aMagic,
72a0: 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c   8, szJ-8)).   |
72b0: 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  | memcmp(aMagic,
72c0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
72d0: 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  8).   || SQLITE_
72e0: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
72f0: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a  3OsRead(pJrnl, z
7300: 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a  Master, len, szJ
7310: 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20  -16-len)).  ){. 
7320: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
7330: 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74  }..  /* See if t
7340: 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63  he checksum matc
7350: 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  hes the master j
7360: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
7370: 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b   for(u=0; u<len;
7380: 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d   u++){.    cksum
7390: 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a   -= zMaster[u];.
73a0: 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20    }.  if( cksum 
73b0: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
73c0: 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27   checksum doesn'
73d0: 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f  t add up, then o
73e0: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
73f0: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20  e disk sectors. 
7400: 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67     ** containing
7410: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
7420: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
7430: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
7440: 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66  means.    ** def
7450: 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63  initely roll bac
7460: 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72  k, so just retur
7470: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
7480: 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20  report a (nul). 
7490: 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75     ** master-jou
74a0: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20  rnal filename.. 
74b0: 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20     */.    len = 
74c0: 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  0;.  }.  zMaster
74d0: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  [len] = '\0';.  
74e0: 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
74f0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
7500: 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74  eturn the offset
7510: 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 62   of the sector b
7520: 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d  oundary at or im
7530: 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f  mediately .** fo
7540: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75  llowing the valu
7550: 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e in pPager->jou
7560: 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e  rnalOff, assumin
7570: 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73  g a sector .** s
7580: 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73  ize of pPager->s
7590: 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e  ectorSize bytes.
75a0: 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61  .**.** i.e for a
75b0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   sector size of 
75c0: 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67  512:.**.**   Pag
75d0: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20  er.journalOff   
75e0: 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 76 61         Return va
75f0: 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  lue.**   -------
7600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7620: 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20  .**   0         
7630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7640: 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20  0.**   512      
7650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7660: 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20   512.**   100   
7670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7680: 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30      512.**   200
7690: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
76a0: 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a         2048.** .
76b0: 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f  */.static i64 jo
76c0: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50  urnalHdrOffset(P
76d0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
76e0: 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
76f0: 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65  .  i64 c = pPage
7700: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
7710: 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66   if( c ){.    of
7720: 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f  fset = ((c-1)/JO
7730: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
7740: 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52  ger) + 1) * JOUR
7750: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
7760: 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  r);.  }.  assert
7770: 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c  ( offset%JOURNAL
7780: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
7790: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
77a0: 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61  offset>=c );.  a
77b0: 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63  ssert( (offset-c
77c0: 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )<JOURNAL_HDR_SZ
77d0: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
77e0: 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a  turn offset;.}..
77f0: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
7800: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
7810: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75  pen when this fu
7820: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
7830: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
7840: 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
7850: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
7860: 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65  file has not bee
7870: 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20  n written to.** 
7880: 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65  within the curre
7890: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28  nt transaction (
78a0: 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f  i.e. if Pager.jo
78b0: 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a  urnalOff==0)..**
78c0: 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74  .** If doTruncat
78d0: 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72  e is non-zero or
78e0: 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e   the Pager.journ
78f0: 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69  alSizeLimit vari
7900: 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74  able is.** set t
7910: 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61  o 0, then trunca
7920: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
7930: 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  ile to zero byte
7940: 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72  s in size. Other
7950: 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68  wise,.** zero th
7960: 65 20 32 38 2d 62 79 74 65 20 68 65 61 64 65 72  e 28-byte header
7970: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
7980: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7990: 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  e. In either cas
79a0: 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61  e, .** if the pa
79b0: 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f  ger is not in no
79c0: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63  -sync mode, sync
79d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
79e0: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a  e immediately .*
79f0: 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e 67 20  * after writing 
7a00: 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74  or truncating it
7a10: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72  ..**.** If Pager
7a20: 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  .journalSizeLimi
7a30: 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f  t is set to a po
7a40: 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f  sitive, non-zero
7a50: 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66   value, and.** f
7a60: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75  ollowing the tru
7a70: 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69  ncation or zeroi
7a80: 6e 67 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  ng described abo
7a90: 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ve the size of t
7aa0: 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  he .** journal f
7ab0: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73 20  ile in bytes is 
7ac0: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73  larger than this
7ad0: 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75   value, then tru
7ae0: 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75  ncate the.** jou
7af0: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67  rnal file to Pag
7b00: 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  er.journalSizeLi
7b10: 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a  mit bytes. The j
7b20: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
7b30: 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  .** not need to 
7b40: 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77  be synced follow
7b50: 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69  ing this operati
7b60: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  on..**.** If an 
7b70: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
7b80: 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73   abandon process
7b90: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ing and return t
7ba0: 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
7bb0: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
7bc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7bd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7be0: 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50  zeroJournalHdr(P
7bf0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
7c00: 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20  t doTruncate){. 
7c10: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
7c20: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
7c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c40: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
7c50: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  e */.  assert( i
7c60: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
7c70: 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  d) );.  if( pPag
7c80: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
7c90: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20  {.    const i64 
7ca0: 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d  iLimit = pPager-
7cb0: 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
7cc0: 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  t;    /* Local c
7cd0: 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a  ache of jsl */..
7ce0: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a      IOTRACE(("JZ
7cf0: 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50  EROHDR %p\n", pP
7d00: 61 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64  ager)).    if( d
7d10: 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69  oTruncate || iLi
7d20: 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
7d30: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
7d40: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
7d50: 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  fd, 0);.    }els
7d60: 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  e{.      static 
7d70: 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48  const char zeroH
7d80: 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20  dr[28] = {0};.  
7d90: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7da0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
7db0: 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69  jfd, zeroHdr, si
7dc0: 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30  zeof(zeroHdr), 0
7dd0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
7de0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
7df0: 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  & !pPager->noSyn
7e00: 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  c ){.      rc = 
7e10: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
7e20: 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54  ager->jfd, SQLIT
7e30: 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c  E_SYNC_DATAONLY|
7e40: 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
7e50: 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  gs);.    }..    
7e60: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
7e70: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
7e80: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75   is committed bu
7e90: 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  t the write lock
7ea0: 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c   .    ** is stil
7eb0: 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69  l held on the fi
7ec0: 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  le. If there is 
7ed0: 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e  a size limit con
7ee0: 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20  figured for .   
7ef0: 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65   ** the persiste
7f00: 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  nt journal and t
7f10: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7f20: 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d  currently consum
7f30: 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73  es more.    ** s
7f40: 70 61 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c  pace than that l
7f50: 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c  imit allows for,
7f60: 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77   truncate it now
7f70: 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  . There is no ne
7f80: 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e  ed.    ** to syn
7f90: 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f  c the file follo
7fa0: 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74  wing this operat
7fb0: 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
7fc0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
7fd0: 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b  K && iLimit>0 ){
7fe0: 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20  .      i64 sz;. 
7ff0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
8000: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
8010: 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20  er->jfd, &sz);. 
8020: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
8030: 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69  ITE_OK && sz>iLi
8040: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  mit ){.        r
8050: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
8060: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
8070: 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  d, iLimit);.    
8080: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
8090: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
80a0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
80b0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
80c0: 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  n when this rout
80d0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  ine is called. A
80e0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64   journal.** head
80f0: 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  er (JOURNAL_HDR_
8100: 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69  SZ bytes) is wri
8110: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
8120: 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68  urnal file at th
8130: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63  e.** current loc
8140: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
8150: 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20   format for the 
8160: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
8170: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
8180: 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69   - 8 bytes: Magi
8190: 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f  c identifying jo
81a0: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a  urnal format..**
81b0: 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62   - 4 bytes: Numb
81c0: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e  er of records in
81d0: 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20   journal, or -1 
81e0: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20  no-sync mode is 
81f0: 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  on..** - 4 bytes
8200: 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  : Random number 
8210: 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61  used for page ha
8220: 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  sh..** - 4 bytes
8230: 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61  : Initial databa
8240: 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  se page count..*
8250: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63  * - 4 bytes: Sec
8260: 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79  tor size used by
8270: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
8280: 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75  t wrote this jou
8290: 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  rnal..** - 4 byt
82a0: 65 73 3a 20 44 61 74 61 62 61 73 65 20 70 61 67  es: Database pag
82b0: 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46  e size..** .** F
82c0: 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52  ollowed by (JOUR
82d0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29  NAL_HDR_SZ - 28)
82e0: 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64   bytes of unused
82f0: 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   space..*/.stati
8300: 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e  c int writeJourn
8310: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
8320: 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
8330: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
8340: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
8350: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
8360: 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20  char *zHeader = 
8370: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
8380: 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79  e;  /* Temporary
8390: 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20 62   space used to b
83a0: 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20  uild header */. 
83b0: 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20 70   u32 nHeader = p
83c0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
83d0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
83e0: 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74  buffer pointed t
83f0: 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a  o by zHeader */.
8400: 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20    u32 nWrite;   
8410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8420: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
8430: 66 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 20  f header sector 
8440: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74  written */.  int
8450: 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8470: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
8480: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
8490: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
84a0: 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f  d) );      /* Jo
84b0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
84c0: 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69  be open. */..  i
84d0: 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e  f( nHeader>JOURN
84e0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
84f0: 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  ) ){.    nHeader
8500: 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   = JOURNAL_HDR_S
8510: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  Z(pPager);.  }..
8520: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
8530: 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  e active savepoi
8540: 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74  nts and any of t
8550: 68 65 6d 20 77 65 72 65 20 63 72 65 61 74 65 64  hem were created
8560: 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65   .  ** since the
8570: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75   most recent jou
8580: 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73 20  rnal header was 
8590: 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20  written, update 
85a0: 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53  the .  ** PagerS
85b0: 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
85c0: 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a  set fields now..
85d0: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b    */.  for(ii=0;
85e0: 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76   ii<pPager->nSav
85f0: 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20  epoint; ii++){. 
8600: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61     if( pPager->a
8610: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48  Savepoint[ii].iH
8620: 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20  drOffset==0 ){. 
8630: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61       pPager->aSa
8640: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72  vepoint[ii].iHdr
8650: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d  Offset = pPager-
8660: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
8670: 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72   }.  }..  pPager
8680: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
8690: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
86a0: 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
86b0: 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20  fset(pPager);.. 
86c0: 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20   /* .  ** Write 
86d0: 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d  the nRec Field -
86e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
86f0: 61 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74  age records that
8700: 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a   follow this.  *
8710: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
8720: 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f  . Normally, zero
8730: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
8740: 68 69 73 20 76 61 6c 75 65 20 61 74 20 74 68 69  his value at thi
8750: 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74  s time..  ** Aft
8760: 65 72 20 74 68 65 20 72 65 63 6f 72 64 73 20 61  er the records a
8770: 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  re added to the 
8780: 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65  journal (and the
8790: 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c   journal synced,
87a0: 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c   .  ** if in ful
87b0: 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68  l-sync mode), th
87c0: 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72  e zero is overwr
87d0: 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20 74  itten with the t
87e0: 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  rue number.  ** 
87f0: 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65 65 20  of records (see 
8800: 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a  syncJournal())..
8810: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74    **.  ** A fast
8820: 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69  er alternative i
8830: 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46 46  s to write 0xFFF
8840: 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65  FFFFF to the nRe
8850: 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20  c field. When.  
8860: 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a  ** reading the j
8870: 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75  ournal this valu
8880: 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74  e tells SQLite t
8890: 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  o assume that th
88a0: 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74  e.  ** rest of t
88b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
88c0: 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70  contains valid p
88d0: 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69  age records. Thi
88e0: 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a  s assumption.  *
88f0: 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20  * is dangerous, 
8900: 61 73 20 69 66 20 61 20 66 61 69 6c 75 72 65 20  as if a failure 
8910: 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74 20  occurred whilst 
8920: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a  writing to the j
8930: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
8940: 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   it may contain 
8950: 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61 74  some garbage dat
8960: 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  a. There are two
8970: 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20   scenarios.  ** 
8980: 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b 20  where this risk 
8990: 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a  can be ignored:.
89a0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68    **.  **   * Wh
89b0: 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20  en the pager is 
89c0: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
89d0: 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20   Corruption can 
89e0: 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20  follow a.  **   
89f0: 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20    power failure 
8a00: 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 79  in this case any
8a10: 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  way..  **.  **  
8a20: 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49   * When the SQLI
8a30: 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
8a40: 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74  PEND flag is set
8a50: 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65  . This guarantee
8a60: 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20  s.  **     that 
8a70: 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73 20  garbage data is 
8a80: 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20 74  never appended t
8a90: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
8aa0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  le..  */.  asser
8ab0: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
8ac0: 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
8ad0: 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28  >noSync );.  if(
8ae0: 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   (pPager->noSync
8af0: 29 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f  ) || (pPager->jo
8b00: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
8b10: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
8b20: 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69  ORY).   || (sqli
8b30: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
8b40: 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
8b50: 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f  r->fd)&SQLITE_IO
8b60: 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29  CAP_SAFE_APPEND)
8b70: 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70   .  ){.    memcp
8b80: 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72  y(zHeader, aJour
8b90: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
8ba0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
8bb0: 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28  ;.    put32bits(
8bc0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
8bd0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c  aJournalMagic)],
8be0: 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
8bf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65  }else{.    memse
8c00: 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73 69  t(zHeader, 0, si
8c10: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
8c20: 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ic)+4);.  }..  /
8c30: 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65  * The random che
8c40: 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69  ck-hash initiali
8c50: 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65  ser */ .  sqlite
8c60: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
8c70: 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  eof(pPager->cksu
8c80: 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d  mInit), &pPager-
8c90: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70  >cksumInit);.  p
8ca0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
8cb0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
8cc0: 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67  lMagic)+4], pPag
8cd0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
8ce0: 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c    /* The initial
8cf0: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a   database size *
8d00: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
8d10: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
8d20: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c  ournalMagic)+8],
8d30: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
8d40: 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61  ize);.  /* The a
8d50: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
8d60: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ze for this proc
8d70: 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ess */.  put32bi
8d80: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
8d90: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
8da0: 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73  )+12], pPager->s
8db0: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f  ectorSize);..  /
8dc0: 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
8dd0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
8de0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
8df0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36  JournalMagic)+16
8e00: 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ], pPager->pageS
8e10: 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74  ize);..  /* Init
8e20: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61 69  ializing the tai
8e30: 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  l of the buffer 
8e40: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
8e50: 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20 20  .  Everything.  
8e60: 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69 66  ** works find if
8e70: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
8e80: 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74 74  emset() is omitt
8e90: 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61 6c  ed.  But initial
8ea0: 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d  izing.  ** the m
8eb0: 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20 76  emory prevents v
8ec0: 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d  algrind from com
8ed0: 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20  plaining, so we 
8ee0: 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20  are willing to. 
8ef0: 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65 72   ** take the per
8f00: 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20  formance hit..  
8f10: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48 65  */.  memset(&zHe
8f20: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
8f30: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20  rnalMagic)+20], 
8f40: 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65 61  0,.         nHea
8f50: 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75  der-(sizeof(aJou
8f60: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b  rnalMagic)+20));
8f70: 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79  ..  /* In theory
8f80: 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63  , it is only nec
8f90: 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20  essary to write 
8fa0: 74 68 65 20 32 38 20 62 79 74 65 73 20 74 68 61  the 28 bytes tha
8fb0: 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72  t the .  ** jour
8fc0: 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73 75  nal header consu
8fd0: 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  mes to the journ
8fe0: 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54 68  al file here. Th
8ff0: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  en increment the
9000: 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75   .  ** Pager.jou
9010: 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c 65  rnalOff variable
9020: 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   by JOURNAL_HDR_
9030: 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  SZ so that the n
9040: 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64  ext .  ** record
9050: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
9060: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63  he following sec
9070: 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20 67  tor (leaving a g
9080: 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 20  ap in the file. 
9090: 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65   ** that will be
90a0: 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c   implicitly fill
90b0: 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53 29  ed in by the OS)
90c0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65  ..  **.  ** Howe
90d0: 76 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20  ver it has been 
90e0: 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20  discovered that 
90f0: 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20  on some systems 
9100: 74 68 69 73 20 70 61 74 74 65 72 6e 20 63 61 6e  this pattern can
9110: 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69 66   .  ** be signif
9120: 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74  icantly slower t
9130: 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79  han contiguously
9140: 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f   writing data to
9150: 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20   the file,.  ** 
9160: 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61  even if that mea
9170: 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77 72  ns explicitly wr
9180: 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68  iting data to th
9190: 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a  e block of .  **
91a0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
91b0: 20 2d 20 32 38 29 20 62 79 74 65 73 20 74 68 61   - 28) bytes tha
91c0: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73  t will not be us
91d0: 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20 77  ed. So that is w
91e0: 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65  hat.  ** is done
91f0: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  . .  **.  ** The
9200: 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72 65   loop is require
9210: 64 20 68 65 72 65 20 69 6e 20 63 61 73 65 20 74  d here in case t
9220: 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  he sector-size i
9230: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
9240: 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  e .  ** database
9250: 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e 63   page size. Sinc
9260: 65 20 74 68 65 20 7a 48 65 61 64 65 72 20 62 75  e the zHeader bu
9270: 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61 67  ffer is only Pag
9280: 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a  er.pageSize.  **
9290: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
92a0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 61  more than one ca
92b0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 57  ll to sqlite3OsW
92c0: 72 69 74 65 28 29 20 6d 61 79 20 62 65 20 72 65  rite() may be re
92d0: 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70  quired.  ** to p
92e0: 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74 69  opulate the enti
92f0: 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
9300: 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a  r sector..  */ .
9310: 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20    for(nWrite=0; 
9320: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e  rc==SQLITE_OK&&n
9330: 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44  Write<JOURNAL_HD
9340: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57  R_SZ(pPager); nW
9350: 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a  rite+=nHeader){.
9360: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48      IOTRACE(("JH
9370: 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22  DR %p %lld %d\n"
9380: 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
9390: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48  ->journalHdr, nH
93a0: 65 61 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d  eader)).    rc =
93b0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
93c0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65  pPager->jfd, zHe
93d0: 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70  ader, nHeader, p
93e0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
93f0: 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  f);.    assert( 
9400: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
9410: 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  dr <= pPager->jo
9420: 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20  urnalOff );.    
9430: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9440: 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20  ff += nHeader;. 
9450: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
9460: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
9470: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
9480: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
9490: 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  s is called. A j
94a0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
94b0: 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48  le.** (JOURNAL_H
94c0: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
94d0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75  read from the cu
94e0: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69  rrent location i
94f0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
9500: 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72 65   file. The curre
9510: 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74  nt location in t
9520: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9530: 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70  is given by.** p
9540: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
9550: 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  f. See comments 
9560: 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77  above function w
9570: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29  riteJournalHdr()
9580: 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72 69   for.** a descri
9590: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75  ption of the jou
95a0: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d  rnal header form
95b0: 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  at..**.** If the
95c0: 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20   header is read 
95d0: 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70  successfully, *p
95e0: 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74  NRec is set to t
95f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
9600: 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c  page records fol
9610: 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64  lowing this head
9620: 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65 20  er and *pDbSize 
9630: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69  is set to the si
9640: 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ze of the.** dat
9650: 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65  abase before the
9660: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67   transaction beg
9670: 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c  an, in pages. Al
9680: 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  so, pPager->cksu
9690: 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20  mInit.** is set 
96a0: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  to the value rea
96b0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
96c0: 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54  al header. SQLIT
96d0: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
96e0: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
96f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
9700: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
9710: 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  le appears to be
9720: 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49   corrupted, SQLI
9730: 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65  TE_DONE is.** re
9740: 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65  turned and *pNRe
9750: 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20 61  c and *PDbSize a
9760: 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20 49  re undefined.  I
9770: 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f JOURNAL_HDR_SZ
9780: 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74   bytes.** cannot
9790: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
97a0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
97b0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
97c0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
97d0: 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72  tic int readJour
97e0: 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20  nalHdr(.  Pager 
97f0: 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
9800: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
9810: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
9820: 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75  isHot,.  i64 jou
9830: 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20 20  rnalSize,       
9840: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
9850: 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61   the open journa
9860: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
9870: 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c  */.  u32 *pNRec,
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9890: 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20    /* OUT: Value 
98a0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e 52  read from the nR
98b0: 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33  ec field */.  u3
98c0: 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20 20  2 *pDbSize      
98d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
98e0: 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69 67  T: Value of orig
98f0: 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  inal database si
9900: 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20  ze field */.){. 
9910: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
9920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9930: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
9940: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9950: 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f  aMagic[8];     /
9960: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
9970: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
9980: 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  der */.  i64 iHd
9990: 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
99a0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
99b0: 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
99c0: 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a  r being read */.
99d0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
99e0: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
99f0: 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61  ;      /* Journa
9a00: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
9a10: 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64  pen. */..  /* Ad
9a20: 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75 72  vance Pager.jour
9a30: 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73 74  nalOff to the st
9a40: 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20  art of the next 
9a50: 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a 20  sector. If the. 
9a60: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
9a70: 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f   is too small fo
9a80: 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 61 20  r there to be a 
9a90: 68 65 61 64 65 72 20 73 74 6f 72 65 64 20 61 74  header stored at
9aa0: 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74   this.  ** point
9ab0: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
9ac0: 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  DONE..  */.  pPa
9ad0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
9ae0: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
9af0: 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  et(pPager);.  if
9b00: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
9b10: 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lOff+JOURNAL_HDR
9b20: 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f  _SZ(pPager) > jo
9b30: 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20  urnalSize ){.   
9b40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
9b50: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f  ONE;.  }.  iHdrO
9b60: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
9b70: 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52  rnalOff;..  /* R
9b80: 65 61 64 20 69 6e 20 74 68 65 20 66 69 72 73 74  ead in the first
9b90: 20 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   8 bytes of the 
9ba0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
9bb0: 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d  If they do not m
9bc0: 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d  atch.  ** the  m
9bd0: 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75 6e  agic string foun
9be0: 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
9bf0: 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68  f each journal h
9c00: 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20 20  eader, return.  
9c10: 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20  ** SQLITE_DONE. 
9c20: 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
9c30: 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e  ccurs, return an
9c40: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68   error code. Oth
9c50: 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f  erwise,.  ** pro
9c60: 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ceed..  */.  if(
9c70: 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66   isHot || iHdrOf
9c80: 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f!=pPager->journ
9c90: 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63 20  alHdr ){.    rc 
9ca0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
9cb0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61  pPager->jfd, aMa
9cc0: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
9cd0: 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20  ic), iHdrOff);. 
9ce0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
9cf0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
9d00: 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d 63    }.    if( memc
9d10: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
9d20: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
9d30: 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a  (aMagic))!=0 ){.
9d40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9d50: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
9d60: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
9d70: 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20 33  he first three 3
9d80: 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66 20  2-bit fields of 
9d90: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
9da0: 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20 2a  er: The nRec.  *
9db0: 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68 65  * field, the che
9dc0: 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65  cksum-initialize
9dd0: 72 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  r and the databa
9de0: 73 65 20 73 69 7a 65 20 61 74 20 74 68 65 20 73  se size at the s
9df0: 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tart.  ** of the
9e00: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65   transaction. Re
9e10: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
9e20: 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
9e30: 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a  oes wrong..  */.
9e40: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
9e50: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
9e60: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
9e70: 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29  HdrOff+8, pNRec)
9e80: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
9e90: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
9ea0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
9eb0: 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70 50   iHdrOff+12, &pP
9ec0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
9ed0: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
9ee0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
9ef0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
9f00: 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44 62   iHdrOff+16, pDb
9f10: 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20 20  Size)).  ){.    
9f20: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
9f30: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
9f40: 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20  urnalOff==0 ){. 
9f50: 20 20 20 75 33 32 20 69 50 61 67 65 53 69 7a 65     u32 iPageSize
9f60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9f70: 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69 65  /* Page-size fie
9f80: 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  ld of journal he
9f90: 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20  ader */.    u32 
9fa0: 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20  iSectorSize;    
9fb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74           /* Sect
9fc0: 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  or-size field of
9fd0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
9fe0: 2a 2f 0a 20 20 20 20 75 31 36 20 69 50 61 67 65  */.    u16 iPage
9ff0: 53 69 7a 65 31 36 3b 20 20 20 20 20 20 20 20 20  Size16;         
a000: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 69      /* Copy of i
a010: 50 61 67 65 53 69 7a 65 20 69 6e 20 31 36 2d 62  PageSize in 16-b
a020: 69 74 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a  it variable */..
a030: 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
a040: 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
a050: 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61  ctor-size journa
a060: 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e  l header fields.
a070: 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c 49   */.    if( SQLI
a080: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
a090: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
a0a0: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c  jfd, iHdrOff+20,
a0b0: 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29 0a   &iSectorSize)).
a0c0: 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f       || SQLITE_O
a0d0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
a0e0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
a0f0: 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69 50   iHdrOff+24, &iP
a100: 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29 7b  ageSize)).    ){
a110: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
a120: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
a130: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76  Check that the v
a140: 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20  alues read from 
a150: 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e  the page-size an
a160: 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66 69  d sector-size fi
a170: 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65 20  elds.    ** are 
a180: 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f  within range. To
a190: 20 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c 20   be 'in range', 
a1a0: 62 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65 64  both values need
a1b0: 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a 20   to be a power. 
a1c0: 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65     ** of two gre
a1d0: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
a1e0: 61 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32 2c  al to 512 or 32,
a1f0: 20 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72   and not greater
a200: 20 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20   than their .   
a210: 20 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20 63   ** respective c
a220: 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69  ompile time maxi
a230: 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20  mum limits..    
a240: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  */.    if( iPage
a250: 53 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20  Size<512        
a260: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65            || iSe
a270: 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20 20  ctorSize<32.    
a280: 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51   || iPageSize>SQ
a290: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
a2a0: 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a  ZE || iSectorSiz
a2b0: 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  e>MAX_SECTOR_SIZ
a2c0: 45 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67  E.     || ((iPag
a2d0: 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69  eSize-1)&iPageSi
a2e0: 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53  ze)!=0   || ((iS
a2f0: 65 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65  ectorSize-1)&iSe
a300: 63 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20  ctorSize)!=0 .  
a310: 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66    ){.      /* If
a320: 20 74 68 65 20 65 69 74 68 65 72 20 74 68 65 20   the either the 
a330: 70 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63  page-size or sec
a340: 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20  tor-size in the 
a350: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
a360: 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61  s .      ** inva
a370: 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72  lid, then the pr
a380: 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65  ocess that wrote
a390: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61   the journal-hea
a3a0: 64 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20  der must have . 
a3b0: 20 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20       ** crashed 
a3c0: 62 65 66 6f 72 65 20 74 68 65 20 68 65 61 64 65  before the heade
a3d0: 72 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e  r was synced. In
a3e0: 20 74 68 69 73 20 63 61 73 65 20 73 74 6f 70 20   this case stop 
a3f0: 72 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a  reading .      *
a400: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
a410: 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a  le here..      *
a420: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
a430: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
a440: 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  }..    /* Update
a450: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74   the page-size t
a460: 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  o match the valu
a470: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
a480: 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a  journal. .    **
a490: 20 55 73 65 20 61 20 74 65 73 74 63 61 73 65 28   Use a testcase(
a4a0: 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20  ) macro to make 
a4b0: 73 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63  sure that malloc
a4c0: 20 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20   failure within 
a4d0: 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74  .    ** PagerSet
a4e0: 50 61 67 65 73 69 7a 65 28 29 20 69 73 20 74 65  Pagesize() is te
a4f0: 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sted..    */.   
a500: 20 69 50 61 67 65 53 69 7a 65 31 36 20 3d 20 28   iPageSize16 = (
a510: 75 31 36 29 69 50 61 67 65 53 69 7a 65 3b 0a 20  u16)iPageSize;. 
a520: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
a530: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
a540: 70 50 61 67 65 72 2c 20 26 69 50 61 67 65 53 69  pPager, &iPageSi
a550: 7a 65 31 36 2c 20 2d 31 29 3b 0a 20 20 20 20 74  ze16, -1);.    t
a560: 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
a570: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 61 73  ITE_OK );.    as
a580: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
a590: 5f 4f 4b 20 7c 7c 20 69 50 61 67 65 53 69 7a 65  _OK || iPageSize
a5a0: 31 36 3d 3d 28 75 31 36 29 69 50 61 67 65 53 69  16==(u16)iPageSi
a5b0: 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70  ze );..    /* Up
a5c0: 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64  date the assumed
a5d0: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20   sector-size to 
a5e0: 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
a5f0: 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20  used by .    ** 
a600: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
a610: 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f   created this jo
a620: 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a  urnal. If this j
a630: 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a  ournal was.    *
a640: 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  * created by a p
a650: 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61  rocess other tha
a660: 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e  n this one, then
a670: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20   this routine.  
a680: 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61    ** is being ca
a690: 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
a6a0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
a6b0: 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c  ). The local val
a6c0: 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67  ue.    ** of Pag
a6d0: 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73  er.sectorSize is
a6e0: 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65   restored at the
a6f0: 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75   end of that rou
a700: 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tine..    */.   
a710: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
a720: 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a  ize = iSectorSiz
a730: 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72  e;.  }..  pPager
a740: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
a750: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
a760: 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
a770: 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57   rc;.}.../*.** W
a780: 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65  rite the supplie
a790: 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  d master journal
a7a0: 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a   name into the j
a7b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
a7c0: 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20  pager.** pPager 
a7d0: 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  at the current l
a7e0: 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73  ocation. The mas
a7f0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
a800: 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73   must be the las
a810: 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74  t.** thing writt
a820: 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20  en to a journal 
a830: 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67  file. If the pag
a840: 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79  er is in full-sy
a850: 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20  nc mode, the.** 
a860: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
a870: 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e  criptor is advan
a880: 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ced to the next 
a890: 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20  sector boundary 
a8a0: 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69  before.** anythi
a8b0: 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54  ng is written. T
a8c0: 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a  he format is:.**
a8d0: 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a  .**   + 4 bytes:
a8e0: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a   PAGER_MJ_PGNO..
a8f0: 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20  **   + N bytes: 
a900: 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  Master journal f
a910: 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38  ilename in utf-8
a920: 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  ..**   + 4 bytes
a930: 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d  : N (length of m
a940: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
a950: 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20  me in bytes, no 
a960: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e  nul-terminator).
a970: 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a  .**   + 4 bytes:
a980: 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   Master journal 
a990: 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  name checksum..*
a9a0: 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61  *   + 8 bytes: a
a9b0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
a9c0: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  **.** The master
a9d0: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68   journal page ch
a9e0: 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75  ecksum is the su
a9f0: 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69  m of the bytes i
aa00: 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20  n the master.** 
aa10: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68  journal name, wh
aa20: 65 72 65 20 65 61 63 68 20 62 79 74 65 20 69 73  ere each byte is
aa30: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
aa40: 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69  a signed 8-bit i
aa50: 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  nteger..**.** If
aa60: 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55   zMaster is a NU
aa70: 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75  LL pointer (occu
aa80: 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  rs for a single 
aa90: 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
aaa0: 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20  tion), .** this 
aab0: 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
aac0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
aad0: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
aae0: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
aaf0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
ab00: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
ab30: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
ab40: 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20  t nMaster;      
ab50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ab60: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69  * Length of stri
ab70: 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20  ng zMaster */.  
ab80: 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20  i64 iHdrOff;    
ab90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aba0: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65   /* Offset of he
abb0: 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20  ader in journal 
abc0: 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72  file */.  i64 jr
abd0: 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  nlSize;         
abe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
abf0: 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69  ze of journal fi
ac00: 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20  le on disk */.  
ac10: 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20  u32 cksum = 0;  
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac30: 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20   /* Checksum of 
ac40: 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a  string zMaster *
ac50: 2f 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65  /..  if( !zMaste
ac60: 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74  r || pPager->set
ac70: 4d 61 73 74 65 72 0a 20 20 20 7c 7c 20 70 50 61  Master.   || pPa
ac80: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
ac90: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
aca0: 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c  ODE_MEMORY .   |
acb0: 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
acc0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
acd0: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
ace0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
acf0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
ad00: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
ad10: 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
ad20: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
ad30: 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
ad40: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ad50: 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
ad60: 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20  ournalOff );..  
ad70: 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65  /* Calculate the
ad80: 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   length in bytes
ad90: 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75   and the checksu
ada0: 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  m of zMaster */.
adb0: 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b    for(nMaster=0;
adc0: 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
add0: 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20  ]; nMaster++){. 
ade0: 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
adf0: 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20  ter[nMaster];.  
ae00: 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
ae10: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
ae20: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
ae30: 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
ae40: 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
ae50: 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
ae60: 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
ae70: 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
ae80: 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
ae90: 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
aea0: 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
aeb0: 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
aec0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
aed0: 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
aee0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
aef0: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
af00: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
af10: 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  r);.  }.  iHdrOf
af20: 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
af30: 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72  nalOff;..  /* Wr
af40: 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
af50: 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74  ournal data to t
af60: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
af70: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20  urnal file. If. 
af80: 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
af90: 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  urs, return the 
afa0: 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
afb0: 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20  e caller..  */. 
afc0: 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d   if( (0 != (rc =
afd0: 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
afe0: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
aff0: 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  f, PAGER_MJ_PGNO
b000: 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c  (pPager)))).   |
b010: 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
b020: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
b030: 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
b040: 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72  r, nMaster, iHdr
b050: 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28  Off+4))).   || (
b060: 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
b070: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
b080: 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d  fd, iHdrOff+4+nM
b090: 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29  aster, nMaster))
b0a0: 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
b0b0: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
b0c0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
b0d0: 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34  rOff+4+nMaster+4
b0e0: 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c  , cksum))).   ||
b0f0: 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
b100: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
b110: 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61  er->jfd, aJourna
b120: 6c 4d 61 67 69 63 2c 20 38 2c 20 69 48 64 72 4f  lMagic, 8, iHdrO
b130: 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29  ff+4+nMaster+8))
b140: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
b150: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
b160: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
b170: 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a  = (nMaster+20);.
b180: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
b190: 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f  nc = !pPager->no
b1a0: 53 79 6e 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Sync;..  /* If t
b1b0: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 70  he pager is in p
b1c0: 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c  eristent-journal
b1d0: 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
b1e0: 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a  physical .  ** j
b1f0: 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20  ournal-file may 
b200: 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65 20  extend past the 
b210: 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65  end of the maste
b220: 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20  r-journal name. 
b230: 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20   ** and 8 bytes 
b240: 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75  of magic data ju
b250: 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  st written to th
b260: 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  e file. This is 
b270: 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20  .  ** dangerous 
b280: 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64 65  because the code
b290: 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68   to rollback a h
b2a0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  ot-journal file.
b2b0: 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65    ** will not be
b2c0: 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68   able to find th
b2d0: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
b2e0: 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
b2f0: 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72  ne .  ** whether
b300: 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
b310: 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a  nal is hot. .  *
b320: 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74  *.  ** Easiest t
b330: 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68  hing to do in th
b340: 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74  is scenario is t
b350: 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a  o truncate the j
b360: 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c  ournal .  ** fil
b370: 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72 65  e to the require
b380: 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20  d size..  */ .  
b390: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28  if( SQLITE_OK==(
b3a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
b3b0: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
b3c0: 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a  fd, &jrnlSize)).
b3d0: 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70     && jrnlSize>p
b3e0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
b3f0: 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  f.  ){.    rc = 
b400: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
b410: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  e(pPager->jfd, p
b420: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
b430: 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
b440: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69   rc;.}../*.** Fi
b450: 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
b460: 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65   hash table give
b470: 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65  n its page numbe
b480: 72 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  r. Return.** a p
b490: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
b4a0: 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68  ge or NULL if th
b4b0: 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
b4c0: 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65   is not .** alre
b4d0: 61 64 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a  ady in memory..*
b4e0: 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
b4f0: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67  pager_lookup(Pag
b500: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
b510: 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
b520: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
b530: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
b540: 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
b550: 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70    /* It is not p
b560: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 63 61  ossible for a ca
b570: 6c 6c 20 74 6f 20 50 63 61 63 68 65 46 65 74 63  ll to PcacheFetc
b580: 68 28 29 20 77 69 74 68 20 63 72 65 61 74 65 46  h() with createF
b590: 6c 61 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20 66  lag==0 to.  ** f
b5a0: 61 69 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61 74  ail, since no at
b5b0: 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74  tempt to allocat
b5c0: 65 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79  e dynamic memory
b5d0: 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a 20   will be made.. 
b5e0: 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69   */.  (void)sqli
b5f0: 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
b600: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
b610: 70 67 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20  pgno, 0, &p);.  
b620: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
b630: 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61  ** Unless the pa
b640: 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72 2d  ger is in error-
b650: 73 74 61 74 65 2c 20 64 69 73 63 61 72 64 20 61  state, discard a
b660: 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ll in-memory pag
b670: 65 73 2e 20 49 66 0a 2a 2a 20 74 68 65 20 70 61  es. If.** the pa
b680: 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72 2d  ger is in error-
b690: 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73  state, then this
b6a0: 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
b6b0: 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 57 68  ..**.** TODO: Wh
b6c0: 79 20 63 61 6e 20 77 65 20 6e 6f 74 20 72 65 73  y can we not res
b6d0: 65 74 20 74 68 65 20 70 61 67 65 72 20 77 68 69  et the pager whi
b6e0: 6c 65 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  le in error stat
b6f0: 65 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e?.*/.static voi
b700: 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61  d pager_reset(Pa
b710: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
b720: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 70  if( SQLITE_OK==p
b730: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
b740: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61 63  {.    sqlite3Bac
b750: 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65  kupRestart(pPage
b760: 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 20  r->pBackup);.   
b770: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
b780: 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ear(pPager->pPCa
b790: 63 68 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  che);.    pPager
b7a0: 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
b7b0: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
b7c0: 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75  Free all structu
b7d0: 72 65 73 20 69 6e 20 74 68 65 20 50 61 67 65 72  res in the Pager
b7e0: 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72  .aSavepoint[] ar
b7f0: 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68  ray and set both
b800: 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70  .** Pager.aSavep
b810: 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e  oint and Pager.n
b820: 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72  Savepoint to zer
b830: 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62  o. Close the sub
b840: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69  -journal.** if i
b850: 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  t is open and th
b860: 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
b870: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
b880: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b890: 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
b8a0: 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61  oints(Pager *pPa
b8b0: 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20  ger){.  int ii; 
b8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b8d0: 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f   Iterator for lo
b8e0: 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61  oping through Pa
b8f0: 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a  ger.aSavepoint *
b900: 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
b910: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
b920: 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
b930: 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
b940: 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61  troy(pPager->aSa
b950: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53  vepoint[ii].pInS
b960: 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20  avepoint);.  }. 
b970: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
b980: 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73  clusiveMode || s
b990: 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e  qlite3IsMemJourn
b9a0: 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  al(pPager->sjfd)
b9b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
b9c0: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73  sClose(pPager->s
b9d0: 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  jfd);.  }.  sqli
b9e0: 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
b9f0: 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  >aSavepoint);.  
ba00: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
ba10: 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nt = 0;.  pPager
ba20: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->nSavepoint = 0
ba30: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62  ;.  pPager->nSub
ba40: 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Rec = 0;.}../*.*
ba50: 2a 20 53 65 74 20 74 68 65 20 62 69 74 20 6e 75  * Set the bit nu
ba60: 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65  mber pgno in the
ba70: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
ba80: 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a  pInSavepoint .**
ba90: 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20   bitvecs of all 
baa0: 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
bab0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
bac0: 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a  K if successful.
bad0: 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d  ** or SQLITE_NOM
bae0: 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  EM if a malloc f
baf0: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a  ailure occurs..*
bb00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64  /.static int add
bb10: 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
bb20: 63 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  cs(Pager *pPager
bb30: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
bb40: 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
bb50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
bb60: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
bb70: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
bb80: 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75  K;       /* Resu
bb90: 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f  lt code */..  fo
bba0: 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
bbb0: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
bbc0: 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53  i++){.    PagerS
bbd0: 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70  avepoint *p = &p
bbe0: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
bbf0: 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  t[ii];.    if( p
bc00: 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b  gno<=p->nOrig ){
bc10: 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c  .      rc |= sql
bc20: 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 2d  ite3BitvecSet(p-
bc30: 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70  >pInSavepoint, p
bc40: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74  gno);.      test
bc50: 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
bc60: 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
bc70: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
bc80: 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
bc90: 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
bca0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
bcb0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
bcc0: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 69 73  urn true if this
bcd0: 20 70 61 67 65 72 20 75 73 65 73 20 61 20 77 72   pager uses a wr
bce0: 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 69 6e  ite-ahead log in
bcf0: 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75  stead of the usu
bd00: 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  al.** rollback j
bd10: 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77 69 73  ournal. Otherwis
bd20: 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e  e false..*/.#ifn
bd30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
bd40: 57 41 4c 0a 73 74 61 74 69 63 20 69 6e 74 20 70  WAL.static int p
bd50: 61 67 65 72 55 73 65 57 61 6c 28 50 61 67 65 72  agerUseWal(Pager
bd60: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
bd70: 75 72 6e 20 28 70 50 61 67 65 72 2d 3e 70 57 61  urn (pPager->pWa
bd80: 6c 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  l!=0);.}.#else.#
bd90: 20 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65   define pagerUse
bda0: 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e  Wal(x) 0.# defin
bdb0: 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57  e pagerRollbackW
bdc0: 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65  al(x) 0.# define
bdd0: 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
bde0: 76 2c 77 2c 78 2c 79 2c 7a 29 20 30 0a 23 20 64  v,w,x,y,z) 0.# d
bdf0: 65 66 69 6e 65 20 70 61 67 65 72 4f 70 65 6e 57  efine pagerOpenW
be00: 61 6c 49 66 50 72 65 73 65 6e 74 28 7a 29 20 53  alIfPresent(z) S
be10: 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e  QLITE_OK.# defin
be20: 65 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  e pagerBeginRead
be30: 54 72 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53  Transaction(z) S
be40: 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
be50: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
be60: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
be70: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
be80: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
be90: 20 70 61 67 65 72 0a 2a 2a 20 69 73 20 69 6e 20   pager.** is in 
bea0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
beb0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
bec0: 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
bed0: 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  in error state, 
bee0: 64 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74  discard the cont
bef0: 65 6e 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65 20  ents of .** the 
bf00: 63 61 63 68 65 20 61 6e 64 20 72 65 73 65 74 20  cache and reset 
bf10: 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
bf20: 75 72 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  ure internal sta
bf30: 74 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 0a  te. If there is.
bf40: 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e  ** an open journ
bf50: 61 6c 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  al-file, then th
bf60: 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20 73 68  e next time a sh
bf70: 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74  ared-lock is obt
bf80: 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20  ained.** on the 
bf90: 70 61 67 65 72 20 66 69 6c 65 20 28 62 79 20 74  pager file (by t
bfa0: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
bfb0: 20 70 72 6f 63 65 73 73 29 2c 20 69 74 20 77 69   process), it wi
bfc0: 6c 6c 20 62 65 0a 2a 2a 20 74 72 65 61 74 65 64  ll be.** treated
bfd0: 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   as a hot-journa
bfe0: 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63  l and rolled bac
bff0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
c000: 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50  d pager_unlock(P
c010: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
c020: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
c030: 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
c040: 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
c050: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
c060: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
c070: 2f 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  /..    /* Always
c080: 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e   close the journ
c090: 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f  al file when dro
c0a0: 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  pping the databa
c0b0: 73 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2a 20  se lock..    ** 
c0c0: 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 6f 74 68  Otherwise, anoth
c0d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  er connection wi
c0e0: 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  th journal_mode=
c0f0: 64 65 6c 65 74 65 20 6d 69 67 68 74 0a 20 20 20  delete might.   
c100: 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 66   ** delete the f
c110: 69 6c 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ile out from und
c120: 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  er us..    */.  
c130: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 61    if( pPager->sa
c140: 66 65 4a 72 6e 6c 48 61 6e 64 6c 65 3d 3d 30 20  feJrnlHandle==0 
c150: 0a 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72  .     || (pPager
c160: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
c170: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
c180: 5f 54 52 55 4e 43 41 54 45 20 0a 20 20 20 20 20  _TRUNCATE .     
c190: 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
c1a0: 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
c1b0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
c1c0: 53 54 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ST).    ){.     
c1d0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
c1e0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
c1f0: 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
c200: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
c210: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
c220: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
c230: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
c240: 20 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76     releaseAllSav
c250: 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b  epoints(pPager);
c260: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
c270: 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
c280: 2c 20 73 6f 6d 65 62 6f 64 79 20 65 6c 73 65 20  , somebody else 
c290: 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69 74 2e  might change it.
c2a0: 20 54 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75   The.    ** valu
c2b0: 65 73 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67  es stored in Pag
c2c0: 65 72 2e 64 62 53 69 7a 65 20 65 74 63 2e 20 6d  er.dbSize etc. m
c2d0: 69 67 68 74 20 62 65 63 6f 6d 65 20 69 6e 76 61  ight become inva
c2e0: 6c 69 64 20 69 66 0a 20 20 20 20 2a 2a 20 74 68  lid if.    ** th
c2f0: 69 73 20 68 61 70 70 65 6e 73 2e 20 20 4f 6e 65  is happens.  One
c300: 20 63 61 6e 20 61 72 67 75 65 20 74 68 61 74 20   can argue that 
c310: 74 68 69 73 20 64 6f 65 73 6e 27 74 20 6e 65 65  this doesn't nee
c320: 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 0a  d to be cleared.
c330: 20 20 20 20 2a 2a 20 75 6e 74 69 6c 20 74 68 65      ** until the
c340: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
c350: 63 68 65 63 6b 20 66 61 69 6c 73 20 69 6e 20 50  check fails in P
c360: 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29  agerSharedLock()
c370: 2e 0a 20 20 20 20 2a 2a 20 43 6c 65 61 72 69 6e  ..    ** Clearin
c380: 67 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  g the page size 
c390: 63 61 63 68 65 20 68 65 72 65 20 69 73 20 62 65  cache here is be
c3a0: 69 6e 67 20 63 6f 6e 73 65 72 76 61 74 69 76 65  ing conservative
c3b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
c3c0: 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
c3d0: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70   = 0;..    if( p
c3e0: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
c3f0: 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  r) ){.      sqli
c400: 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
c410: 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
c420: 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  >pWal);.    }els
c430: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73  e{.      rc = os
c440: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
c450: 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
c460: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b   }.    if( rc ){
c470: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
c480: 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20  rrCode = rc;.   
c490: 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28   }.    IOTRACE((
c4a0: 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70  "UNLOCK %p\n", p
c4b0: 50 61 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20  Pager))..    /* 
c4c0: 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  If Pager.errCode
c4d0: 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e   is set, the con
c4e0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
c4f0: 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20  er cache cannot 
c500: 62 65 0a 20 20 20 20 2a 2a 20 74 72 75 73 74 65  be.    ** truste
c510: 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 20  d. Now that the 
c520: 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 75 6e  pager file is un
c530: 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74  locked, the cont
c540: 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ents of the.    
c550: 2a 2a 20 63 61 63 68 65 20 63 61 6e 20 62 65 20  ** cache can be 
c560: 64 69 73 63 61 72 64 65 64 20 61 6e 64 20 74 68  discarded and th
c570: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 73 61 66  e error code saf
c580: 65 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20 20 20  ely cleared..   
c590: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
c5a0: 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
c5b0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
c5c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
c5d0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
c5e0: 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  e = SQLITE_OK;. 
c5f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67       }.      pag
c600: 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
c610: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
c620: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
c630: 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  Done = 0;.    pP
c640: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
c650: 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  GER_UNLOCK;.    
c660: 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
c670: 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ed = 0;.  }.}../
c680: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
c690: 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  on should be cal
c6a0: 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4f 45 52  led when an IOER
c6b0: 52 2c 20 43 4f 52 52 55 50 54 20 6f 72 20 46 55  R, CORRUPT or FU
c6c0: 4c 4c 20 65 72 72 6f 72 0a 2a 2a 20 6d 61 79 20  LL error.** may 
c6d0: 68 61 76 65 20 6f 63 63 75 72 72 65 64 2e 20 54  have occurred. T
c6e0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
c6f0: 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
c700: 6f 20 74 68 65 20 70 61 67 65 72 20 0a 2a 2a 20  o the pager .** 
c710: 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73  structure, the s
c720: 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f 72 2d  econd the error-
c730: 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65  code about to be
c740: 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70   returned by a p
c750: 61 67 65 72 20 0a 2a 2a 20 41 50 49 20 66 75 6e  ager .** API fun
c760: 63 74 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65  ction. The value
c770: 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63   returned is a c
c780: 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e  opy of the secon
c790: 64 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74  d argument .** t
c7a0: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
c7b0: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73   .**.** If the s
c7c0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
c7d0: 73 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  s SQLITE_IOERR, 
c7e0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20  SQLITE_CORRUPT, 
c7f0: 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a  or SQLITE_FULL.*
c800: 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65 63 6f  * the error beco
c810: 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74 2e 20  mes persistent. 
c820: 55 6e 74 69 6c 20 74 68 65 20 70 65 72 73 69 73  Until the persis
c830: 74 65 6e 20 65 72 72 6f 72 20 69 73 20 63 6c 65  ten error is cle
c840: 61 72 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75  ared,.** subsequ
c850: 65 6e 74 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e  ent API calls on
c860: 20 74 68 69 73 20 50 61 67 65 72 20 77 69 6c 6c   this Pager will
c870: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74   immediately ret
c880: 75 72 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a  urn the same .**
c890: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
c8a0: 2a 2a 20 41 20 70 65 72 73 69 73 74 65 6e 74 20  ** A persistent 
c8b0: 65 72 72 6f 72 20 69 6e 64 69 63 61 74 65 73 20  error indicates 
c8c0: 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
c8d0: 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63  s of the pager-c
c8e0: 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20  ache .** cannot 
c8f0: 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73  be trusted. This
c900: 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c   state can be cl
c910: 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74  eared by complet
c920: 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a  ely discarding .
c930: 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ** the contents 
c940: 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
c950: 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  he. If a transac
c960: 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20  tion was active 
c970: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73  when.** the pers
c980: 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63  istent error occ
c990: 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20  urred, then the 
c9a0: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
c9b0: 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20   may need.** to 
c9c0: 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72  be replayed to r
c9d0: 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65  estore the conte
c9e0: 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
c9f0: 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a  ase file (as if.
ca00: 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f 74  ** it were a hot
ca10: 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74  -journal)..*/.st
ca20: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
ca30: 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  rror(Pager *pPag
ca40: 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69  er, int rc){.  i
ca50: 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78  nt rc2 = rc & 0x
ca60: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  ff;.  assert( rc
ca70: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  ==SQLITE_OK || !
ca80: 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
ca90: 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  t(.       pPager
caa0: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
cab0: 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20  E_FULL ||.      
cac0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
cad0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20  ==SQLITE_OK ||. 
cae0: 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65        (pPager->e
caf0: 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d  rrCode & 0xff)==
cb00: 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29  SQLITE_IOERR.  )
cb10: 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c  ;.  if( rc2==SQL
cb20: 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d  ITE_FULL || rc2=
cb30: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b  =SQLITE_IOERR ){
cb40: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
cb50: 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a 20  Code = rc;.  }. 
cb60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
cb70: 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72  *.** Execute a r
cb80: 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61  ollback if a tra
cb90: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
cba0: 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  ve and unlock th
cbb0: 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  e .** database f
cbc0: 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ile. .**.** If t
cbd0: 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72  he pager has alr
cbe0: 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65  eady entered the
cbf0: 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f   error state, do
cc00: 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a   not attempt .**
cc10: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74   the rollback at
cc20: 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74   this time. Inst
cc30: 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63  ead, pager_unloc
cc40: 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54  k() is called. T
cc50: 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61  he.** call to pa
cc60: 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c  ger_unlock() wil
cc70: 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e  l discard all in
cc80: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75  -memory pages, u
cc90: 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74  nlock.** the dat
cca0: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 63  abase file and c
ccb0: 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73  lear the error s
ccc0: 74 61 74 65 2e 20 49 66 20 74 68 69 73 20 6d 65  tate. If this me
ccd0: 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 72  ans that.** ther
cce0: 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  e is a hot-journ
ccf0: 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  al left in the f
cd00: 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20  ile-system, the 
cd10: 6e 65 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  next connection.
cd20: 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73  ** to obtain a s
cd30: 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
cd40: 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d  e pager (which m
cd50: 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20  ay be this one) 
cd60: 77 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74 20  will.** roll it 
cd70: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
cd80: 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74  he pager has not
cd90: 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
cda0: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
cdb0: 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a  , but an IO or.*
cdc0: 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  * malloc error o
cdd0: 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72  ccurs during a r
cde0: 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68  ollback, then th
cdf0: 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63  is will itself c
ce00: 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
ce10: 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
ce20: 65 72 72 6f 72 20 73 74 61 74 65 2e 20 57 68 69  error state. Whi
ce30: 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72  ch will be clear
ce40: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c  ed by the.** cal
ce50: 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
ce60: 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65  k(), as describe
ce70: 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74  d above..*/.stat
ce80: 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
ce90: 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
cea0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
ceb0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
cec0: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
ced0: 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  && pPager->state
cee0: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
cef0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
cf00: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
cf10: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ();.    sqlite3P
cf20: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
cf30: 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ger);.    sqlite
cf40: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
cf50: 28 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f  ();.  }.  pager_
cf60: 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
cf70: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
cf80: 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61  utine ends a tra
cf90: 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e  nsaction. A tran
cfa0: 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c  saction is usual
cfb0: 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20  ly ended by .** 
cfc0: 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20  either a COMMIT 
cfd0: 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70  or a ROLLBACK op
cfe0: 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f  eration. This ro
cff0: 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c  utine may be cal
d000: 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f  led .** after ro
d010: 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d  llback of a hot-
d020: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61  journal, or if a
d030: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
d040: 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20  hile opening.** 
d050: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d060: 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
d070: 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e  very first journ
d080: 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a  al-header of a.*
d090: 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  * database trans
d0a0: 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49  action..** .** I
d0b0: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
d0c0: 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6f  n PAGER_SHARED o
d0d0: 72 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73  r PAGER_UNLOCK s
d0e0: 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
d0f0: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
d100: 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
d110: 6f 70 20 28 72 65 74 75 72 6e 73 20 53 51 4c 49  op (returns SQLI
d120: 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  TE_OK)..**.** Ot
d130: 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74  herwise, any act
d140: 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
d150: 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  re released..**.
d160: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
d170: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20  l file is open, 
d180: 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61  then it is "fina
d190: 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a  lized". Once a j
d1a0: 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20  ournal .** file 
d1b0: 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
d1c0: 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  ed it is not pos
d1d0: 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20  sible to use it 
d1e0: 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a  to roll back a .
d1f0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
d200: 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63  Nor will it be c
d210: 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
d220: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79  a hot-journal by
d230: 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20   this.** or any 
d240: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
d250: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74  onnection. Exact
d260: 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c  ly how a journal
d270: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a   is finalized.**
d280: 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
d290: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70  her or not the p
d2a0: 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
d2b0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
d2c0: 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72  e and.** the cur
d2d0: 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  rent journal-mod
d2e0: 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  e (Pager.journal
d2f0: 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20  Mode value), as 
d300: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
d310: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45   journalMode==ME
d320: 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  MORY.**     Jour
d330: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
d340: 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c  tor is simply cl
d350: 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72  osed. This destr
d360: 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69  oys an .**     i
d370: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
d380: 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
d390: 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a  lMode==TRUNCATE.
d3a0: 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
d3b0: 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
d3c0: 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
d3d0: 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  n size..**.**   
d3e0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
d3f0: 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20  SIST.**     The 
d400: 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f  first 28 bytes o
d410: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
d420: 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54  le are zeroed. T
d430: 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a  his invalidates.
d440: 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74  **     the first
d450: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
d460: 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64  in the file, and
d470: 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72   hence the entir
d480: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
d490: 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69   file. An invali
d4a0: 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  d journal file c
d4b0: 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  annot be rolled 
d4c0: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  back..**.**   jo
d4d0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54  urnalMode==DELET
d4e0: 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75  E.**     The jou
d4f0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  rnal file is clo
d500: 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20  sed and deleted 
d510: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
d520: 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  elete()..**.**  
d530: 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20     If the pager 
d540: 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
d550: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
d560: 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e  is method of fin
d570: 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74  alizing.**     t
d580: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d590: 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49  is never used. I
d5a0: 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a  nstead, if the j
d5b0: 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a  ournalMode is.**
d5c0: 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20       DELETE and 
d5d0: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
d5e0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
d5f0: 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72  the method descr
d600: 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20  ibed under.**   
d610: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
d620: 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69  ERSIST is used i
d630: 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66  nstead..**.** Af
d640: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
d650: 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 69 66  is finalized, if
d660: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d   running in non-
d670: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
d680: 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 6d 6f 76  the.** pager mov
d690: 65 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  es to PAGER_SHAR
d6a0: 45 44 20 73 74 61 74 65 20 28 61 6e 64 20 64 6f  ED state (and do
d6b0: 77 6e 67 72 61 64 65 73 20 74 68 65 20 6c 6f 63  wngrades the loc
d6c0: 6b 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  k on the.** data
d6d0: 62 61 73 65 20 66 69 6c 65 20 61 63 63 6f 72 64  base file accord
d6e0: 69 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ingly)..**.** If
d6f0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
d700: 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
d710: 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 73 20 69  ve mode and is i
d720: 6e 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 73  n PAGER_SYNCED s
d730: 74 61 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76 65  tate,.** it move
d740: 73 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55  s to PAGER_EXCLU
d750: 53 49 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20 61  SIVE. No locks a
d760: 72 65 20 64 6f 77 6e 67 72 61 64 65 64 20 77 68  re downgraded wh
d770: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a 2a  en running in.**
d780: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
d790: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
d7a0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
d7b0: 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  no error occurs.
d7c0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
d7d0: 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e  urs during.** an
d7e0: 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72  y of the IO oper
d7f0: 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69  ations to finali
d800: 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
d810: 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ile or unlock th
d820: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68  e.** database th
d830: 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
d840: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
d850: 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66   to the user. If
d860: 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69   the .** operati
d870: 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  on to finalize t
d880: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d890: 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20  fails, then the 
d8a0: 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72  code still.** tr
d8b0: 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ies to unlock th
d8c0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
d8d0: 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  if not in exclus
d8e0: 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  ive mode. If the
d8f0: 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  .** unlock opera
d900: 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65  tion fails as we
d910: 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ll, then the fir
d920: 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  st error code re
d930: 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  lated.** to the 
d940: 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f  first error enco
d950: 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75  untered (the jou
d960: 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
d970: 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74  n one) is.** ret
d980: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
d990: 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74   int pager_end_t
d9a0: 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
d9b0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61   *pPager, int ha
d9c0: 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  sMaster){.  int 
d9d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
d9e0: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
d9f0: 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  de from journal 
da00: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65  finalization ope
da10: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
da20: 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
da30: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
da40: 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20  de from db file 
da50: 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
da60: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65   */..  if( pPage
da70: 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
da80: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
da90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
daa0: 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 41 6c  .  }.  releaseAl
dab0: 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67  lSavepoints(pPag
dac0: 65 72 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  er);..  assert( 
dad0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
dae0: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  fd) || pPager->p
daf0: 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
db00: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
db10: 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
db20: 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
db30: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
db40: 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a  ..    /* Finaliz
db50: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
db60: 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  le. */.    if( s
db70: 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e  qlite3IsMemJourn
db80: 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  al(pPager->jfd) 
db90: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
dba0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
dbb0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
dbc0: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
dbd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
dbe0: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
dbf0: 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  fd);.    }else i
dc00: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
dc10: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
dc20: 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
dc30: 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  TE ){.      if( 
dc40: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
dc50: 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ff==0 ){.       
dc60: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
dc70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
dc80: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
dc90: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
dca0: 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
dcb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
dcc0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
dcd0: 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
dce0: 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
dcf0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
dd00: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
dd10: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
dd20: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
dd30: 53 54 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ST.      || (pPa
dd40: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
dd50: 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  de && pPager->jo
dd60: 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
dd70: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
dd80: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
dd90: 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48  c = zeroJournalH
dda0: 64 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61  dr(pPager, hasMa
ddb0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70 61 67  ster);.      pag
ddc0: 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
ddd0: 20 72 63 29 3b 0a 20 20 20 20 20 20 70 50 61 67   rc);.      pPag
dde0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
ddf0: 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
de00: 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
de10: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
de20: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
de30: 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65  ranch may be exe
de40: 63 75 74 65 64 20 77 69 74 68 20 50 61 67 65 72  cuted with Pager
de50: 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45  .journalMode==ME
de60: 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a  MORY if.      **
de70: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77   a hot-journal w
de80: 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62  as just rolled b
de90: 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ack. In this cas
dea0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  e the journal.  
deb0: 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75      ** file shou
dec0: 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64  ld be closed and
ded0: 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69   deleted. If thi
dee0: 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69  s connection wri
def0: 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  tes to.      ** 
df00: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
df10: 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f  e, it will do so
df20: 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d   using an in-mem
df30: 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20  ory journal. .  
df40: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
df50: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
df60: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
df70: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
df80: 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  TE .           |
df90: 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
dfa0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
dfb0: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
dfc0: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
dfd0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
dfe0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
dff0: 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
e000: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
e010: 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
e020: 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28  >jfd);.      if(
e030: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
e040: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  le ){.        rc
e050: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
e060: 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
e070: 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
e080: 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l, 0);.      }. 
e090: 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
e0a0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
e0b0: 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
e0c0: 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
e0d0: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
e0e0: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
e0f0: 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  h);.#endif.  }. 
e100: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
e110: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
e120: 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61  nJournal);.  pPa
e130: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
e140: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
e150: 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Rec = 0;.  sqlit
e160: 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
e170: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
e180: 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55  );..  if( pagerU
e190: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
e1a0: 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
e1b0: 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61  e3WalEndWriteTra
e1c0: 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
e1d0: 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65  >pWal);.    asse
e1e0: 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  rt( rc2==SQLITE_
e1f0: 4f 4b 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OK );.    pPager
e200: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
e210: 53 48 41 52 45 44 3b 0a 0a 20 20 20 20 2f 2a 20  SHARED;..    /* 
e220: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
e230: 6e 20 77 61 73 20 69 6e 20 6c 6f 63 6b 69 6e 67  n was in locking
e240: 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
e250: 6d 6f 64 65 20 62 75 74 20 69 73 20 6e 6f 20 6c  mode but is no l
e260: 6f 6e 67 65 72 2c 0a 20 20 20 20 2a 2a 20 64 72  onger,.    ** dr
e270: 6f 70 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  op the EXCLUSIVE
e280: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
e290: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
e2a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
e2b0: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
e2c0: 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65  veMode && sqlite
e2d0: 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
e2e0: 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
e2f0: 30 29 20 29 7b 0a 20 20 20 20 20 20 72 63 32 20  0) ){.      rc2 
e300: 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  = osUnlock(pPage
e310: 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
e320: 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  CK);.    }.  }el
e330: 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  se if( !pPager->
e340: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
e350: 0a 20 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c  .    rc2 = osUnl
e360: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
e370: 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
e380: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
e390: 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
e3a0: 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
e3b0: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
e3c0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
e3d0: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
e3e0: 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20  R_SYNCED ){.    
e3f0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
e400: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
e410: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
e420: 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
e430: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
e440: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
e450: 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b 0a  dbModified = 0;.
e460: 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 74  .  /* TODO: Is t
e470: 68 69 73 20 6f 70 74 69 6d 61 6c 3f 20 57 68 79  his optimal? Why
e480: 20 69 73 20 74 68 65 20 64 62 20 73 69 7a 65 20   is the db size 
e490: 69 6e 76 61 6c 69 64 61 74 65 64 20 68 65 72 65  invalidated here
e4a0: 20 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20   .  ** when the 
e4b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
e4c0: 20 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64 3f 20 2a   not unlocked? *
e4d0: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  /.  pPager->dbOr
e4e0: 69 67 53 69 7a 65 20 3d 20 30 3b 0a 20 20 73 71  igSize = 0;.  sq
e4f0: 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63  lite3PcacheTrunc
e500: 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ate(pPager->pPCa
e510: 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  che, pPager->dbS
e520: 69 7a 65 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d  ize);.  if( !MEM
e530: 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  DB ){.    pPager
e540: 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
e550: 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  0;.  }..  return
e560: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f   (rc==SQLITE_OK?
e570: 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rc2:rc);.}../*.*
e580: 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74  * Parameter aDat
e590: 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  a must point to 
e5a0: 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67  a buffer of pPag
e5b0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
e5c0: 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43  es.** of data. C
e5d0: 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
e5e0: 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73  n a checksum bas
e5f0: 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65  ed ont the conte
e600: 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  nts of the .** p
e610: 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20  age of data and 
e620: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
e630: 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73  e of pPager->cks
e640: 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  umInit..**.** Th
e650: 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c  is is not a real
e660: 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73   checksum. It is
e670: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65   really just the
e680: 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20   sum of the .** 
e690: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76  random initial v
e6a0: 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b  alue (pPager->ck
e6b0: 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65  sumInit) and eve
e6c0: 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a  ry 200th byte.**
e6d0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
e6e0: 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  a, starting with
e6f0: 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50   byte offset (pP
e700: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32  ager->pageSize%2
e710: 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74  00)..** Each byt
e720: 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  e is interpreted
e730: 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73   as an 8-bit uns
e740: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a  igned integer..*
e750: 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68  *.** Changing th
e760: 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74  e formula used t
e770: 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63  o compute this c
e780: 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20  hecksum results 
e790: 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61  in an.** incompa
e7a0: 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69  tible journal fi
e7b0: 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  le format..**.**
e7c0: 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72   If journal corr
e7d0: 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75  uption occurs du
e7e0: 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69  e to a power fai
e7f0: 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c  lure, the most l
e800: 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72  ikely .** scenar
e810: 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  io is that one e
e820: 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
e830: 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
e840: 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a  ll be changed. .
e850: 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65  ** It is much le
e860: 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
e870: 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
e880: 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
e890: 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
e8a0: 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
e8b0: 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
e8c0: 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
e8d0: 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
e8e0: 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
e8f0: 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
e900: 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
e910: 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
e920: 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
e930: 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75  c u32 pager_cksu
e940: 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  m(Pager *pPager,
e950: 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
e960: 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
e970: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
e980: 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  it;         /* C
e990: 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f  hecksum value to
e9a0: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
e9b0: 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67   i = pPager->pag
e9c0: 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20  eSize-200;      
e9d0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
e9e0: 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ter */.  while( 
e9f0: 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
ea00: 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
ea10: 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
ea20: 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
ea30: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
ea40: 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
ea50: 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72   either the jour
ea60: 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d  nal file (if isM
ea70: 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a  ainJrnl==1) or.*
ea80: 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  * from the sub-j
ea90: 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69  ournal (if isMai
eaa0: 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c  nJrnl==0) and pl
eab0: 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67 65  ayback that page
eac0: 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65  ..** The page be
ead0: 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a  gins at offset *
eae0: 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65  pOffset into the
eaf0: 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66   file. The *pOff
eb00: 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20  set.** value is 
eb10: 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65  increased to the
eb20: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65   start of the ne
eb30: 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a  xt page in the j
eb40: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
eb50: 65 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 66 6c 61  e isMainJrnl fla
eb60: 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 69  g is true if thi
eb70: 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 72 6f  s is the main ro
eb80: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
eb90: 6e 64 0a 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20  nd.** false for 
eba0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
ebb0: 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 69 6e  urnal.  The main
ebc0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
ebd0: 6c 20 75 73 65 73 0a 2a 2a 20 63 68 65 63 6b 73  l uses.** checks
ebe0: 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d  ums - the statem
ebf0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  ent journal does
ec00: 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   not..**.** If t
ec10: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
ec20: 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72  f the page recor
ec30: 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  d read from the 
ec40: 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
ec50: 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  le.** is greater
ec60: 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
ec70: 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  t value of Pager
ec80: 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c  .dbSize, then pl
ec90: 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69  ayback is.** ski
eca0: 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  pped and SQLITE_
ecb0: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
ecc0: 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69  **.** If pDone i
ecd0: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
ece0: 20 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20   it is a record 
ecf0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61  of pages that ha
ed00: 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  ve already.** be
ed10: 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  en played back. 
ed20: 20 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20   If the page at 
ed30: 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72  *pOffset has alr
ed40: 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64  eady been played
ed50: 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65   back.** (if the
ed60: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70   corresponding p
ed70: 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29  Done bit is set)
ed80: 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70   then skip the p
ed90: 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65  layback..** Make
eda0: 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20   sure the pDone 
edb0: 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
edc0: 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65  g to the *pOffse
edd0: 74 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a  t page is set.**
ede0: 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e   prior to return
edf0: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ing..**.** If th
ee00: 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73  e page record is
ee10: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
ee20: 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
ee30: 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
ee40: 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63  * and played bac
ee50: 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  k, then SQLITE_O
ee60: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
ee70: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
ee80: 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65  curs.** while re
ee90: 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64  ading the record
eea0: 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
eeb0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
eec0: 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a  while writing.**
eed0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
eee0: 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20   file, then the 
eef0: 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
ef00: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61   returned. If da
ef10: 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73  ta.** is success
ef20: 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  fully read from 
ef30: 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
ef40: 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61  l file but appea
ef50: 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72  rs to be.** corr
ef60: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
ef70: 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
ef80: 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72  Data is consider
ef90: 65 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a  ed corrupted in.
efa0: 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61  ** two circumsta
efb0: 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a  nces:.** .**   *
efc0: 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70   If the record p
efd0: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c  age-number is il
efe0: 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45  legal (0 or PAGE
eff0: 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a  R_MJ_PGNO), or.*
f000: 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63  *   * If the rec
f010: 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ord is being rol
f020: 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  led back from th
f030: 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
f040: 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ile.**     and t
f050: 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c  he checksum fiel
f060: 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  d does not match
f070: 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74   the record cont
f080: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68  ent..**.** Neith
f090: 65 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20  er of these two 
f0a0: 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f  scenarios are po
f0b0: 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20  ssible during a 
f0c0: 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
f0d0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ck..**.** If thi
f0e0: 73 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  s is a savepoint
f0f0: 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
f100: 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20  memory may have 
f110: 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
f120: 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  y.** allocated b
f130: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
f140: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
f150: 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f  case and an allo
f160: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a  cation fails,.**
f170: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
f180: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
f190: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
f1a0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
f1b0: 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
f1c0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
f1d0: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62    /* The pager b
f1e0: 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b  eing played back
f1f0: 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73   */.  i64 *pOffs
f200: 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  et,             
f210: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
f220: 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62   record to playb
f230: 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ack */.  Bitvec 
f240: 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20  *pDone,         
f250: 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
f260: 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
f270: 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f  y played back */
f280: 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e  .  int isMainJrn
f290: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
f2a0: 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f   /* 1 -> main jo
f2b0: 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d  urnal. 0 -> sub-
f2c0: 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e  journal. */.  in
f2d0: 74 20 69 73 53 61 76 65 70 6e 74 20 20 20 20 20  t isSavepnt     
f2e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f2f0: 72 75 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f  rue for a savepo
f300: 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  int rollback */.
f310: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
f320: 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20  gHdr *pPg;      
f330: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f340: 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65  An existing page
f350: 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f   in the cache */
f360: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
f370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f380: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
f390: 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ber of a page in
f3a0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
f3b0: 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
f3c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
f3d0: 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72  hecksum used for
f3e0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
f3f0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74   */.  char *aDat
f400: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
f410: 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
f420: 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65   storage for the
f430: 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74   page */.  sqlit
f440: 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20  e3_file *jfd;   
f450: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
f460: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
f470: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
f480: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  file */.  int is
f490: 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20  Synced;         
f4a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
f4b0: 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  if journal page 
f4c0: 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20  is synced */..  
f4d0: 61 73 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a  assert( (isMainJ
f4e0: 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20  rnl&~1)==0 );   
f4f0: 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c     /* isMainJrnl
f500: 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20   is 0 or 1 */.  
f510: 61 73 73 65 72 74 28 20 28 69 73 53 61 76 65 70  assert( (isSavep
f520: 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20  nt&~1)==0 );    
f530: 20 20 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20     /* isSavepnt 
f540: 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61  is 0 or 1 */.  a
f550: 73 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e  ssert( isMainJrn
f560: 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20  l || pDone );   
f570: 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79    /* pDone alway
f580: 73 20 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f  s used on sub-jo
f590: 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65  urnals */.  asse
f5a0: 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c  rt( isSavepnt ||
f5b0: 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f   pDone==0 );   /
f5c0: 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73  * pDone never us
f5d0: 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f  ed on non-savepo
f5e0: 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20  int */..  aData 
f5f0: 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
f600: 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61  ace;.  assert( a
f610: 44 61 74 61 20 29 3b 20 20 20 20 20 20 20 20 20  Data );         
f620: 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
f630: 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64  must have alread
f640: 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
f650: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61   */.  assert( pa
f660: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
f670: 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e  )==0 || (!isMain
f680: 4a 72 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e  Jrnl && isSavepn
f690: 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  t) );..  /* Read
f6a0: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
f6b0: 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66   and page data f
f6c0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
f6d0: 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20  or sub-journal. 
f6e0: 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e   ** file. Return
f6f0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
f700: 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20  o the caller if 
f710: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
f720: 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d  rs..  */.  jfd =
f730: 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50   isMainJrnl ? pP
f740: 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67  ager->jfd : pPag
f750: 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d  er->sjfd;.  rc =
f760: 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
f770: 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f   *pOffset, &pgno
f780: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
f790: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
f7a0: 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
f7b0: 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75  e3OsRead(jfd, (u
f7c0: 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72  8*)aData, pPager
f7d0: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f  ->pageSize, (*pO
f7e0: 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28  ffset)+4);.  if(
f7f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f800: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
f810: 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72  Offset += pPager
f820: 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b  ->pageSize + 4 +
f830: 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a   isMainJrnl*4;..
f840: 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
f850: 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
f860: 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
f870: 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49  important that I
f880: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
f890: 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20   thought.  If a 
f8a0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
f8b0: 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a  curs while the j
f8c0: 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
f8d0: 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74  written,.  ** it
f8e0: 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76   could cause inv
f8f0: 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20  alid data to be 
f900: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
f910: 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65   journal.  We ne
f920: 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63  ed to.  ** detec
f930: 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64  t this invalid d
f940: 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70  ata (with high p
f950: 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20  robability) and 
f960: 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a  ignore it..  */.
f970: 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c    if( pgno==0 ||
f980: 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
f990: 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
f9a0: 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53      assert( !isS
f9b0: 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65  avepnt );.    re
f9c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
f9d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
f9e0: 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64  >(Pgno)pPager->d
f9f0: 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33  bSize || sqlite3
fa00: 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65  BitvecTest(pDone
fa10: 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72  , pgno) ){.    r
fa20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fa30: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69  .  }.  if( isMai
fa40: 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20  nJrnl ){.    rc 
fa50: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
fa60: 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20  , (*pOffset)-4, 
fa70: 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
fa80: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
fa90: 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65  .    if( !isSave
faa0: 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73  pnt && pager_cks
fab0: 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
fac0: 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
fad0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
fae0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
faf0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 44 6f 6e  .  }..  if( pDon
fb00: 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74  e && (rc = sqlit
fb10: 65 33 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e  e3BitvecSet(pDon
fb20: 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54  e, pgno))!=SQLIT
fb30: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
fb40: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73  rn rc;.  }..  as
fb50: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
fb60: 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
fb70: 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  VED || pPager->s
fb80: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
fb90: 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  USIVE );..  /* I
fba0: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
fbb0: 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  n RESERVED state
fbc0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
fbd0: 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
fbe0: 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
fbf0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
fc00: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
fc10: 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
fc20: 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
fc30: 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
fc40: 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
fc50: 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
fc60: 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
fc70: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  se..  **.  ** An
fc80: 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
fc90: 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66  e above rule: If
fca0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
fcb0: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
fcc0: 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65  .  ** and a page
fcd0: 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67   is moved during
fce0: 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
fcf0: 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20  vacuum then the 
fd00: 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f  page may.  ** no
fd10: 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65  t be in the page
fd20: 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20  r cache. Later: 
fd30: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  if a malloc() or
fd40: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
fd50: 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d  .  ** during a M
fd60: 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20  ovepage() call, 
fd70: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
fd80: 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  y not be in the 
fd90: 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65  cache.  ** eithe
fda0: 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74  r. So the condit
fdb0: 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e  ion described in
fdc0: 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67   the above parag
fdd0: 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  raph is not.  **
fde0: 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20   assert()able.. 
fdf0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45   **.  ** If in E
fe00: 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20  XCLUSIVE state, 
fe10: 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
fe20: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69  he pager cache i
fe30: 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a  f it exists.  **
fe40: 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
fe50: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
fe60: 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20  then marked not 
fe70: 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dirty..  **.  **
fe80: 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20   Ticket #1171:  
fe90: 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  The statement jo
fea0: 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
feb0: 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ain page content
fec0: 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69   that is.  ** di
fed0: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
fee0: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74   page content at
fef0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
ff00: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
ff10: 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20   ** This occurs 
ff20: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63  when a page is c
ff30: 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20  hanged prior to 
ff40: 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73  the start of a s
ff50: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
ff60: 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e  en changed again
ff70: 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
ff80: 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c  ement.  When rol
ff90: 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61  ling back such a
ffa0: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
ffb0: 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74  we must not writ
ffc0: 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  e to the origina
ffd0: 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73  l database unles
ffe0: 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66  s we know.  ** f
fff0: 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  or certain that 
10000 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
10010 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65  ntents are synce
10020 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  d into the main 
10030 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
10040 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73  urnal.  Otherwis
10050 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  e, a power loss 
10060 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69  might leave modi
10070 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65  fied data in the
10080 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
10090 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65  ile without an e
100a0 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c  ntry in the roll
100b0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61  back journal tha
100c0 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f  t can.  ** resto
100d0 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
100e0 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
100f0 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69  form.  Two condi
10100 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20  tions must be.  
10110 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72  ** met before wr
10120 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
10130 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29  abase files. (1)
10140 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
10150 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65  st be.  ** locke
10160 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20  d.  (2) we know 
10170 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
10180 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  l page content i
10190 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20  s fully synced. 
101a0 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   ** in the main 
101b0 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62  journal either b
101c0 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
101d0 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
101e0 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65  or else.  ** the
101f0 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
10200 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a  as needSync==0..
10210 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30    **.  ** 2008-0
10220 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65  4-14:  When atte
10230 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d  mpting to vacuum
10240 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
10250 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a  ase file, it.  *
10260 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  * is possible to
10270 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e   fail a statemen
10280 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20  t on a database 
10290 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65  that does not ye
102a0 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f  t exist..  ** Do
102b0 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
102c0 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73  write if databas
102d0 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72  e file has never
102e0 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20   been opened..  
102f0 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  */.  if( pagerUs
10300 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
10310 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d      pPg = 0;.  }
10320 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 20 3d 20  else{.    pPg = 
10330 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
10340 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  ger, pgno);.  }.
10350 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c    assert( pPg ||
10360 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 50 41 47   !MEMDB );.  PAG
10370 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42 41  ERTRACE(("PLAYBA
10380 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CK %d page %d ha
10390 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a  sh(%08x) %s\n",.
103a0 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
103b0 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
103c0 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  , pager_datahash
103d0 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
103e0 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a  e, (u8*)aData),.
103f0 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d 61             (isMa
10400 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75  inJrnl?"main-jou
10410 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e  rnal":"sub-journ
10420 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28  al").  ));.  if(
10430 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20   isMainJrnl ){. 
10440 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50     isSynced = pP
10450 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20  ager->noSync || 
10460 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61  (*pOffset <= pPa
10470 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
10480 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
10490 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d  sSynced = (pPg==
104a0 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c  0 || 0==(pPg->fl
104b0 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44  ags & PGHDR_NEED
104c0 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69  _SYNC));.  }.  i
104d0 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74  f( (pPager->stat
104e0 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
104f0 56 45 29 0a 20 20 20 26 26 20 69 73 4f 70 65 6e  VE).   && isOpen
10500 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20  (pPager->fd).   
10510 26 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b  && isSynced.  ){
10520 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20  .    i64 ofst = 
10530 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
10540 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
10550 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69      testcase( !i
10560 73 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21  sSavepnt && pPg!
10570 3d 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67  =0 && (pPg->flag
10580 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
10590 43 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  C)!=0 );.    ass
105a0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
105b0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
105c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
105d0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
105e0 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61   (u8*)aData, pPa
105f0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
10600 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67  fst);.    if( pg
10610 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
10620 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  eSize ){.      p
10630 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
10640 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a  e = pgno;.    }.
10650 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
10660 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20  pBackup ){.     
10670 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
10680 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  aData, pgno, 3, 
10690 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  rc=SQLITE_NOMEM)
106a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
106b0 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
106c0 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
106d0 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a  o, (u8*)aData);.
106e0 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
106f0 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
10700 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 7, rc=SQLITE_N
10710 4f 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20  OMEM, aData);.  
10720 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
10730 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70  !isMainJrnl && p
10740 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
10750 49 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c  If this is a rol
10760 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70  lback of a savep
10770 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61  oint and data wa
10780 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f  s not written to
10790 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
107a0 62 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67  base and the pag
107b0 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f  e is not in-memo
107c0 72 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70  ry, there is a p
107d0 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20  otential.    ** 
107e0 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68  problem. When th
107f0 65 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66  e page is next f
10800 65 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d  etched by the b-
10810 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a  tree layer, it .
10820 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72      ** will be r
10830 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
10840 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63  abase file, whic
10850 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  h may or may not
10860 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72   be .    ** curr
10870 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ent. .    **.   
10880 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20   ** There are a 
10890 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72  couple of differ
108a0 65 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61  ent ways this ca
108b0 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72  n happen. All ar
108c0 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f  e quite.    ** o
108d0 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e  bscure. When run
108e0 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e  ning in synchron
108f0 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63  ous mode, this c
10900 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a  an only happen .
10910 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61      ** if the pa
10920 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65  ge is on the fre
10930 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74  e-list at the st
10940 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
10950 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  action, then.   
10960 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74   ** populated, t
10970 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20  hen moved using 
10980 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
10990 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  page()..    **. 
109a0 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69     ** The soluti
109b0 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20  on is to add an 
109c0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74  in-memory page t
109d0 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  o the cache cont
109e0 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  aining.    ** th
109f0 65 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64  e data just read
10a00 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
10a10 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20  urnal. Mark the 
10a20 70 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20  page as dirty . 
10a30 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65     ** and if the
10a40 20 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20   pager requires 
10a50 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20  a journal-sync, 
10a60 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61  then mark the pa
10a70 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65  ge as .    ** re
10a80 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61  quiring a journa
10a90 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74  l-sync before it
10aa0 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20   is written..   
10ab0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
10ac0 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20  isSavepnt );.   
10ad0 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74   if( (rc = sqlit
10ae0 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70  e3PagerAcquire(p
10af0 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50  Pager, pgno, &pP
10b00 67 2c 20 31 29 29 21 3d 53 51 4c 49 54 45 5f 4f  g, 1))!=SQLITE_O
10b10 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
10b20 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
10b30 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50  pPg->flags &= ~P
10b40 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a  GHDR_NEED_READ;.
10b50 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
10b60 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b  eMakeDirty(pPg);
10b70 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29  .  }.  if( pPg )
10b80 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65  {.    /* No page
10b90 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20   should ever be 
10ba0 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65  explicitly rolle
10bb0 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69  d back that is i
10bc0 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20  n use, except.  
10bd0 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20    ** for page 1 
10be0 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e  which is held in
10bf0 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f   use in order to
10c00 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f   keep the lock o
10c10 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
10c20 61 62 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f  abase active. Ho
10c30 77 65 76 65 72 20 73 75 63 68 20 61 20 70 61 67  wever such a pag
10c40 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20  e may be rolled 
10c50 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
10c60 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e  .    ** of an in
10c70 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73  ternal error res
10c80 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74  ulting in an aut
10c90 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20  omatic call to. 
10ca0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67     ** sqlite3Pag
10cb0 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20  erRollback()..  
10cc0 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70    */.    void *p
10cd0 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74 61 20  Data;.    pData 
10ce0 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
10cf0 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20    memcpy(pData, 
10d00 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67  (u8*)aData, pPag
10d10 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
10d20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
10d30 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 69  iter(pPg);.    i
10d40 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26  f( isMainJrnl &&
10d50 20 28 21 69 73 53 61 76 65 70 6e 74 20 7c 7c 20   (!isSavepnt || 
10d60 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61 67 65 72  *pOffset<=pPager
10d70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b  ->journalHdr) ){
10d80 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
10d90 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69   contents of thi
10da0 73 20 70 61 67 65 20 77 65 72 65 20 6a 75 73 74  s page were just
10db0 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 74   restored from t
10dc0 68 65 20 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a  he main .      *
10dd0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  * journal file, 
10de0 74 68 65 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74  then its content
10df0 20 6d 75 73 74 20 62 65 20 61 73 20 74 68 65 79   must be as they
10e00 20 77 65 72 65 20 77 68 65 6e 20 74 68 65 20 0a   were when the .
10e10 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
10e20 74 69 6f 6e 20 77 61 73 20 66 69 72 73 74 20 6f  tion was first o
10e30 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63  pened. In this c
10e40 61 73 65 20 77 65 20 63 61 6e 20 6d 61 72 6b 20  ase we can mark 
10e50 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a  the page.      *
10e60 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63  * as clean, sinc
10e70 65 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65 20  e there will be 
10e80 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65  no need to write
10e90 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65 0a 20   it out to the. 
10ea0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
10eb0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
10ec0 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65   ** There is one
10ed0 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
10ee0 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68 65 20  is rule. If the 
10ef0 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 72 6f  page is being ro
10f00 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61  lled.      ** ba
10f10 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  ck as part of a 
10f20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20 73 74  savepoint (or st
10f30 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62 61 63  atement) rollbac
10f40 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20 20 20  k from an .     
10f50 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70 6f 72   ** unsynced por
10f60 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61 69 6e  tion of the main
10f70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
10f80 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 73 61  hen it is not sa
10f90 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d  fe.      ** to m
10fa0 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
10fb0 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73 20 62  clean. This is b
10fc0 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67 20 74  ecause marking t
10fd0 68 65 20 70 61 67 65 20 61 73 0a 20 20 20 20 20  he page as.     
10fe0 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20 63   ** clean will c
10ff0 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e  lear the PGHDR_N
11000 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20 53  EED_SYNC flag. S
11010 69 6e 63 65 20 74 68 65 20 70 61 67 65 20 69 73  ince the page is
11020 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  .      ** alread
11030 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
11040 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65 64 20   file (recorded 
11050 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  in Pager.pInJour
11060 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20 20 2a  nal) and.      *
11070 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  * the PGHDR_NEED
11080 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 63 6c  _SYNC flag is cl
11090 65 61 72 65 64 2c 20 69 66 20 74 68 65 20 70 61  eared, if the pa
110a0 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ge is written to
110b0 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20  .      ** again 
110c0 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e  within this tran
110d0 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c  saction, it will
110e0 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69   be marked as di
110f0 72 74 79 20 62 75 74 0a 20 20 20 20 20 20 2a 2a  rty but.      **
11100 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
11110 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c 20 6e  SYNC flag will n
11120 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20 63 6f  ot be set. It co
11130 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e 74 69  uld then potenti
11140 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 62 65  ally.      ** be
11150 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69 6e 74   written out int
11160 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
11170 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73 20 6a  ile before its j
11180 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20  ournal file.    
11190 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73 20    ** segment is 
111a0 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63 72 61  synced. If a cra
111b0 73 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  sh occurs during
111c0 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68   or following th
111d0 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  is,.      ** dat
111e0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
111f0 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20 20 20   may ensue..    
11200 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
11210 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
11220 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
11230 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
11240 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
11250 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
11260 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
11270 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
11280 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
11290 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
112a0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
112b0 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65   page 1, then re
112c0 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
112d0 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
112e0 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74  ers..    ** Do t
112f0 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64  his before any d
11300 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  ecoding. */.    
11310 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
11320 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
11330 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
11340 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32   &((u8*)pData)[2
11350 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72  4],sizeof(pPager
11360 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
11370 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
11380 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75  code the page ju
11390 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  st read from dis
113a0 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28  k */.    CODEC1(
113b0 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
113c0 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d  Pg->pgno, 3, rc=
113d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
113e0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
113f0 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
11400 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
11410 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
11420 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
11430 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
11440 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
11450 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
11460 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
11470 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
11480 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
11490 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
114a0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
114b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
114c0 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
114d0 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
114e0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
114f0 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
11500 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
11510 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
11520 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69   zMaster may poi
11530 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70  nt to Pager.pTmp
11540 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62  Space. So that b
11550 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a  uffer is not .**
11560 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
11570 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  se within this f
11580 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57  unction..**.** W
11590 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  hen a master jou
115a0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65  rnal file is cre
115b0 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75  ated, it is popu
115c0 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  lated with the n
115d0 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ames .** of all 
115e0 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75  of its child jou
115f0 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72  rnals, one after
11600 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74   another, format
11610 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a  ted as utf-8 .**
11620 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54   encoded text. T
11630 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63  he end of each c
11640 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild journal fil
11650 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  e is marked with
11660 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69   a .** nul-termi
11670 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30  nator byte (0x00
11680 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69  ). i.e. the enti
11690 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  re contents of a
116a0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
116b0 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72  ** file for a tr
116c0 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76  ansaction involv
116d0 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65  ing two database
116e0 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a  s might be:.**.*
116f0 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  *   "/home/bill/
11700 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  a.db-journal\x00
11710 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d  /home/bill/b.db-
11720 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a  journal\x00".**.
11730 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72  ** A master jour
11740 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c  nal file may onl
11750 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63  y be deleted onc
11760 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  e all of its chi
11770 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20  ld .** journals 
11780 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64  have been rolled
11790 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
117a0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73  s function reads
117b0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
117c0 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
117d0 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a  nal file into .*
117e0 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f  * memory and loo
117f0 70 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  ps through each 
11800 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  of the child jou
11810 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a  rnal names. For.
11820 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  ** each child jo
11830 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73  urnal, it checks
11840 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69   if:.**.**   * i
11850 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
11860 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20  nal exists, and 
11870 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20  if so.**   * if 
11880 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
11890 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66  l contains a ref
118a0 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72  erence to master
118b0 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20   journal .**    
118c0 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a   file zMaster.**
118d0 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a  .** If a child j
118e0 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
118f0 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73  und that matches
11900 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69   both of the cri
11910 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20  teria.** above, 
11920 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
11930 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f  turns without do
11940 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74  ing anything. Ot
11950 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e  herwise, if.** n
11960 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75  o such child jou
11970 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
11980 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20  d, file zMaster 
11990 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a  is deleted from.
119a0 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
119b0 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  em using sqlite3
119c0 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
119d0 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
119e0 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
119f0 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20  ction, an error 
11a00 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
11a10 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
11a20 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d  on allocates mem
11a30 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73  ory by calling s
11a40 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20  qlite3Malloc(). 
11a50 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  If an allocation
11a60 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
11a70 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
11a80 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
11a90 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c  if no IO or mall
11aa0 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63  oc errors .** oc
11ab0 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  cur, SQLITE_OK i
11ac0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
11ad0 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e  * TODO: This fun
11ae0 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
11af0 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f  a single block o
11b00 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64  f memory to load
11b10 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63  .** the entire c
11b20 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
11b30 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11b40 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62  le. This could b
11b50 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66  e.** a couple of
11b60 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f   kilobytes or so
11b70 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c   - potentially l
11b80 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70  arger than the p
11b90 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f  age .** size..*/
11ba0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
11bb0 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65  r_delmaster(Page
11bc0 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
11bd0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
11be0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
11bf0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
11c00 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Vfs;.  int rc;  
11c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
11c30 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
11c40 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f  e *pMaster;    /
11c50 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65  * Malloc'd maste
11c60 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  r-journal file d
11c70 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73  escriptor */.  s
11c80 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f  qlite3_file *pJo
11c90 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c  urnal;   /* Mall
11ca0 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e  oc'd child-journ
11cb0 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
11cc0 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  or */.  char *zM
11cd0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
11ce0 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
11cf0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11d00 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
11d10 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
11d20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
11d30 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11d40 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  le */..  /* Allo
11d50 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 62  cate space for b
11d60 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c  oth the pJournal
11d70 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c   and pMaster fil
11d80 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20  e descriptors.. 
11d90 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75   ** If successfu
11da0 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74  l, open the mast
11db0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
11dc0 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a  for reading..  *
11dd0 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73  /.  pMaster = (s
11de0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71  qlite3_file *)sq
11df0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
11e00 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a  pVfs->szOsFile *
11e10 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20   2);.  pJournal 
11e20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
11e30 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65  *)(((u8 *)pMaste
11e40 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46  r) + pVfs->szOsF
11e50 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61  ile);.  if( !pMa
11e60 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  ster ){.    rc =
11e70 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
11e80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73   }else{.    cons
11e90 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53  t int flags = (S
11ea0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
11eb0 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
11ec0 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b  MASTER_JOURNAL);
11ed0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11ee0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d  3OsOpen(pVfs, zM
11ef0 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20  aster, pMaster, 
11f00 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20  flags, 0);.  }. 
11f10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11f20 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
11f30 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 72 63 20 3d  ter_out;..  rc =
11f40 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
11f50 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61  ze(pMaster, &nMa
11f60 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
11f70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11f80 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
11f90 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e  er_out;..  if( n
11fa0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20  MasterJournal>0 
11fb0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f  ){.    char *zJo
11fc0 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20  urnal;.    char 
11fd0 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b  *zMasterPtr = 0;
11fe0 0a 20 20 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  .    int nMaster
11ff0 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  Ptr = pVfs->mxPa
12000 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f  thname+1;..    /
12010 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
12020 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
12030 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
12040 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
12050 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61     ** sqlite3_ma
12060 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
12070 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
12080 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f  Journal. .    */
12090 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  .    zMasterJour
120a0 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  nal = sqlite3Mal
120b0 6c 6f 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72  loc((int)nMaster
120c0 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65  Journal + nMaste
120d0 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 20 20 69  rPtr + 1);.    i
120e0 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  f( !zMasterJourn
120f0 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
12100 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
12110 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
12120 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ter_out;.    }. 
12130 20 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20     zMasterPtr = 
12140 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b  &zMasterJournal[
12150 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31  nMasterJournal+1
12160 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ];.    rc = sqli
12170 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65  te3OsRead(pMaste
12180 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r, zMasterJourna
12190 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a  l, (int)nMasterJ
121a0 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
121b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
121c0 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
121d0 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7a 4d 61 73  er_out;.    zMas
121e0 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74  terJournal[nMast
121f0 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a  erJournal] = 0;.
12200 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20  .    zJournal = 
12210 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a  zMasterJournal;.
12220 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75      while( (zJou
12230 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72  rnal-zMasterJour
12240 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72  nal)<nMasterJour
12250 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  nal ){.      int
12260 20 65 78 69 73 74 73 3b 0a 20 20 20 20 20 20 72   exists;.      r
12270 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
12280 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e  ess(pVfs, zJourn
12290 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
122a0 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74  S_EXISTS, &exist
122b0 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  s);.      if( rc
122c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
122d0 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
122e0 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
122f0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 78 69   }.      if( exi
12300 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  sts ){.        /
12310 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * One of the jou
12320 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f  rnals pointed to
12330 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a   by the master j
12340 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20  ournal exists.. 
12350 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69         ** Open i
12360 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69  t and check if i
12370 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  t points at the 
12380 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
12390 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  If.        ** so
123a0 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  , return without
123b0 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61   deleting the ma
123c0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
123d0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
123e0 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20        int c;.   
123f0 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d       int flags =
12400 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
12410 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
12420 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
12430 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
12440 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
12450 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f  s, zJournal, pJo
12460 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29  urnal, flags, 0)
12470 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
12480 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
12490 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
124a0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
124b0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
124c0 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
124d0 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c  ournal(pJournal,
124e0 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61   zMasterPtr, nMa
124f0 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20  sterPtr);.      
12500 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
12510 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  (pJournal);.    
12520 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12530 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
12540 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
12550 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
12560 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d  ..        c = zM
12570 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26  asterPtr[0]!=0 &
12580 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72  & strcmp(zMaster
12590 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30  Ptr, zMaster)==0
125a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20  ;.        if( c 
125b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
125c0 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e  We have a match.
125d0 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   Do not delete t
125e0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
125f0 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  l file. */.     
12600 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
12610 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
12620 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
12630 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71   zJournal += (sq
12640 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a  lite3Strlen30(zJ
12650 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20  ournal)+1);.    
12660 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20  }.  }.  .  rc = 
12670 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
12680 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
12690 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75  );..delmaster_ou
126a0 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72  t:.  if( zMaster
126b0 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73  Journal ){.    s
126c0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
126d0 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d  terJournal);.  }
126e0 20 20 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72    .  if( pMaster
126f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
12700 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b  sClose(pMaster);
12710 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
12720 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29  Open(pJournal) )
12730 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
12740 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  free(pMaster);. 
12750 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
12760 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
12770 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
12780 68 61 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c  hange the actual
12790 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
127a0 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69  abase .** file i
127b0 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
127c0 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  m. This only hap
127d0 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74  pens when commit
127e0 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
127f0 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e  on,.** or rollin
12800 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  g back a transac
12810 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20  tion (including 
12820 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68  rolling back a h
12830 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a  ot-journal)..**.
12840 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64  ** If the main d
12850 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
12860 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 61 6e 20  not open, or an 
12870 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
12880 73 20 6e 6f 74 0a 2a 2a 20 68 65 6c 64 2c 20 74  s not.** held, t
12890 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
128a0 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
128b0 73 65 2c 20 74 68 65 20 73 69 7a 65 20 6f 66 20  se, the size of 
128c0 74 68 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63  the file is.** c
128d0 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20  hanged to nPage 
128e0 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61  pages (nPage*pPa
128f0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
12900 74 65 73 29 2e 20 49 66 20 74 68 65 20 66 69 6c  tes). If the fil
12910 65 0a 2a 2a 20 6f 6e 20 64 69 73 6b 20 69 73 20  e.** on disk is 
12920 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72  currently larger
12930 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65   than nPage page
12940 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20  s, then use the 
12950 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65  VFS.** xTruncate
12960 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75  () method to tru
12970 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  ncate it..**.** 
12980 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 6d 69 67  Or, it might mig
12990 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
129a0 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  hat the file on 
129b0 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20  disk is smaller 
129c0 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70  than .** nPage p
129d0 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61  ages. Some opera
129e0 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c  ting system impl
129f0 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20  ementations can 
12a00 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20  get confused if 
12a10 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74  .** you try to t
12a20 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74  runcate a file t
12a30 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74  o some size that
12a40 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
12a50 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  it .** currently
12a60 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74   is, so detect t
12a70 68 69 73 20 63 61 73 65 20 61 6e 64 20 77 72 69  his case and wri
12a80 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f  te a single zero
12a90 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65   byte to .** the
12aa0 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20   end of the new 
12ab0 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  file instead..**
12ac0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
12ad0 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  l, return SQLITE
12ae0 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  _OK. If an IO er
12af0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
12b00 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68   modifying.** th
12b10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
12b20 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
12b30 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
12b40 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
12b50 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61  int pager_trunca
12b60 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
12b70 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
12b80 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12b90 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
12ba0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
12bb0 45 58 43 4c 55 53 49 56 45 20 26 26 20 69 73 4f  EXCLUSIVE && isO
12bc0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
12bd0 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72 65  ){.    i64 curre
12be0 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b  ntSize, newSize;
12bf0 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73  .    /* TODO: Is
12c00 20 69 74 20 73 61 66 65 20 74 6f 20 75 73 65 20   it safe to use 
12c10 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65  Pager.dbFileSize
12c20 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63   here? */.    rc
12c30 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
12c40 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
12c50 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a   &currentSize);.
12c60 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50      newSize = pP
12c70 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
12c80 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69  i64)nPage;.    i
12c90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12ca0 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21   && currentSize!
12cb0 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  =newSize ){.    
12cc0 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a    if( currentSiz
12cd0 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  e>newSize ){.   
12ce0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12cf0 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
12d00 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29  er->fd, newSize)
12d10 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12d20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12d30 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
12d40 72 2d 3e 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65  r->fd, "", 1, ne
12d50 77 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20  wSize-1);.      
12d60 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
12d70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12d80 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
12d90 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  ileSize = nPage;
12da0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12db0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
12dc0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
12dd0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61   value of the Pa
12de0 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
12df0 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ariable for the 
12e00 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62  given.** pager b
12e10 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75  ased on the valu
12e20 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
12e30 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65  e xSectorSize me
12e40 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f  thod.** of the o
12e50 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
12e60 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73 69  e. The sector si
12e70 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ze will be used 
12e80 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65  used .** to dete
12e90 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61  rmine the size a
12ea0 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  nd alignment of 
12eb0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61  journal header a
12ec0 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  nd .** master jo
12ed0 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77  urnal pointers w
12ee0 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f  ithin created jo
12ef0 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  urnal files..**.
12f00 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  ** For temporary
12f10 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65 63   files the effec
12f20 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
12f30 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20 62   is always 512 b
12f40 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ytes..**.** Othe
12f50 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74  rwise, for non-t
12f60 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20  emporary files, 
12f70 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
12f80 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20  ctor size is.** 
12f90 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
12fa0 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
12fb0 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72  rSize() method r
12fc0 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20  ounded up to 32 
12fd0 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73  if.** it is less
12fe0 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75   than 32, or rou
12ff0 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58  nded down to MAX
13000 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20  _SECTOR_SIZE if 
13010 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  it.** is greater
13020 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52   than MAX_SECTOR
13030 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  _SIZE..*/.static
13040 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53   void setSectorS
13050 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
13060 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73  r){.  assert( is
13070 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
13080 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
13090 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 21  File );..  if( !
130a0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
130b0 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f   ){.    /* Secto
130c0 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d  r size doesn't m
130d0 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72  atter for tempor
130e0 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c  ary files. Also,
130f0 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
13100 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65   may not have be
13110 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69  en opened yet, i
13120 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
13130 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a   OsSectorSize().
13140 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c      ** call will
13150 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a   segfault..    *
13160 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
13170 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
13180 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
13190 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a  Pager->fd);.  }.
131a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
131b0 63 74 6f 72 53 69 7a 65 3c 33 32 20 29 7b 0a 20  ctorSize<32 ){. 
131c0 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
131d0 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d  rSize = 512;.  }
131e0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
131f0 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45  ectorSize>MAX_SE
13200 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20  CTOR_SIZE ){.   
13210 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43   assert( MAX_SEC
13220 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b  TOR_SIZE>=512 );
13230 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
13240 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45  torSize = MAX_SE
13250 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d  CTOR_SIZE;.  }.}
13260 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
13270 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
13280 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68   thus restore th
13290 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
132a0 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  to.** the state 
132b0 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65  it was in before
132c0 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69   we started maki
132d0 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a  ng changes.  .**
132e0 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
132f0 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61  file format is a
13300 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a  s follows: .**.*
13310 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70  *  (1)  8 byte p
13320 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f  refix.  A copy o
13330 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  f aJournalMagic[
13340 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79  ]..**  (2)  4 by
13350 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
13360 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
13370 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c  he number of val
13380 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a  id page records.
13390 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20  **       in the 
133a0 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69  journal.  If thi
133b0 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  s value is 0xfff
133c0 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70  fffff, then comp
133d0 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ute the.**      
133e0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
133f0 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
13400 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a   journal size..*
13410 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62  *  (3)  4 byte b
13420 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
13430 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  r which is the i
13440 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72  nitial value for
13450 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73   the .**       s
13460 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a  anity checksum..
13470 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20  **  (4)  4 byte 
13480 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
13490 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
134a0 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65  ages to truncate
134b0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61   the.**       da
134c0 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67  tabase to during
134d0 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20   a rollback..** 
134e0 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67   (5)  4 byte big
134f0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
13500 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63  which is the sec
13510 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68  tor size.  The h
13520 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69  eader.**       i
13530 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  s this many byte
13540 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  s in size..**  (
13550 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  6)  4 byte big-e
13560 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
13570 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20  ich is the page 
13580 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a  size..**  (7)  z
13590 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20  ero padding out 
135a0 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
135b0 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29  or size..**  (8)
135c0 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
135d0 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
135e0 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
135f0 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
13600 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
13610 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
13620 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
13630 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
13640 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
13650 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
13660 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
13670 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
13680 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
13690 68 65 20 66 69 72 73 74 20 37 20 69 74 65 6d 73  he first 7 items
136a0 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
136b0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
136c0 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
136d0 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68 20 69  nce of the 8th i
136e0 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
136f0 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
13700 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
13710 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
13720 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
13730 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
13740 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
13750 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
13760 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
13770 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
13780 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
13790 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
137a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
137b0 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
137c0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
137d0 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
137e0 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
137f0 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
13800 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
13810 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
13820 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13830 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
13840 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
13850 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
13860 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
13870 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
13880 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
13890 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
138a0 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
138b0 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
138c0 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
138d0 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
138e0 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
138f0 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
13900 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
13910 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
13920 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
13930 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
13940 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
13950 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
13960 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
13970 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
13980 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
13990 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
139a0 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
139b0 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
139c0 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
139d0 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
139e0 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
139f0 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
13a00 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
13a10 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
13a20 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
13a30 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
13a40 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
13a50 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
13a60 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
13a70 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
13a80 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
13a90 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
13aa0 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
13ab0 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
13ac0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
13ad0 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
13ae0 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
13af0 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
13b00 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
13b10 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
13b20 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
13b30 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
13b40 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
13b50 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
13b60 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
13b70 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
13b80 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
13b90 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
13ba0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
13bb0 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
13bc0 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
13bd0 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
13be0 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
13bf0 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
13c00 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
13c10 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
13c20 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65  The isHot parame
13c30 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ter indicates th
13c40 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  at we are trying
13c50 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a   to rollback a j
13c60 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d  ournal.** that m
13c70 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f  ight be a hot jo
13c80 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63  urnal.  Or, it c
13c90 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65  ould be that the
13ca0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20   journal is .** 
13cb0 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73  preserved becaus
13cc0 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  e of JOURNALMODE
13cd0 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52  _PERSIST or JOUR
13ce0 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
13cf0 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  ..** If the jour
13d00 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f  nal really is ho
13d10 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67  t, reset the pag
13d20 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72  er cache prior r
13d30 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61  olling.** back a
13d40 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20  ny content.  If 
13d50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d  the journal is m
13d60 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74  erely persistent
13d70 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a  , no reset is.**
13d80 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
13d90 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
13da0 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
13db0 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
13dc0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
13dd0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
13de0 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  Vfs;.  i64 szJ; 
13df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e00 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
13e10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
13e20 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
13e30 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
13e40 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13e50 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
13e60 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
13e70 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
13e80 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
13e90 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
13ea0 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
13eb0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
13ec0 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
13ed0 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
13ee0 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
13ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f00 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
13f10 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
13f20 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  /.  int res = 1;
13f30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13f40 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
13f50 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  y sqlite3OsAcces
13f60 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  s() */.  char *z
13f70 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20  Master = 0;     
13f80 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73    /* Name of mas
13f90 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
13fa0 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74   if any */.  int
13fb0 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b   needPagerReset;
13fc0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
13fd0 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f   reset page prio
13fe0 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20  r to first page 
13ff0 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f  rollback */..  /
14000 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
14010 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
14020 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
14030 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
14040 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
14050 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
14060 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
14070 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
14080 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
14090 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
140a0 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
140b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
140c0 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b  _OK || szJ==0 ){
140d0 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
140e0 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
140f0 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
14100 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
14110 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
14120 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
14130 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
14140 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
14150 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
14160 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
14170 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
14180 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
14190 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
141a0 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
141b0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
141c0 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
141d0 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f  ck..  **.  ** TO
141e0 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20  DO: Technically 
141f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
14200 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73   an error becaus
14210 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61  e it assumes tha
14220 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61  t.  ** buffer Pa
14230 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73  ger.pTmpSpace is
14240 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20   (mxPathname+1) 
14250 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e  bytes or larger.
14260 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20   i.e. that.  ** 
14270 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
14280 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  e >= pPager->pVf
14290 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
142a0 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e  . Using os_unix.
142b0 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e  c,.  **  mxPathn
142c0 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63  ame is 512, whic
142d0 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  h is the same as
142e0 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
142f0 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a  owable value.  *
14300 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a  * for pageSize..
14310 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d    */.  zMaster =
14320 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
14330 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d  ce;.  rc = readM
14340 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
14350 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
14360 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
14370 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
14380 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14390 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
143a0 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ] ){.    rc = sq
143b0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
143c0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
143d0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
143e0 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20  S, &res);.  }.  
143f0 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69  zMaster = 0;.  i
14400 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14410 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20   || !res ){.    
14420 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
14430 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
14440 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
14450 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  .  needPagerRese
14460 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a  t = isHot;..  /*
14470 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69   This loop termi
14480 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65  nates either whe
14490 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  n a readJournalH
144a0 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61  dr() or .  ** pa
144b0 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
144c0 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74  _page() call ret
144d0 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
144e0 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
144f0 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20  .  ** occurs. . 
14500 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29   */.  while( 1 )
14510 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  {.    /* Read th
14520 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
14530 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
14540 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66  ournal file.  If
14550 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a   there are.    *
14560 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  * not enough byt
14570 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a  es left in the j
14580 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
14590 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
145a0 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20  r, or.    ** it 
145b0 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  is corrupted, th
145c0 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73  en a process mus
145d0 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c  t of failed whil
145e0 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
145f0 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
14600 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
14610 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
14620 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
14630 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
14640 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
14650 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52   isHot, szJ, &nR
14660 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20  ec, &mxPg);.    
14670 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14680 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20  K ){ .      if( 
14690 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
146a0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
146b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
146c0 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
146d0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
146e0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
146f0 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  c is 0xffffffff,
14700 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e   then this journ
14710 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62  al was created b
14720 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20  y a process.    
14730 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f  ** working in no
14740 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73  -sync mode. This
14750 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
14760 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
14770 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
14780 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65  consists of page
14790 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  s, there are no 
147a0 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  more journal hea
147b0 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20  ders. Compute.  
147c0 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
147d0 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20  f nRec based on 
147e0 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e  this assumption.
147f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
14800 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
14810 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
14820 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
14830 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
14840 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
14850 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
14860 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41  t)((szJ - JOURNA
14870 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
14880 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
14890 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
148a0 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
148b0 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f  is 0 and this ro
148c0 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74  llback is of a t
148d0 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74  ransaction creat
148e0 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a  ed by this.    *
148f0 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66  * process and if
14900 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e   this is the fin
14910 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
14920 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69   journal, then i
14930 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74  t means.    ** t
14940 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66  hat this part of
14950 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
14960 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75   being filled bu
14970 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
14980 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64  en.    ** synced
14990 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75   to disk.  Compu
149a0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
149b0 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20   pages based on 
149c0 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20  the remaining.  
149d0 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65    ** size of the
149e0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
149f0 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74    ** The third t
14a00 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20  erm of the test 
14a10 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78  was added to fix
14a20 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20   ticket #2565.. 
14a30 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69     ** When rolli
14a40 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f  ng back a hot jo
14a50 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61  urnal, nRec==0 a
14a60 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74  lways means that
14a70 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   the next.    **
14a80 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f   chunk of the jo
14a90 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a  urnal contains z
14aa0 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20  ero pages to be 
14ab0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75  rolled back.  Bu
14ac0 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f  t.    ** when do
14ad0 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61  ing a ROLLBACK a
14ae0 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63  nd the nRec==0 c
14af0 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74  hunk is the last
14b00 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a   chunk in.    **
14b10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74   the journal, it
14b20 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
14b30 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
14b40 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  ntain additional
14b50 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68  .    ** pages th
14b60 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f  at need to be ro
14b70 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68  lled back and th
14b80 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  at the number of
14b90 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73   pages .    ** s
14ba0 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
14bb0 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a  d based on the j
14bc0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65  ournal file size
14bd0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
14be0 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48   nRec==0 && !isH
14bf0 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50  ot &&.        pP
14c00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
14c10 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
14c20 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
14c30 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20  >journalOff ){. 
14c40 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74       nRec = (int
14c50 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
14c60 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a  >journalOff) / J
14c70 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
14c80 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
14c90 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
14ca0 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
14cb0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
14cc0 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65  ournal, truncate
14cd0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
14ce0 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74  base file back t
14cf0 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
14d00 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
14d10 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
14d20 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
14d30 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
14d40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
14d50 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
14d60 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20  er, mxPg);.     
14d70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14d80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
14d90 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
14da0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
14db0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
14dc0 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  mxPg;.    }..   
14dd0 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
14de0 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
14df0 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
14e00 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  ack into the .  
14e10 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
14e20 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63  le and/or page c
14e30 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ache..    */.   
14e40 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63   for(u=0; u<nRec
14e50 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; u++){.      if
14e60 28 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  ( needPagerReset
14e70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
14e80 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
14e90 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50 61 67  .        needPag
14ea0 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20  erReset = 0;.   
14eb0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
14ec0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
14ed0 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 26  ne_page(pPager,&
14ee0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14ef0 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20  ff,0,1,0);.     
14f00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14f10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
14f20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
14f30 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  E ){.          r
14f40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14f50 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
14f60 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
14f70 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  J;.          bre
14f80 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
14f90 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
14fa0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
14fb0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  D ){.          /
14fc0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
14fd0 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61   has been trunca
14fe0 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70  ted, simply stop
14ff0 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20   reading and.   
15000 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
15010 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sing the journal
15020 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68 61 70  . This might hap
15030 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  pen if the journ
15040 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 20  al was.         
15050 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   ** not complete
15060 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73  ly written and s
15070 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61  ynced prior to a
15080 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74   crash.  In that
15090 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
150a0 73 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  se, the database
150b0 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76   should have nev
150c0 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  er been written 
150d0 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
150e0 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20   ** first place 
150f0 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73  so it is OK to s
15100 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68  imply abandon th
15110 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20  e rollback. */. 
15120 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
15130 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
15140 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
15150 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  back;.        }e
15160 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
15170 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62  * If we are unab
15180 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  le to rollback, 
15190 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20  quit and return 
151a0 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20  the error.      
151b0 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68      ** code.  Th
151c0 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
151d0 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
151e0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
151f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
15200 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72   that no further
15210 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f   harm will be do
15220 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 68 65  ne.  Perhaps the
15230 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20 20   next.          
15240 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f  ** process to co
15250 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65  me along will be
15260 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
15270 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  k the database..
15280 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
15290 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
152a0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
152b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
152c0 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
152d0 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28  CHED*/.  assert(
152e0 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62   0 );..end_playb
152f0 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ack:.  /* Follow
15300 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
15310 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15320 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b  e should be back
15330 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   in its original
15340 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f  .  ** state prio
15350 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
15360 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
15370 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65  n, so invoke the
15380 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e  .  ** SQLITE_FCN
15390 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20  TL_DB_UNCHANGED 
153a0 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74  file-control met
153b0 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  hod to disable t
153c0 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f  he.  ** assertio
153d0 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  n that the trans
153e0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
153f0 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a  as modified..  *
15400 2f 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20  /.  assert(.    
15410 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
15420 68 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73  hods==0 ||.    s
15430 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
15440 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 53  rol(pPager->fd,S
15450 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
15460 4e 43 48 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c  NCHANGED,0)>=SQL
15470 49 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f  ITE_OK.  );..  /
15480 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61  * If this playba
15490 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  ck is happening 
154a0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73  automatically as
154b0 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20   a result of an 
154c0 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c  IO or .  ** mall
154d0 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63  oc error that oc
154e0 63 75 72 72 65 64 20 61 66 74 65 72 20 74 68 65  curred after the
154f0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
15500 77 61 73 20 75 70 64 61 74 65 64 20 62 75 74 20  was updated but 
15510 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65  .  ** before the
15520 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
15530 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e   committed, then
15540 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
15550 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69  ter .  ** modifi
15560 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20  cation may just 
15570 68 61 76 65 20 62 65 65 6e 20 72 65 76 65 72 74  have been revert
15580 65 64 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ed. If this happ
15590 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ens in exclusive
155a0 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65   .  ** mode, the
155b0 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74 72 61  n subsequent tra
155c0 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72  nsactions perfor
155d0 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65  med by the conne
155e0 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20  ction will not. 
155f0 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20 63   ** update the c
15600 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74  hange-counter at
15610 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c   all. This may l
15620 65 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63  ead to cache inc
15630 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20  onsistency.  ** 
15640 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68  problems for oth
15650 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 74 20  er processes at 
15660 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
15670 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75  e future. So, ju
15680 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  st.  ** in case 
15690 74 68 69 73 20 68 61 73 20 68 61 70 70 65 6e 65  this has happene
156a0 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68 61  d, clear the cha
156b0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61  ngeCountDone fla
156c0 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50  g now..  */.  pP
156d0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
156e0 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
156f0 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28  tempFile;..  if(
15700 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15710 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  {.    zMaster = 
15720 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
15730 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  e;.    rc = read
15740 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
15750 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
15760 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
15770 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
15780 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
15790 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
157a0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
157b0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
157c0 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26 26 20  r->noSync==0 && 
157d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
157e0 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
157f0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
15800 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
15810 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
15820 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20  c_flags);.  }.  
15830 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15840 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53  K && pPager->noS
15850 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72  ync==0 && pPager
15860 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
15870 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20  XCLUSIVE ){.    
15880 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
15890 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  nc(pPager->fd, p
158a0 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
158b0 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  s);.  }.  if( rc
158c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
158d0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e     rc = pager_en
158e0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
158f0 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d  ager, zMaster[0]
15900 21 3d 27 5c 30 27 29 3b 0a 20 20 20 20 74 65 73  !='\0');.    tes
15910 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
15920 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
15930 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15940 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26  && zMaster[0] &&
15950 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49   res ){.    /* I
15960 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61  f there was a ma
15970 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ster journal and
15980 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
15990 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73  ll return succes
159a0 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66  s,.    ** see if
159b0 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
159c0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
159d0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster journal..  
159e0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
159f0 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50  ger_delmaster(pP
15a00 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
15a10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
15a20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
15a30 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67   }..  /* The Pag
15a40 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61  er.sectorSize va
15a50 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20  riable may have 
15a60 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69  been updated whi
15a70 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20  le rolling.  ** 
15a80 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63  back a journal c
15a90 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
15aa0 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65  ess with a diffe
15ab0 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65  rent sector size
15ac0 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73  .  ** value. Res
15ad0 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72  et it to the cor
15ae0 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74  rect value for t
15af0 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a  his process..  *
15b00 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  /.  setSectorSiz
15b10 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
15b20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
15b30 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65  * Read the conte
15b40 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 20  nt for page pPg 
15b50 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
15b60 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 74  ase file and int
15b70 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61  o .** pPg->pData
15b80 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  . A shared lock 
15b90 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20  or greater must 
15ba0 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
15bb0 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
15bc0 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
15bd0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
15be0 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31 20  **.** If page 1 
15bf0 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74 68  is read, then th
15c00 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  e value of Pager
15c10 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73  .dbFileVers[] is
15c20 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76   set to.** the v
15c30 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
15c40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15c50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
15c60 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
15c70 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
15c80 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
15c90 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f  the caller..** O
15ca0 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
15cb0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
15cc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
15cd0 65 61 64 44 62 50 61 67 65 28 50 67 48 64 72 20  eadDbPage(PgHdr 
15ce0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
15cf0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
15d00 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f  ager; /* Pager o
15d10 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64  bject associated
15d20 20 77 69 74 68 20 70 61 67 65 20 70 50 67 20 2a   with page pPg *
15d30 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  /.  Pgno pgno = 
15d40 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20  pPg->pgno;      
15d50 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
15d60 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74  to read */.  int
15d70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
15d90 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
15da0 74 20 69 73 49 6e 57 61 6c 20 3d 20 30 3b 20 20  t isInWal = 0;  
15db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
15dc0 75 65 20 69 66 20 70 61 67 65 20 69 73 20 69 6e  ue if page is in
15dd0 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 20 20 69   log file */.  i
15de0 6e 74 20 70 67 73 7a 20 3d 20 70 50 61 67 65 72  nt pgsz = pPager
15df0 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e  ->pageSize; /* N
15e00 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
15e10 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73  o read */..  ass
15e20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
15e30 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
15e40 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   && !MEMDB );.  
15e50 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
15e60 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20  Pager->fd) );.. 
15e70 20 69 66 28 20 4e 45 56 45 52 28 21 69 73 4f 70   if( NEVER(!isOp
15e80 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20  en(pPager->fd)) 
15e90 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
15ea0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
15eb0 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50  );.    memset(pP
15ec0 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61  g->pData, 0, pPa
15ed0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
15ee0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15ef0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  E_OK;.  }..  if(
15f00 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
15f10 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ger) ){.    /* T
15f20 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20 70  ry to pull the p
15f30 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72 69  age from the wri
15f40 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f  te-ahead log. */
15f50 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15f60 33 57 61 6c 52 65 61 64 28 70 50 61 67 65 72 2d  3WalRead(pPager-
15f70 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 73  >pWal, pgno, &is
15f80 49 6e 57 61 6c 2c 20 70 67 73 7a 2c 20 70 50 67  InWal, pgsz, pPg
15f90 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20  ->pData);.  }.  
15fa0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15fb0 4b 20 26 26 20 21 69 73 49 6e 57 61 6c 20 29 7b  K && !isInWal ){
15fc0 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74  .    i64 iOffset
15fd0 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
15fe0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
15ff0 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
16000 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
16010 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61  ->fd, pPg->pData
16020 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74 29  , pgsz, iOffset)
16030 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
16040 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
16050 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
16060 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
16070 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
16080 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69  pgno==1 ){.    i
16090 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  f( rc ){.      /
160a0 2a 20 49 66 20 74 68 65 20 72 65 61 64 20 69 73  * If the read is
160b0 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73   unsuccessful, s
160c0 65 74 20 74 68 65 20 64 62 46 69 6c 65 56 65 72  et the dbFileVer
160d0 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  s[] to something
160e0 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
160f0 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76  ill never be a v
16100 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f  alid file versio
16110 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d  n.  dbFileVers[]
16120 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20   is a copy.     
16130 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e   ** of bytes 24.
16140 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62  .39 of the datab
16150 61 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e  ase.  Bytes 28..
16160 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  31 should always
16170 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   be.      ** zer
16180 6f 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66  o or the size of
16190 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
161a0 20 70 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e   page. Bytes 32.
161b0 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20  .35 and 35..39. 
161c0 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62       ** should b
161d0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77  e page numbers w
161e0 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20 30  hich are never 0
161f0 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66  xffffffff.  So f
16200 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  illing.      ** 
16210 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
16220 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78  rs[] with all 0x
16230 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20  ff bytes should 
16240 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a  suffice..      *
16250 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  *.      ** For a
16260 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61  n encrypted data
16270 62 61 73 65 2c 20 74 68 65 20 73 69 74 75 61 74  base, the situat
16280 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70  ion is more comp
16290 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20  lex:  bytes.    
162a0 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74    ** 24..39 of t
162b0 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20  he database are 
162c0 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75  white noise.  Bu
162d0 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  t the probabilit
162e0 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68  y of.      ** wh
162f0 69 74 65 20 6e 6f 69 73 69 6e 67 20 65 71 75 61  ite noising equa
16300 6c 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66  ling 16 bytes of
16310 20 30 78 66 66 20 69 73 20 76 61 6e 69 73 68 69   0xff is vanishi
16320 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20  ngly small so.  
16330 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64      ** we should
16340 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20   still be ok..  
16350 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d      */.      mem
16360 73 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69  set(pPager->dbFi
16370 6c 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69  leVers, 0xff, si
16380 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
16390 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
163a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a  else{.      u8 *
163b0 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28  dbFileVers = &((
163c0 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b  u8*)pPg->pData)[
163d0 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  24];.      memcp
163e0 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
163f0 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72  eVers, dbFileVer
16400 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  s, sizeof(pPager
16410 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
16420 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45      }.  }.  CODE
16430 43 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  C1(pPager, pPg->
16440 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  pData, pgno, 3, 
16450 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
16460 4d 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43  M);..  PAGER_INC
16470 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
16480 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  readdb_count);. 
16490 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
164a0 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f  er->nRead);.  IO
164b0 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20  TRACE(("PGIN %p 
164c0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
164d0 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52  gno));.  PAGERTR
164e0 41 43 45 28 28 22 46 45 54 43 48 20 25 64 20 70  ACE(("FETCH %d p
164f0 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
16500 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
16510 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
16520 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
16530 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
16540 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
16550 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
16560 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
16570 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
16580 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20  is invoked once 
16590 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 74 68  for each page th
165a0 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
165b0 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20  een .** written 
165c0 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c  into the log fil
165d0 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61  e when a WAL tra
165e0 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
165f0 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61  ed back..** Para
16600 6d 65 74 65 72 20 69 50 67 20 69 73 20 74 68 65  meter iPg is the
16610 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
16620 73 61 69 64 20 70 61 67 65 2e 20 54 68 65 20 70  said page. The p
16630 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a  Ctx argument .**
16640 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70   is actually a p
16650 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
16660 67 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ger structure..*
16670 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67  *.** If page iPg
16680 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74   is present in t
16690 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61  he cache, and ha
166a0 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
166b0 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20   references,.** 
166c0 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64 2e  it is discarded.
166d0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
166e0 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20  here are one or 
166f0 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67  more outstanding
16700 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20  .** references, 
16710 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
16720 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f   is reloaded fro
16730 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
16740 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70  If the.** attemp
16750 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74  t to reload cont
16760 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ent from the dat
16770 61 62 61 73 65 20 69 73 20 72 65 71 75 69 72 65  abase is require
16780 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a  d and fails, .**
16790 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
167a0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  e error code. Ot
167b0 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
167c0 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
167d0 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  t pagerUndoCallb
167e0 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20  ack(void *pCtx, 
167f0 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74  Pgno iPg){.  int
16800 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16810 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
16820 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74 78   = (Pager *)pCtx
16830 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
16840 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33  .  pPg = sqlite3
16850 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67  PagerLookup(pPag
16860 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28 20  er, iPg);.  if( 
16870 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73  pPg ){.    if( s
16880 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
16890 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31  Refcount(pPg)==1
168a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
168b0 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
168c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
168d0 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61     rc = readDbPa
168e0 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  ge(pPg);.      i
168f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16900 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
16910 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50  er->xReiniter(pP
16920 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
16930 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
16940 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ref(pPg);.    }.
16950 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
16960 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63  ly, if a transac
16970 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
16980 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20  ack, any backup 
16990 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20  processes are.  
169a0 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20 64 61  ** updated as da
169b0 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74  ta is copied out
169c0 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
169d0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74   journal and int
169e0 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
169f0 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ase. This is not
16a00 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69   generally possi
16a10 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20 64  ble with a WAL d
16a20 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a  atabase, as.  **
16a30 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76   rollback involv
16a40 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61  es simply trunca
16a50 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c  ting the log fil
16a60 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66  e. Therefore, if
16a70 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72   one.  ** or mor
16a80 65 20 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c  e frames have al
16a90 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
16aa0 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61  en to the log (a
16ab0 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20  nd therefore .  
16ac0 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69  ** also copied i
16ad0 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64  nto the backup d
16ae0 61 74 61 62 61 73 65 73 29 20 61 73 20 70 61 72  atabases) as par
16af0 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61  t of this transa
16b00 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20  ction,.  ** the 
16b10 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20  backups must be 
16b20 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a  restarted..  */.
16b30 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
16b40 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
16b50 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75  Backup);..  retu
16b60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16b70 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
16b80 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62   called to rollb
16b90 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
16ba0 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62  n on a WAL datab
16bb0 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
16bc0 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  nt pagerRollback
16bd0 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
16be0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
16bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c00 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
16c10 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  Code */.  PgHdr 
16c20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  *pList;         
16c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
16c40 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
16c50 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20   to revert */.. 
16c60 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65   /* For all page
16c70 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  s in the cache t
16c80 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
16c90 79 20 64 69 72 74 79 20 6f 72 20 68 61 76 65 20  y dirty or have 
16ca0 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65  already.  ** bee
16cb0 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e  n written (but n
16cc0 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f  ot committed) to
16cd0 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64   the log file, d
16ce0 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20  o one of the .  
16cf0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  ** following:.  
16d00 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63  **.  **   + Disc
16d10 61 72 64 20 74 68 65 20 63 61 63 68 65 64 20 70  ard the cached p
16d20 61 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74  age (if refcount
16d30 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20  ==0), or.  **   
16d40 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f  + Reload page co
16d50 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64  ntent from the d
16d60 61 74 61 62 61 73 65 20 28 69 66 20 72 65 66 63  atabase (if refc
16d70 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20  ount>0)..  */.  
16d80 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
16d90 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
16da0 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ize;.  rc = sqli
16db0 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65  te3WalUndo(pPage
16dc0 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e  r->pWal, pagerUn
16dd0 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  doCallback, (voi
16de0 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70  d *)pPager);.  p
16df0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
16e00 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
16e10 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
16e20 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26    while( pList &
16e30 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
16e40 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e  ){.    PgHdr *pN
16e50 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ext = pList->pDi
16e60 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rty;.    rc = pa
16e70 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
16e80 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
16e90 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
16ea0 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
16eb0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
16ec0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
16ed0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77   function is a w
16ee0 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71  rapper around sq
16ef0 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29  lite3WalFrames()
16f00 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67  . As well as log
16f10 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ging.** the cont
16f20 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74  ents of the list
16f30 20 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64   of pages headed
16f40 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65   by pList (conne
16f50 63 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c  cted by pDirty),
16f60 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
16f70 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61  n notifies any a
16f80 63 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f  ctive backup pro
16f90 63 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20  cesses that the 
16fa0 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68  pages have.** ch
16fb0 61 6e 67 65 64 2e 20 0a 2a 2f 20 0a 73 74 61 74  anged. .*/ .stat
16fc0 69 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46  ic int pagerWalF
16fd0 72 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a  rames(.  Pager *
16fe0 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
16ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
17000 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67  r object */.  Pg
17010 48 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  Hdr *pList,     
17020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17030 20 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20   List of frames 
17040 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f  to log */.  Pgno
17050 20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20   nTruncate,     
17060 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
17070 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74  atabase size aft
17080 65 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a  er this commit *
17090 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74  /.  int isCommit
170a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
170b0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
170c0 68 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20  his is a commit 
170d0 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 5f 66 6c  */.  int sync_fl
170e0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
170f0 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f       /* Flags to
17100 20 70 61 73 73 20 74 6f 20 4f 73 53 79 6e 63 28   pass to OsSync(
17110 29 20 28 6f 72 20 30 29 20 2a 2f 0a 29 7b 0a 20  ) (or 0) */.){. 
17120 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
17130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17140 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
17150 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
17160 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20  ager->pWal );.  
17170 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
17180 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57  rames(pPager->pW
17190 61 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65  al, .      pPage
171a0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69  r->pageSize, pLi
171b0 73 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69  st, nTruncate, i
171c0 73 43 6f 6d 6d 69 74 2c 20 73 79 6e 63 5f 66 6c  sCommit, sync_fl
171d0 61 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ags.  );.  if( r
171e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
171f0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
17200 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b  ){.    PgHdr *p;
17210 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  .    for(p=pList
17220 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  ; p; p=p->pDirty
17230 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
17240 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
17250 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d  ger->pBackup, p-
17260 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e  >pgno, (u8 *)p->
17270 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  pData);.    }.  
17280 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
17290 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
172a0 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
172b0 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a   on the WAL..**.
172c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
172d0 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  used to be calle
172e0 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70  d "pagerOpenSnap
172f0 73 68 6f 74 28 29 22 20 62 65 63 61 75 73 65 20  shot()" because 
17300 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a  it essentially.*
17310 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68  * makes a snapsh
17320 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ot of the databa
17330 73 65 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  se at the curren
17340 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20  t point in time 
17350 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a  and preserves.**
17360 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66   that snapshot f
17370 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 72 65  or use by the re
17380 61 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66  ader in spite of
17390 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68   concurrently ch
173a0 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65  anges by.** othe
173b0 72 20 77 72 69 74 65 72 73 20 6f 72 20 63 68 65  r writers or che
173c0 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73  ckpointers..*/.s
173d0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 42  tatic int pagerB
173e0 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
173f0 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
17400 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
17410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17420 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
17430 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68  code */.  int ch
17440 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20  anged = 0;      
17450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
17460 65 20 69 66 20 63 61 63 68 65 20 6d 75 73 74 20  e if cache must 
17470 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61  be reset */..  a
17480 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
17490 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
174a0 20 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c 45 6e   /* sqlite3WalEn
174b0 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  dReadTransaction
174c0 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65  () was not calle
174d0 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  d for the previo
174e0 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  us.  ** transact
174f0 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ion in locking_m
17500 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 2e 20 20  ode=EXCLUSIVE.  
17510 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20  So call it now. 
17520 20 49 66 20 77 65 0a 20 20 2a 2a 20 61 72 65 20   If we.  ** are 
17530 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
17540 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65  NORMAL and EndRe
17550 61 64 28 29 20 77 61 73 20 70 72 65 76 69 6f 75  ad() was previou
17560 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a  sly called,.  **
17570 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63   the duplicate c
17580 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73 73 2e  all is harmless.
17590 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57  .  */.  sqlite3W
175a0 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63  alEndReadTransac
175b0 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
175c0 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  l);..  rc = sqli
175d0 74 65 33 57 61 6c 42 65 67 69 6e 52 65 61 64 54  te3WalBeginReadT
175e0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
175f0 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67 65  r->pWal, &change
17600 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  d);.  if( rc==SQ
17610 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
17620 6e 74 20 64 75 6d 6d 79 3b 0a 20 20 20 20 69 66  nt dummy;.    if
17630 28 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20  ( changed ){.   
17640 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
17650 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
17660 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
17670 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  rCode || pPager-
17680 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20  >dbSizeValid==0 
17690 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
176a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
176b0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
176c0 26 64 75 6d 6d 79 29 3b 0a 20 20 7d 0a 20 20 70  &dummy);.  }.  p
176d0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
176e0 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 0a 20 20  AGER_SHARED;..  
176f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17700 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65  .** Check if the
17710 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74   *-wal file that
17720 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
17730 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  the database ope
17740 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a  ned by pPager.**
17750 20 65 78 69 73 74 73 2e 20 41 73 73 75 6d 69 6e   exists. Assumin
17760 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  g no error occur
17770 73 2c 20 73 65 74 20 2a 70 45 78 69 73 74 73 20  s, set *pExists 
17780 74 6f 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  to 1 if the file
17790 20 65 78 69 73 74 73 2c 0a 2a 2a 20 6f 72 20 30   exists,.** or 0
177a0 20 6f 74 68 65 72 77 69 73 65 20 61 6e 64 20 72   otherwise and r
177b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
177c0 20 49 66 20 61 6e 20 49 4f 20 6f 72 20 4f 4f 4d   If an IO or OOM
177d0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
177e0 65 74 75 72 6e 0a 2a 2a 20 61 6e 20 53 51 4c 69  eturn.** an SQLi
177f0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
17800 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
17810 65 72 48 61 73 57 41 4c 28 50 61 67 65 72 20 2a  erHasWAL(Pager *
17820 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78  pPager, int *pEx
17830 69 73 74 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ists){.  int rc;
17840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17850 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
17860 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61  rn code */.  cha
17870 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20  r *zWal;        
17880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17890 4e 61 6d 65 20 6f 66 20 74 68 65 20 57 41 4c 20  Name of the WAL 
178a0 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  file */..  asser
178b0 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
178c0 46 69 6c 65 20 29 3b 0a 20 20 7a 57 61 6c 20 3d  File );.  zWal =
178d0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
178e0 28 22 25 73 2d 77 61 6c 22 2c 20 70 50 61 67 65  ("%s-wal", pPage
178f0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  r->zFilename);. 
17900 20 69 66 28 20 21 7a 57 61 6c 20 29 7b 0a 20 20   if( !zWal ){.  
17910 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
17920 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
17930 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
17940 41 63 63 65 73 73 28 70 50 61 67 65 72 2d 3e 70  Access(pPager->p
17950 56 66 73 2c 20 7a 57 61 6c 2c 20 53 51 4c 49 54  Vfs, zWal, SQLIT
17960 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
17970 20 70 45 78 69 73 74 73 29 3b 0a 20 20 20 20 73   pExists);.    s
17980 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 61 6c  qlite3_free(zWal
17990 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
179a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  rc;.}../*.** Che
179b0 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20  ck if the *-wal 
179c0 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73  file that corres
179d0 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74  ponds to the dat
179e0 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
179f0 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73  pPager.** exists
17a00 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20 6f 70  . If it does, op
17a10 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 6e 20  en the pager in 
17a20 57 41 4c 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77  WAL mode. Otherw
17a30 69 73 65 2c 20 69 66 20 6e 6f 20 65 72 72 6f 72  ise, if no error
17a40 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65  .** occurs, make
17a50 20 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75 72   sure Pager.jour
17a60 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73  nalMode is not s
17a70 65 74 20 74 6f 20 50 41 47 45 52 5f 4a 4f 55 52  et to PAGER_JOUR
17a80 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 20  NALMODE_WAL..** 
17a90 49 66 20 61 6e 20 49 4f 20 6f 72 20 4f 4f 4d 20  If an IO or OOM 
17aa0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
17ab0 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
17ac0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
17ad0 20 49 66 20 74 68 65 20 57 41 4c 20 66 69 6c 65   If the WAL file
17ae0 20 69 73 20 6f 70 65 6e 65 64 2c 20 61 6c 73 6f   is opened, also
17af0 20 6f 70 65 6e 20 61 20 73 6e 61 70 73 68 6f 74   open a snapshot
17b00 20 28 72 65 61 64 20 74 72 61 6e 73 61 63 74 69   (read transacti
17b10 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  on)..**.** The c
17b20 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20  aller must hold 
17b30 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e  a SHARED lock on
17b40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17b50 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a  le to call this.
17b60 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63  ** function. Bec
17b70 61 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56  ause an EXCLUSIV
17b80 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62  E lock on the db
17b90 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65   file is require
17ba0 64 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20  d to delete .** 
17bb0 61 20 57 41 4c 2c 20 74 68 69 73 20 65 6e 73 75  a WAL, this ensu
17bc0 72 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20  res there is no 
17bd0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 62  race condition b
17be0 65 74 77 65 65 6e 20 74 68 65 20 78 41 63 63 65  etween the xAcce
17bf0 73 73 28 29 20 0a 2a 2a 20 62 65 6c 6f 77 20 61  ss() .** below a
17c00 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29 20  nd an xDelete() 
17c10 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 20 62  being executed b
17c20 79 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e  y some other con
17c30 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  nection..*/.stat
17c40 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e  ic int pagerOpen
17c50 57 61 6c 49 66 50 72 65 73 65 6e 74 28 50 61 67  WalIfPresent(Pag
17c60 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
17c70 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
17c80 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  K;.  if( !pPager
17c90 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
17ca0 20 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20    int isWal;    
17cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cc0 2f 2a 20 54 72 75 65 20 69 66 20 57 41 4c 20 66  /* True if WAL f
17cd0 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ile exists */.  
17ce0 20 20 72 63 20 3d 20 70 61 67 65 72 48 61 73 57    rc = pagerHasW
17cf0 41 4c 28 70 50 61 67 65 72 2c 20 26 69 73 57 61  AL(pPager, &isWa
17d00 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  l);.    if( rc==
17d10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17d20 20 20 20 69 66 28 20 69 73 57 61 6c 20 29 7b 0a     if( isWal ){.
17d30 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
17d40 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
17d50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17d60 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50  3PagerOpenWal(pP
17d70 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
17d80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17d90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
17da0 20 72 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e   rc = pagerBegin
17db0 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
17dc0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
17dd0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
17de0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
17df0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
17e00 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b  URNALMODE_WAL ){
17e10 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
17e20 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
17e30 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
17e40 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d  _DELETE;.      }
17e50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
17e60 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
17e70 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
17e80 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65   savepoint pSave
17e90 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53  point. Or, if pS
17ea0 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20  avepoint==NULL, 
17eb0 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a  then playback.**
17ec0 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74   the entire mast
17ed0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
17ee0 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65 70   The case pSavep
17ef0 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72  oint==NULL occur
17f00 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c  s when .** a ROL
17f10 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64  LBACK TO command
17f20 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61   is invoked on a
17f30 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20   SAVEPOINT that 
17f40 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
17f50 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a   .** savepoint..
17f60 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65  **.** When pSave
17f70 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  point is not NUL
17f80 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e  L (meaning a non
17f90 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76  -transaction sav
17fa0 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65  epoint is .** be
17fb0 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29  ing rolled back)
17fc0 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62  , then the rollb
17fd0 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ack consists of 
17fe0 75 70 20 74 6f 20 74 68 72 65 65 20 73 74 61 67  up to three stag
17ff0 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64  es,.** performed
18000 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70   in the order sp
18010 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  ecified:.**.**  
18020 20 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c 61   * Pages are pla
18030 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
18040 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
18050 74 61 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a  tarting at byte.
18060 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50 61  **     offset Pa
18070 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66  gerSavepoint.iOf
18080 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75  fset and continu
18090 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50  ing to .**     P
180a0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
180b0 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20  drOffset, or to 
180c0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
180d0 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ain journal.**  
180e0 20 20 20 66 69 6c 65 20 69 66 20 50 61 67 65 72     file if Pager
180f0 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
18100 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a  fset is zero..**
18110 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72  .**   * If Pager
18120 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
18130 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f  fset is not zero
18140 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65  , then pages are
18150 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62   played.**     b
18160 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f  ack starting fro
18170 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
18180 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  ader immediately
18190 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20   following .**  
181a0 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
181b0 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20  t.iHdrOffset to 
181c0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
181d0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
181e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65  ..**.**   * Page
181f0 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65  s are then playe
18200 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
18210 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
18220 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20  , starting.**   
18230 20 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72    with the Pager
18240 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65  Savepoint.iSubRe
18250 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  c and continuing
18260 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a   to the end of.*
18270 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  *     the journa
18280 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  l file..**.** Th
18290 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c  roughout the rol
182a0 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65  lback process, e
182b0 61 63 68 20 74 69 6d 65 20 61 20 70 61 67 65 20  ach time a page 
182c0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
182d0 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  the.** correspon
182e0 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20  ding bit is set 
182f0 69 6e 20 61 20 62 69 74 76 65 63 20 73 74 72 75  in a bitvec stru
18300 63 74 75 72 65 20 28 76 61 72 69 61 62 6c 65 20  cture (variable 
18310 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20  pDone in the.** 
18320 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62  implementation b
18330 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75  elow). This is u
18340 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  sed to ensure th
18350 61 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c  at a page is onl
18360 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y.** rolled back
18370 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
18380 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  it is encountere
18390 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72  d in either jour
183a0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53  nal..**.** If pS
183b0 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c  avepoint is NULL
183c0 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65  , then pages are
183d0 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63   only played bac
183e0 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a  k from the main.
183f0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
18400 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
18410 64 20 66 6f 72 20 61 20 62 69 74 76 65 63 20 69  d for a bitvec i
18420 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
18430 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ** In either cas
18440 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61  e, before playba
18450 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65  ck commences the
18460 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61   Pager.dbSize va
18470 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73  riable.** is res
18480 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
18490 74 68 61 74 20 69 74 20 68 65 6c 64 20 61 74 20  that it held at 
184a0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
184b0 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28   savepoint .** (
184c0 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  or transaction).
184d0 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61 20   No page with a 
184e0 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61  page-number grea
184f0 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61  ter than this va
18500 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64  lue.** is played
18510 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73   back. If one is
18520 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20   encountered it 
18530 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65  is simply skippe
18540 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
18550 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61   pagerPlaybackSa
18560 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70  vepoint(Pager *p
18570 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76 65  Pager, PagerSave
18580 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e  point *pSavepoin
18590 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  t){.  i64 szJ;  
185a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
185b0 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a 65  * Effective size
185c0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
185d0 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48  rnal */.  i64 iH
185e0 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
185f0 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72     /* End of fir
18600 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61  st segment of ma
18610 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  in-journal recor
18620 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ds */.  int rc =
18630 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
18640 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
18650 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
18660 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ne = 0;       /*
18670 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72   Bitvec to ensur
18680 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62  e pages played b
18690 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f  ack only once */
186a0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
186b0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
186c0 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a  _SHARED );..  /*
186d0 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76   Allocate a bitv
186e0 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f  ec to use to sto
186f0 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70 61  re the set of pa
18700 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
18710 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
18720 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65  int ){.    pDone
18730 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
18740 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e  Create(pSavepoin
18750 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69  t->nOrig);.    i
18760 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20  f( !pDone ){.   
18770 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18780 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
18790 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
187a0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 61  database size ba
187b0 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ck to the value 
187c0 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68  it was before th
187d0 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a  e savepoint .  *
187e0 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64  * being reverted
187f0 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a   was opened..  *
18800 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
18810 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20  ze = pSavepoint 
18820 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f  ? pSavepoint->nO
18830 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62  rig : pPager->db
18840 4f 72 69 67 53 69 7a 65 3b 0a 0a 20 20 69 66 28  OrigSize;..  if(
18850 20 21 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20   !pSavepoint && 
18860 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
18870 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  er) ){.    retur
18880 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57  n pagerRollbackW
18890 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  al(pPager);.  }.
188a0 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72  .  /* Use pPager
188b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20  ->journalOff as 
188c0 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 69  the effective si
188d0 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72  ze of the main r
188e0 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
188f0 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61  rnal.  The actua
18900 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20  l file might be 
18910 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73  larger than this
18920 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a   in.  ** PAGER_J
18930 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
18940 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55  ATE or PAGER_JOU
18950 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
18960 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a  .  But anything.
18970 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72    ** past pPager
18980 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20  ->journalOff is 
18990 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73  off-limits to us
189a0 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70  ..  */.  szJ = p
189b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
189c0 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  f;.  assert( pag
189d0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
189e0 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b  ==0 || szJ==0 );
189f0 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20  ..  /* Begin by 
18a00 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63  rolling back rec
18a10 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61  ords from the ma
18a20 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
18a30 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65  ing at.  ** Page
18a40 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73  rSavepoint.iOffs
18a50 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  et and continuin
18a60 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f  g to the next jo
18a70 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20  urnal header..  
18a80 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20 62  ** There might b
18a90 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65  e records in the
18aa0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68   main journal th
18ab0 61 74 20 68 61 76 65 20 61 20 70 61 67 65 20 6e  at have a page n
18ac0 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74  umber.  ** great
18ad0 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
18ae0 65 6e 74 20 64 61 74 61 62 61 73 65 20 73 69 7a  ent database siz
18af0 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  e (pPager->dbSiz
18b00 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a  e) but those.  *
18b10 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65  * will be skippe
18b20 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e  d automatically.
18b30 20 20 50 61 67 65 73 20 61 72 65 20 61 64 64 65    Pages are adde
18b40 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68  d to pDone as th
18b50 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79  ey.  ** are play
18b60 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed back..  */.  
18b70 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 26  if( pSavepoint &
18b80 26 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  & !pagerUseWal(p
18b90 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69 48  Pager) ){.    iH
18ba0 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69  drOff = pSavepoi
18bb0 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f  nt->iHdrOffset ?
18bc0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64   pSavepoint->iHd
18bd0 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20  rOffset : szJ;. 
18be0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
18bf0 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69  alOff = pSavepoi
18c00 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20  nt->iOffset;.   
18c10 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
18c20 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
18c30 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72  >journalOff<iHdr
18c40 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Off ){.      rc 
18c50 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
18c60 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
18c70 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
18c80 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c  alOff, pDone, 1,
18c90 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
18ca0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
18cb0 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73  E_DONE );.  }els
18cc0 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  e{.    pPager->j
18cd0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
18ce0 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75   }..  /* Continu
18cf0 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72  e rolling back r
18d00 65 63 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68  ecords out of th
18d10 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
18d20 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20  tarting at.  ** 
18d30 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
18d40 6c 20 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e  l header seen an
18d50 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74  d continuing unt
18d60 69 6c 20 74 68 65 20 65 66 66 65 63 74 69 76 65  il the effective
18d70 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65   end.  ** of the
18d80 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
18d90 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f  le.  Continue to
18da0 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e   skip out-of-ran
18db0 67 65 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a  ge pages and.  *
18dc0 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e  * continue addin
18dd0 67 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62  g pages rolled b
18de0 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20  ack to pDone..  
18df0 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  */.  while( rc==
18e00 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
18e10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
18e20 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69  szJ ){.    u32 i
18e30 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
18e40 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
18e50 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d  .    u32 nJRec =
18e60 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   0;     /* Numbe
18e70 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63  r of Journal Rec
18e80 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20  ords */.    u32 
18e90 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20  dummy;.    rc = 
18ea0 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
18eb0 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26  Pager, 0, szJ, &
18ec0 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a  nJRec, &dummy);.
18ed0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
18ee0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a  SQLITE_DONE );..
18ef0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68      /*.    ** Th
18f00 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e "pPager->journ
18f10 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
18f20 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
18f30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
18f40 22 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73  ".    ** test is
18f50 20 72 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b   related to tick
18f60 65 74 20 23 32 35 36 35 2e 20 20 53 65 65 20 74  et #2565.  See t
18f70 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e  he discussion in
18f80 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
18f90 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e  r_playback() fun
18fa0 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69  ction for additi
18fb0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
18fc0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
18fd0 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20   nJRec==0 .     
18fe0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
18ff0 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
19000 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
19010 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
19020 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a  .    ){.      nJ
19030 52 65 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a  Rec = (u32)((szJ
19040 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
19050 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50  alOff)/JOURNAL_P
19060 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
19070 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
19080 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
19090 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20   && ii<nJRec && 
190a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
190b0 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20  ff<szJ; ii++){. 
190c0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
190d0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
190e0 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
190f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
19100 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Done, 1, 1);.   
19110 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
19120 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
19130 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
19140 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
19150 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
19160 4f 66 66 3d 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f  Off==szJ );..  /
19170 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c  * Finally,  roll
19180 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20  back pages from 
19190 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
191a0 20 20 50 61 67 65 20 74 68 61 74 20 77 65 72 65    Page that were
191b0 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79  .  ** previously
191c0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74   rolled back out
191d0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
191e0 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65  rnal (and are he
191f0 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20  nce in pDone).  
19200 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70  ** will be skipp
19210 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67  ed.  Out-of-rang
19220 65 20 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f  e pages are also
19230 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20   skipped..  */. 
19240 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20   if( pSavepoint 
19250 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20  ){.    u32 ii;  
19260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
19270 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
19280 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70 53   i64 offset = pS
19290 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65  avepoint->iSubRe
192a0 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  c*(4+pPager->pag
192b0 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28  eSize);..    if(
192c0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
192d0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
192e0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76   = sqlite3WalSav
192f0 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65  epointUndo(pPage
19300 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f  r->pWal, pSavepo
19310 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a  int->aWalData);.
19320 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
19330 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75  =pSavepoint->iSu
19340 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45  bRec; rc==SQLITE
19350 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72  _OK && ii<pPager
19360 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29  ->nSubRec; ii++)
19370 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
19380 6f 66 66 73 65 74 3d 3d 69 69 2a 28 34 2b 70 50  offset==ii*(4+pP
19390 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
193a0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
193b0 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
193c0 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f  _page(pPager, &o
193d0 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c  ffset, pDone, 0,
193e0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
193f0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
19400 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20  E_DONE );.  }.. 
19410 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
19420 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20  stroy(pDone);.  
19430 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19440 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
19450 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
19460 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  J;.  }..  return
19470 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
19480 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
19490 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
194a0 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
194b0 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a  are allowed..*/.
194c0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
194d0 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61  rSetCachesize(Pa
194e0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
194f0 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69   mxPage){.  sqli
19500 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63 68  te3PcacheSetCach
19510 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  esize(pPager->pP
19520 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a  Cache, mxPage);.
19530 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
19540 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f  the robustness o
19550 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
19560 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  o damage due to 
19570 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72  OS crashes.** or
19580 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20   power failures 
19590 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  by changing the 
195a0 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28  number of syncs(
195b0 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a  )s when writing.
195c0 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
195d0 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20  journal.  There 
195e0 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73  are three levels
195f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
19600 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
19610 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
19620 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
19630 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
19640 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
19650 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
19660 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
19670 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
19680 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
19690 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
196a0 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
196b0 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
196c0 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
196d0 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
196e0 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
196f0 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
19700 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
19710 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
19720 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
19730 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
19740 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
19750 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
19760 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
19770 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
19780 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
19790 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
197a0 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
197b0 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
197c0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
197d0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
197e0 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
197f0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
19800 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
19810 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
19820 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
19830 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
19840 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
19850 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
19860 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
19870 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
19880 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
19890 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
198a0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
198b0 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
198c0 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
198d0 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
198e0 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
198f0 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
19900 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
19910 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
19920 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
19930 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
19940 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
19950 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
19960 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
19970 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
19980 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
19990 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
199a0 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
199b0 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
199c0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
199d0 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
199e0 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61  **.** Numeric va
199f0 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  lues associated 
19a00 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65  with these state
19a10 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f  s are OFF==1, NO
19a20 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46  RMAL=2,.** and F
19a30 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ULL=3..*/.#ifnde
19a40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
19a50 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64  GER_PRAGMAS.void
19a60 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
19a70 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65  SafetyLevel(Page
19a80 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
19a90 65 76 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46  evel, int bFullF
19aa0 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d  sync){.  pPager-
19ab0 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65  >noSync =  (leve
19ac0 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e  l==1 || pPager->
19ad0 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a  tempFile) ?1:0;.
19ae0 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
19af0 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26  nc = (level==3 &
19b00 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
19b10 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61  ile) ?1:0;.  pPa
19b20 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20  ger->sync_flags 
19b30 3d 20 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53 51  = (bFullFsync?SQ
19b40 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53  LITE_SYNC_FULL:S
19b50 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
19b60 4c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  L);.  if( pPager
19b70 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65  ->noSync ) pPage
19b80 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
19b90 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
19ba0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
19bb0 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69  lobal variable i
19bc0 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68  s incremented wh
19bd0 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61  enever the libra
19be0 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  ry.** attempts t
19bf0 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
19c00 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  ry file.  This i
19c10 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
19c20 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
19c30 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
19c40 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66  nly.  .*/.#ifdef
19c50 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
19c60 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
19c70 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  p_count = 0;.#en
19c80 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  dif../*.** Open 
19c90 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
19ca0 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ..**.** Write th
19cb0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
19cc0 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52  r into *pFile. R
19cd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
19ce0 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f  on success .** o
19cf0 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
19d00 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61  or code if we fa
19d10 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20  il. The OS will 
19d20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a  automatically .*
19d30 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d  * delete the tem
19d40 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e  porary file when
19d50 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
19d60 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70  *.** The flags p
19d70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56 46 53  assed to the VFS
19d80 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63   layer xOpen() c
19d90 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70  all are those sp
19da0 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61  ecified.** by pa
19db0 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73  rameter vfsFlags
19dc0 20 4f 52 65 64 20 77 69 74 68 20 74 68 65 20 66   ORed with the f
19dd0 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
19de0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
19df0 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20  READWRITE.**    
19e00 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
19e10 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ATE.**     SQLIT
19e20 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
19e30 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
19e40 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
19e50 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  E.*/.static int 
19e60 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20  pagerOpentemp(. 
19e70 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
19e80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
19e90 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
19ea0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
19eb0 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74  ile,  /* Write t
19ec0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
19ed0 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  or here */.  int
19ee0 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
19ef0 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
19f00 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ed through to th
19f10 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e  e VFS */.){.  in
19f20 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
19f30 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
19f40 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  de */..#ifdef SQ
19f50 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
19f60 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
19f70 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66  nt++;  /* Used f
19f80 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
19f90 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a  nalysis only */.
19fa0 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61  #endif..  vfsFla
19fb0 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50  gs |=  SQLITE_OP
19fc0 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
19fd0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
19fe0 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
19ff0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
1a000 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f  USIVE | SQLITE_O
1a010 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
1a020 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  E;.  rc = sqlite
1a030 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  3OsOpen(pPager->
1a040 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20  pVfs, 0, pFile, 
1a050 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  vfsFlags, 0);.  
1a060 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
1a070 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
1a080 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75  pFile) );.  retu
1a090 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1a0a0 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e  Set the busy han
1a0b0 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  dler function..*
1a0c0 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69  *.** The pager i
1a0d0 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d  nvokes the busy-
1a0e0 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74  handler if sqlit
1a0f0 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72  e3OsLock() retur
1a100 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ns .** SQLITE_BU
1a110 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74  SY when trying t
1a120 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e  o upgrade from n
1a130 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52  o-lock to a SHAR
1a140 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77  ED lock,.** or w
1a150 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70  hen trying to up
1a160 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53  grade from a RES
1a170 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e  ERVED lock to an
1a180 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c   EXCLUSIVE .** l
1a190 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f  ock. It does *no
1a1a0 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  t* invoke the bu
1a1b0 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20  sy handler when 
1a1c0 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a  upgrading from.*
1a1d0 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45  * SHARED to RESE
1a1e0 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70  RVED, or when up
1a1f0 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41  grading from SHA
1a200 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45  RED to EXCLUSIVE
1a210 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72  .** (which occur
1a220 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75  s during hot-jou
1a230 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20  rnal rollback). 
1a240 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  Summary:.**.**  
1a250 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20   Transition     
1a260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a270 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75     | Invokes xBu
1a280 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d  syHandler.**   -
1a290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a2a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a2b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a2c0 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f  -------.**   NO_
1a2d0 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48  LOCK       -> SH
1a2e0 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c  ARED_LOCK      |
1a2f0 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44   Yes.**   SHARED
1a300 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52  _LOCK   -> RESER
1a310 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f  VED_LOCK    | No
1a320 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43  .**   SHARED_LOC
1a330 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  K   -> EXCLUSIVE
1a340 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20  _LOCK   | No.** 
1a350 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20    RESERVED_LOCK 
1a360 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  -> EXCLUSIVE_LOC
1a370 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20  K   | Yes.**.** 
1a380 49 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  If the busy-hand
1a390 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  ler callback ret
1a3a0 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  urns non-zero, t
1a3b0 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72  he lock is .** r
1a3c0 65 74 72 69 65 64 2e 20 49 66 20 69 74 20 72 65  etried. If it re
1a3d0 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e  turns zero, then
1a3e0 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59   the SQLITE_BUSY
1a3f0 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74   error is.** ret
1a400 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
1a410 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 72  ler of the pager
1a420 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   API function..*
1a430 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
1a440 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
1a450 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
1a460 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
1a470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
1a480 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
1a490 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
1a4a0 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20  r)(void *),     
1a4b0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1a4c0 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66  o busy-handler f
1a4d0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  unction */.  voi
1a4e0 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41  d *pBusyHandlerA
1a4f0 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
1a500 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
1a510 20 70 61 73 73 20 74 6f 20 78 42 75 73 79 48 61   pass to xBusyHa
1a520 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a 20 20  ndler */.){  .  
1a530 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
1a540 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64  dler = xBusyHand
1a550 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  ler;.  pPager->p
1a560 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d  BusyHandlerArg =
1a570 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67   pBusyHandlerArg
1a580 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72  ;.}../*.** Repor
1a590 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  t the current pa
1a5a0 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62  ge size and numb
1a5b0 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
1a5c0 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20  ytes back.** to 
1a5d0 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69  the codec..*/.#i
1a5e0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
1a5f0 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69  CODEC.static voi
1a600 64 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a  d pagerReportSiz
1a610 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
1a620 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
1a630 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29  xCodecSizeChng )
1a640 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43  {.    pPager->xC
1a650 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61  odecSizeChng(pPa
1a660 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61  ger->pCodec, pPa
1a670 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20  ger->pageSize,. 
1a680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a690 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70            (int)p
1a6a0 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29  Pager->nReserve)
1a6b0 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
1a6c0 64 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f  define pagerRepo
1a6d0 72 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a  rtSize(X)     /*
1a6e0 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20   No-op if we do 
1a6f0 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f  not support a co
1a700 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f  dec */.#endif../
1a710 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
1a720 70 61 67 65 20 73 69 7a 65 20 75 73 65 64 20 62  page size used b
1a730 79 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  y the Pager obje
1a740 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65  ct. The new page
1a750 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73   size .** is pas
1a760 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a  sed in *pPageSiz
1a770 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
1a780 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
1a790 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e  error state when
1a7a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1a7b0 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20  s called, it.** 
1a7c0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20  is a no-op. The 
1a7d0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
1a7e0 73 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  s the error stat
1a7f0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e  e error code (i.
1a800 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51  e. .** one of SQ
1a810 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49  LITE_IOERR, SQLI
1a820 54 45 5f 43 4f 52 52 55 50 54 20 6f 72 20 53 51  TE_CORRUPT or SQ
1a830 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a  LITE_FULL)..**.*
1a840 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
1a850 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
1a860 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
1a870 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77  *.**   * the new
1a880 20 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75   page size (valu
1a890 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29  e of *pPageSize)
1a8a0 20 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77   is valid (a pow
1a8b0 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77  er .**     of tw
1a8c0 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  o between 512 an
1a8d0 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  d SQLITE_MAX_PAG
1a8e0 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76  E_SIZE, inclusiv
1a8f0 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  e), and.**.**   
1a900 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  * there are no o
1a910 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
1a920 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a  references, and.
1a930 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61  **.**   * the da
1a940 74 61 62 61 73 65 20 69 73 20 65 69 74 68 65 72  tabase is either
1a950 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   not an in-memor
1a960 79 20 64 61 74 61 62 61 73 65 20 6f 72 20 69 74  y database or it
1a970 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e   is.**     an in
1a980 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1a990 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20   that currently 
1a9a0 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f  consists of zero
1a9b0 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68   pages..**.** th
1a9c0 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  en the pager obj
1a9d0 65 63 74 20 70 61 67 65 20 73 69 7a 65 20 69 73  ect page size is
1a9e0 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69   set to *pPageSi
1a9f0 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ze..**.** If the
1aa00 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 63 68   page size is ch
1aa10 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73  anged, then this
1aa20 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73   function uses s
1aa30 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f  qlite3PagerMallo
1aa40 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69  c() .** to obtai
1aa50 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54  n a new Pager.pT
1aa60 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 20  mpSpace buffer. 
1aa70 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69  If this allocati
1aa80 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66  on attempt .** f
1aa90 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  ails, SQLITE_NOM
1aaa0 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  EM is returned a
1aab0 6e 64 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  nd the page size
1aac0 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67   remains unchang
1aad0 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f  ed. .** In all o
1aae0 74 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49  ther cases, SQLI
1aaf0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1ab00 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
1ab10 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
1ab20 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72   changed, either
1ab30 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20   because one of 
1ab40 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a  the enumerated.*
1ab50 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f  * conditions abo
1ab60 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20  ve is not true, 
1ab70 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
1ab80 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65   error state whe
1ab90 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  n this.** functi
1aba0 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f  on was called, o
1abb0 72 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 65  r because the me
1abc0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
1abd0 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20  attempt failed, 
1abe0 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53  .** then *pPageS
1abf0 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
1ac00 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20  e old, retained 
1ac10 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65  page size before
1ac20 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69   returning..*/.i
1ac30 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
1ac40 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72  etPagesize(Pager
1ac50 20 2a 70 50 61 67 65 72 2c 20 75 31 36 20 2a 70   *pPager, u16 *p
1ac60 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  PageSize, int nR
1ac70 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72  eserve){.  int r
1ac80 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
1ac90 6f 64 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ode;..  if( rc==
1aca0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1acb0 20 75 31 36 20 70 61 67 65 53 69 7a 65 20 3d 20   u16 pageSize = 
1acc0 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  *pPageSize;.    
1acd0 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65  assert( pageSize
1ace0 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65  ==0 || (pageSize
1acf0 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
1ad00 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
1ad10 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20 20  GE_SIZE) );.    
1ad20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d  if( (pPager->mem
1ad30 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  Db==0 || pPager-
1ad40 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 20  >dbSize==0).    
1ad50 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68   && sqlite3Pcach
1ad60 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
1ad70 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20  ->pPCache)==0 . 
1ad80 20 20 20 20 26 26 20 70 61 67 65 53 69 7a 65 20      && pageSize 
1ad90 26 26 20 70 61 67 65 53 69 7a 65 21 3d 70 50 61  && pageSize!=pPa
1ada0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20  ger->pageSize . 
1adb0 20 20 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72     ){.      char
1adc0 20 2a 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a   *pNew = (char *
1add0 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c  )sqlite3PageMall
1ade0 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  oc(pageSize);.  
1adf0 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b      if( !pNew ){
1ae00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1ae10 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1ae20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ae30 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
1ae40 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50  ger);.        pP
1ae50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
1ae60 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20   pageSize;.     
1ae70 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
1ae80 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ee(pPager->pTmpS
1ae90 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70  pace);.        p
1aea0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
1aeb0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
1aec0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
1aed0 74 50 61 67 65 53 69 7a 65 28 70 50 61 67 65 72  tPageSize(pPager
1aee0 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 53  ->pPCache, pageS
1aef0 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
1af00 20 20 7d 0a 20 20 20 20 2a 70 50 61 67 65 53 69    }.    *pPageSi
1af10 7a 65 20 3d 20 28 75 31 36 29 70 50 61 67 65 72  ze = (u16)pPager
1af20 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
1af30 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
1af40 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50 61 67   nReserve = pPag
1af50 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20  er->nReserve;.  
1af60 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
1af70 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76  ve>=0 && nReserv
1af80 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50  e<1000 );.    pP
1af90 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d  ager->nReserve =
1afa0 20 28 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a   (i16)nReserve;.
1afb0 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53      pagerReportS
1afc0 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ize(pPager);.  }
1afd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1afe0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1aff0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  pointer to the "
1b000 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20  temporary page" 
1b010 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65  buffer held inte
1b020 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65  rnally.** by the
1b030 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73   pager.  This is
1b040 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69   a buffer that i
1b050 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  s big enough to 
1b060 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69  hold the.** enti
1b070 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  re content of a 
1b080 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
1b090 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75  This buffer is u
1b0a0 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  sed internally.*
1b0b0 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  * during rollbac
1b0c0 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76  k and will be ov
1b0d0 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76  erwritten whenev
1b0e0 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  er a rollback.**
1b0f0 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74   occurs.  But ot
1b100 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20  her modules are 
1b110 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74  free to use it t
1b120 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a  oo, as long as.*
1b130 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61  * no rollbacks a
1b140 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f  re happening..*/
1b150 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
1b160 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67  gerTempSpace(Pag
1b170 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
1b180 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54  eturn pPager->pT
1b190 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  mpSpace;.}../*.*
1b1a0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
1b1b0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74   the maximum dat
1b1c0 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
1b1d0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
1b1e0 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65  sitive. .** Make
1b1f0 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d   no changes if m
1b200 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72  xPage is zero or
1b210 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20   negative.  And 
1b220 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
1b230 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  .** maximum page
1b240 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65   count below the
1b250 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
1b260 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
1b270 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  *.** Regardless 
1b280 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
1b290 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  n the current ma
1b2a0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
1b2b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b2c0 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
1b2d0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
1b2e0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
1b2f0 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20 69 66 28  int nPage;.  if(
1b300 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20   mxPage>0 ){.   
1b310 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
1b320 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20  = mxPage;.  }.  
1b330 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1b340 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
1b350 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  ){.    sqlite3Pa
1b360 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
1b370 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
1b380 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b390 2d 3e 6d 78 50 67 6e 6f 3e 3d 6e 50 61 67 65 20  ->mxPgno>=nPage 
1b3a0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1b3b0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a  pPager->mxPgno;.
1b3c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
1b3d0 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f  lowing set of ro
1b3e0 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
1b3f0 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73  to disable the s
1b400 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20  imulated.** I/O 
1b410 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e  error mechanism.
1b420 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73    These routines
1b430 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f   are used to avo
1b440 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  id simulated.** 
1b450 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73  errors in places
1b460 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74   where we do not
1b470 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f   care about erro
1b480 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73  rs..**.** Unless
1b490 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31   -DSQLITE_TEST=1
1b4a0 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20   is used, these 
1b4b0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c  routines are all
1b4c0 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67   no-ops.** and g
1b4d0 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e  enerate no code.
1b4e0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1b4f0 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e  E_TEST.extern in
1b500 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
1b510 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65  or_pending;.exte
1b520 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
1b530 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61  o_error_hit;.sta
1b540 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e  tic int saved_cn
1b550 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f  t;.void disable_
1b560 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
1b570 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76  ors(void){.  sav
1b580 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33  ed_cnt = sqlite3
1b590 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
1b5a0 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  g;.  sqlite3_io_
1b5b0 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
1b5c0 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c  -1;.}.void enabl
1b5d0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
1b5e0 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
1b5f0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
1b600 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f  pending = saved_
1b610 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  cnt;.}.#else.# d
1b620 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69  efine disable_si
1b630 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
1b640 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61  s().# define ena
1b650 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
1b660 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66  _errors().#endif
1b670 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
1b680 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66   first N bytes f
1b690 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  rom the beginnin
1b6a0 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  g of the file in
1b6b0 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61  to memory.** tha
1b6c0 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74  t pDest points t
1b6d0 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  o. .**.** If the
1b6e0 20 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65   pager was opene
1b6f0 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74  d on a transient
1b700 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65   file (zFilename
1b710 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65  ==""), or.** ope
1b720 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65  ned on a file le
1b730 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20  ss than N bytes 
1b740 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74  in size, the out
1b750 70 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a  put buffer is.**
1b760 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49   zeroed and SQLI
1b770 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
1b780 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f  The rationale fo
1b790 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74  r this is that t
1b7a0 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
1b7b0 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
1b7c0 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72   database header
1b7d0 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61  s, and a new tra
1b7e0 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72  nsient or.** zer
1b7f0 6f 20 73 69 7a 65 64 20 64 61 74 61 62 61 73 65  o sized database
1b800 20 68 61 73 20 61 20 68 65 61 64 65 72 20 74 68   has a header th
1b810 61 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69  an consists enti
1b820 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a  rely of zeroes..
1b830 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20  **.** If any IO 
1b840 65 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d  error apart from
1b850 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
1b860 4f 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f  ORT_READ is enco
1b870 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20  untered,.** the 
1b880 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1b890 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
1b8a0 6c 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e  ller and the con
1b8b0 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20  tents of the.** 
1b8c0 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 75 6e  output buffer un
1b8d0 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  defined..*/.int 
1b8e0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64  sqlite3PagerRead
1b8f0 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72  Fileheader(Pager
1b900 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c   *pPager, int N,
1b910 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1b920 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  pDest){.  int rc
1b930 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1b940 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c  memset(pDest, 0,
1b950 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69   N);.  assert( i
1b960 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1b970 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  ) || pPager->tem
1b980 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54  pFile );..  /* T
1b990 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
1b9a0 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 62 74  nly called by bt
1b9b0 72 65 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ree immediately 
1b9c0 61 66 74 65 72 20 63 72 65 61 74 69 6e 67 0a 20  after creating. 
1b9d0 20 2a 2a 20 74 68 65 20 50 61 67 65 72 20 6f 62   ** the Pager ob
1b9e0 6a 65 63 74 2e 20 20 54 68 65 72 65 20 68 61 73  ject.  There has
1b9f0 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70 70   not been an opp
1ba00 6f 72 74 75 6e 69 74 79 20 74 6f 20 74 72 61 6e  ortunity to tran
1ba10 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57  sition.  ** to W
1ba20 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a  AL mode yet..  *
1ba30 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  /.  assert( !pag
1ba40 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
1ba50 20 29 3b 0a 23 69 66 20 30 0a 20 20 69 66 28 20   );.#if 0.  if( 
1ba60 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
1ba70 65 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  er) ){.    int i
1ba80 73 49 6e 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20  sInWal = 0;.    
1ba90 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 52  rc = sqlite3WalR
1baa0 65 61 64 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ead(pPager->pWal
1bab0 2c 20 31 2c 20 26 69 73 49 6e 57 61 6c 2c 20 4e  , 1, &isInWal, N
1bac0 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 69 66  , pDest);.    if
1bad0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1bae0 7c 7c 20 69 73 49 6e 57 61 6c 20 29 7b 0a 20 20  || isInWal ){.  
1baf0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1bb00 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1bb10 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
1bb20 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
1bb30 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52   IOTRACE(("DBHDR
1bb40 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61   %p 0 %d\n", pPa
1bb50 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20  ger, N)).    rc 
1bb60 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
1bb70 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73  pPager->fd, pDes
1bb80 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, N, 0);.    if
1bb90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
1bba0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
1bbb0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1bbc0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
1bbd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1bbe0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1bbf0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
1bc00 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
1bc10 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 73 73  atabase file ass
1bc20 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68  ociated .** with
1bc30 20 70 50 61 67 65 72 2e 20 4e 6f 72 6d 61 6c 6c   pPager. Normall
1bc40 79 2c 20 74 68 69 73 20 69 73 20 63 61 6c 63 75  y, this is calcu
1bc50 6c 61 74 65 64 20 61 73 20 28 3c 64 62 20 66 69  lated as (<db fi
1bc60 6c 65 20 73 69 7a 65 3e 2f 3c 70 61 67 65 2d 73  le size>/<page-s
1bc70 69 7a 65 3e 29 2e 0a 2a 2a 20 48 6f 77 65 76 65  ize>)..** Howeve
1bc80 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20 69  r, if the file i
1bc90 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  s between 1 and 
1bca0 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65  <page-size> byte
1bcb0 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
1bcc0 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73  .** this is cons
1bcd0 69 64 65 72 65 64 20 61 20 31 20 70 61 67 65 20  idered a 1 page 
1bce0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  file..**.** If t
1bcf0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
1bd00 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20  rror state when 
1bd10 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1bd20 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68   called, then th
1bd30 65 0a 2a 2a 20 65 72 72 6f 72 20 73 74 61 74 65  e.** error state
1bd40 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1bd50 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50  eturned and *pnP
1bd60 61 67 65 20 6c 65 66 74 20 75 6e 63 68 61 6e 67  age left unchang
1bd70 65 64 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20 74 68  ed. Or,.** if th
1bd80 65 20 66 69 6c 65 20 73 79 73 74 65 6d 20 68 61  e file system ha
1bd90 73 20 74 6f 20 62 65 20 71 75 65 72 69 65 64 20  s to be queried 
1bda0 66 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20  for the size of 
1bdb0 74 68 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20  the file and.** 
1bdc0 74 68 65 20 71 75 65 72 79 20 61 74 74 65 6d 70  the query attemp
1bdd0 74 20 72 65 74 75 72 6e 73 20 61 6e 20 49 4f 20  t returns an IO 
1bde0 65 72 72 6f 72 2c 20 74 68 65 20 49 4f 20 65 72  error, the IO er
1bdf0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1be00 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50  rned.** and *pnP
1be10 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
1be20 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  anged..**.** Oth
1be30 65 72 77 69 73 65 2c 20 69 66 20 65 76 65 72 79  erwise, if every
1be40 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
1be50 66 75 6c 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ful, then SQLITE
1be60 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
1be70 2a 2a 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69  ** and *pnPage i
1be80 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
1be90 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1bea0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
1beb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1bec0 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
1bed0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70   *pPager, int *p
1bee0 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e  nPage){.  Pgno n
1bef0 50 61 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Page = 0;       
1bf00 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
1bf10 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61  return via *pnPa
1bf20 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 44 65 74 65  ge */..  /* Dete
1bf30 72 6d 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72  rmine the number
1bf40 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
1bf50 20 66 69 6c 65 2e 20 53 74 6f 72 65 20 74 68 69   file. Store thi
1bf60 73 20 69 6e 20 6e 50 61 67 65 2e 20 2a 2f 0a 20  s in nPage. */. 
1bf70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
1bf80 69 7a 65 56 61 6c 69 64 20 29 7b 0a 20 20 20 20  izeValid ){.    
1bf90 6e 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  nPage = pPager->
1bfa0 64 62 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b  dbSize;.  }else{
1bfb0 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20  .    int rc;    
1bfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bfd0 45 72 72 6f 72 20 72 65 74 75 72 6e 65 64 20 62  Error returned b
1bfe0 79 20 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a  y OsFileSize() *
1bff0 2f 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b  /.    i64 n = 0;
1c000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c010 20 46 69 6c 65 20 73 69 7a 65 20 69 6e 20 62 79   File size in by
1c020 74 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  tes returned by 
1c030 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a  OsFileSize() */.
1c040 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
1c050 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20  eWal(pPager) && 
1c060 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
1c070 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
1c080 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 44       sqlite3WalD
1c090 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57  bsize(pPager->pW
1c0a0 61 6c 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  al, &nPage);.   
1c0b0 20 7d 0a 0a 20 20 20 20 69 66 28 20 6e 50 61 67   }..    if( nPag
1c0c0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  e==0 ){.      as
1c0d0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1c0e0 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
1c0f0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1c100 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e        if( isOpen
1c110 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
1c120 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49          if( SQLI
1c130 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
1c140 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
1c150 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 20  Pager->fd, &n)) 
1c160 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67  ){.          pag
1c170 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
1c180 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20   rc);.          
1c190 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1c1a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1c1b0 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c     if( n>0 && n<
1c1c0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1c1d0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 50 61 67   ){.        nPag
1c1e0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  e = 1;.      }el
1c1f0 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 50 61 67  se{.        nPag
1c200 65 20 3d 20 28 50 67 6e 6f 29 28 6e 20 2f 20 70  e = (Pgno)(n / p
1c210 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1c220 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c230 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1c240 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
1c250 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OCK ){.      pPa
1c260 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
1c270 61 67 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65  age;.      pPage
1c280 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
1c290 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 70 50 61  nPage;.      pPa
1c2a0 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
1c2b0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
1c2c0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
1c2d0 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70  rent number of p
1c2e0 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ages in the file
1c2f0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1c300 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f 6e 66 69   the .  ** confi
1c310 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61  gured maximum pa
1c320 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72  ger number, incr
1c330 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64  ease the allowed
1c340 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74   limit so.  ** t
1c350 68 61 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e  hat the file can
1c360 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20   be read..  */. 
1c370 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65   if( nPage>pPage
1c380 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20  r->mxPgno ){.   
1c390 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
1c3a0 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20  = (Pgno)nPage;. 
1c3b0 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
1c3c0 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
1c3d0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
1c3e0 54 45 5f 4f 4b 20 2a 2f 0a 20 20 2a 70 6e 50 61  TE_OK */.  *pnPa
1c3f0 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65  ge = nPage;.  re
1c400 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c410 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  }.../*.** Try to
1c420 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
1c430 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20  f type locktype 
1c440 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1c450 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69  file. If.** a si
1c460 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72  milar or greater
1c470 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79   lock is already
1c480 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63   held, this func
1c490 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a  tion is a no-op.
1c4a0 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51  ** (returning SQ
1c4b0 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74  LITE_OK immediat
1c4c0 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ely)..**.** Othe
1c4d0 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74  rwise, attempt t
1c4e0 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  o obtain the loc
1c4f0 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  k using sqlite3O
1c500 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20  sLock(). Invoke 
1c510 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c  .** the busy cal
1c520 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63  lback if the loc
1c530 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e  k is currently n
1c540 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65  ot available. Re
1c550 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74  peat .** until t
1c560 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
1c570 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f   returns false o
1c580 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65  r until the atte
1c590 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69  mpt to .** obtai
1c5a0 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65  n the lock succe
1c5b0 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  eds..**.** Retur
1c5c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
1c5d0 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72  uccess and an er
1c5e0 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63  ror code if we c
1c5f0 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20  annot obtain.** 
1c600 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65  the lock. If the
1c610 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65   lock is obtaine
1c620 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
1c630 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 73 74  set the Pager.st
1c640 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65  ate .** variable
1c650 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66   to locktype bef
1c660 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1c670 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1c680 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
1c690 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
1c6a0 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
1c6b0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1c6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6d0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1c6e0 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ode */..  /* The
1c6f0 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20   OS lock values 
1c700 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
1c710 20 61 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f   as the Pager lo
1c720 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61  ck values */.  a
1c730 73 73 65 72 74 28 20 50 41 47 45 52 5f 53 48 41  ssert( PAGER_SHA
1c740 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  RED==SHARED_LOCK
1c750 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
1c760 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45  GER_RESERVED==RE
1c770 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SERVED_LOCK );. 
1c780 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 45   assert( PAGER_E
1c790 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53  XCLUSIVE==EXCLUS
1c7a0 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  IVE_LOCK );..  /
1c7b0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  * If the file is
1c7c0 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63   currently unloc
1c7d0 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a  ked then the siz
1c7e0 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77  e must be unknow
1c7f0 6e 2e 20 49 74 0a 20 20 2a 2a 20 6d 75 73 74 20  n. It.  ** must 
1c800 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6d 6f  not have been mo
1c810 64 69 66 69 65 64 20 61 74 20 74 68 69 73 20 70  dified at this p
1c820 6f 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  oint..  */.  ass
1c830 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1c840 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
1c850 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69   || pPager->dbSi
1c860 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20  zeValid==0 );.  
1c870 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1c880 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
1c890 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  RED || pPager->d
1c8a0 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 29 3b 0a  bModified==0 );.
1c8b0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
1c8c0 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20   this is either 
1c8d0 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65  a no-op (because
1c8e0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
1c8f0 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72  ock is .  ** alr
1c900 65 61 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e  eady held, or on
1c910 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 73  e of the transis
1c920 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62  tions that the b
1c930 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a  usy-handler.  **
1c940 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20   may be invoked 
1c950 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e  during, accordin
1c960 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74  g to the comment
1c970 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69   above.  ** sqli
1c980 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
1c990 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20  andler()..  */. 
1c9a0 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
1c9b0 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70  ->state>=locktyp
1c9c0 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50  e).       || (pP
1c9d0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
1c9e0 45 52 5f 55 4e 4c 4f 43 4b 20 26 26 20 6c 6f 63  ER_UNLOCK && loc
1c9f0 6b 74 79 70 65 3d 3d 50 41 47 45 52 5f 53 48 41  ktype==PAGER_SHA
1ca00 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  RED).       || (
1ca10 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
1ca20 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 26 26  AGER_RESERVED &&
1ca30 20 6c 6f 63 6b 74 79 70 65 3d 3d 50 41 47 45 52   locktype==PAGER
1ca40 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 29 3b  _EXCLUSIVE).  );
1ca50 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
1ca60 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20  state>=locktype 
1ca70 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1ca80 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
1ca90 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72      do {.      r
1caa0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
1cab0 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f  k(pPager->fd, lo
1cac0 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68  cktype);.    }wh
1cad0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1cae0 42 55 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e  BUSY && pPager->
1caf0 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61  xBusyHandler(pPa
1cb00 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
1cb10 72 41 72 67 29 20 29 3b 0a 20 20 20 20 69 66 28  rArg) );.    if(
1cb20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1cb30 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
1cb40 73 74 61 74 65 20 3d 20 28 75 38 29 6c 6f 63 6b  state = (u8)lock
1cb50 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52  type;.      IOTR
1cb60 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64  ACE(("LOCK %p %d
1cb70 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63  \n", pPager, loc
1cb80 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20  ktype)).    }.  
1cb90 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1cba0 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ../*.** Function
1cbb0 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
1cbc0 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72  onstraint(pPager
1cbd0 29 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e  ) checks that on
1cbe0 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c  e of the .** fol
1cbf0 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20 66  lowing is true f
1cc00 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  or all dirty pag
1cc10 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  es currently in 
1cc20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a  the page-cache:.
1cc30 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70  **.**   a) The p
1cc40 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65  age number is le
1cc50 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
1cc60 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
1cc70 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72  the .**      cur
1cc80 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d  rent database im
1cc90 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f  age, in pages, O
1cca0 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20  R.**.**   b) if 
1ccb0 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
1ccc0 20 77 65 72 65 20 77 72 69 74 74 65 6e 20 61 74   were written at
1ccd0 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77   this time, it w
1cce0 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  ould not.**     
1ccf0 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
1cd00 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
1cd10 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74  nt content out t
1cd20 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
1cd30 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65  l.**      (as de
1cd40 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63  termined by func
1cd50 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65  tion subjRequire
1cd60 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20  sPage())..**.** 
1cd70 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  If the condition
1cd80 20 61 73 73 65 72 74 65 64 20 62 79 20 74 68 69   asserted by thi
1cd90 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20  s function were 
1cda0 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68  not true, and th
1cdb0 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20  e.** dirty page 
1cdc0 77 65 72 65 20 74 6f 20 62 65 20 64 69 73 63 61  were to be disca
1cdd0 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61  rded from the ca
1cde0 63 68 65 20 76 69 61 20 74 68 65 20 70 61 67 65  che via the page
1cdf0 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75  rStress().** rou
1ce00 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73  tine, pagerStres
1ce10 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72  s() would not wr
1ce20 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
1ce30 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a  page content to.
1ce40 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
1ce50 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70  file. If a savep
1ce60 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  oint transaction
1ce70 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63   were rolled bac
1ce80 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20  k after.** this 
1ce90 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f  happened, the co
1cea0 72 72 65 63 74 20 62 65 68 61 76 69 6f 75 72 20  rrect behaviour 
1ceb0 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74  would be to rest
1cec0 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ore the current.
1ced0 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  ** content of th
1cee0 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c  e page. However,
1cef0 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74   since this cont
1cf00 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65  ent is not prese
1cf10 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20  nt in either.** 
1cf20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1cf30 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e  e or the portion
1cf40 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
1cf50 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a   journal and .**
1cf60 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   sub-journal rol
1cf70 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e  led back the con
1cf80 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62  tent could not b
1cf90 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74  e restored and t
1cfa0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69  he.** database i
1cfb0 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d  mage would becom
1cfc0 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73  e corrupt. It is
1cfd0 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75   therefore fortu
1cfe0 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68  nate that .** th
1cff0 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20  is circumstance 
1d000 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f  cannot arise..*/
1d010 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1d020 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69  ITE_DEBUG).stati
1d030 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75  c void assertTru
1d040 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43  ncateConstraintC
1d050 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  b(PgHdr *pPg){. 
1d060 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c   assert( pPg->fl
1d070 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20  ags&PGHDR_DIRTY 
1d080 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 75  );.  assert( !su
1d090 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
1d0a0 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f  Pg) || pPg->pgno
1d0b0 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64  <=pPg->pPager->d
1d0c0 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69  bSize );.}.stati
1d0d0 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75  c void assertTru
1d0e0 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
1d0f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1d100 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49    sqlite3PcacheI
1d110 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67  terateDirty(pPag
1d120 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73  er->pPCache, ass
1d130 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
1d140 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73  raintCb);.}.#els
1d150 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72  e.# define asser
1d160 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
1d170 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64  int(pPager).#end
1d180 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  if../*.** Trunca
1d190 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
1d1a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1d1b0 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61  mage to nPage pa
1d1c0 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  ges. This .** fu
1d1d0 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
1d1e0 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20  actually modify 
1d1f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1d200 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a  e on disk. It .*
1d210 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20  * just sets the 
1d220 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f  internal state o
1d230 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  f the pager obje
1d240 63 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a  ct so that the .
1d250 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69  ** truncation wi
1d260 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20  ll be done when 
1d270 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
1d280 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
1d290 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tted..*/.void sq
1d2a0 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
1d2b0 74 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70  teImage(Pager *p
1d2c0 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
1d2d0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e){.  assert( pP
1d2e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
1d2f0 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  d );.  assert( p
1d300 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e  Pager->dbSize>=n
1d310 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
1d320 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1d330 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
1d340 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  );.  pPager->dbS
1d350 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 61  ize = nPage;.  a
1d360 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
1d370 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 3b  straint(pPager);
1d380 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
1d390 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1d3a0 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
1d3b0 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  ting a hot-journ
1d3c0 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a  al rollback. It.
1d3d0 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75  ** syncs the jou
1d3e0 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73  rnal file to dis
1d3f0 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50 61  k, then sets pPa
1d400 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
1d410 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f  to the.** size o
1d420 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1d430 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  le so that the p
1d440 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
1d450 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a  routine knows.**
1d460 20 74 68 61 74 20 74 68 65 20 65 6e 74 69 72 65   that the entire
1d470 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
1d480 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a  s been synced..*
1d490 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68  *.** Syncing a h
1d4a0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69  ot-journal to di
1d4b0 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  sk before attemp
1d4c0 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20  ting to roll it 
1d4d0 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a  back ensures .**
1d4e0 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
1d4f0 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20  -failure occurs 
1d500 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
1d510 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73  ack, the process
1d520 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74   that.** attempt
1d530 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f  s rollback follo
1d540 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f  wing system reco
1d550 76 65 72 79 20 73 65 65 73 20 74 68 65 20 73 61  very sees the sa
1d560 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f  me journal.** co
1d570 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20 70 72  ntent as this pr
1d580 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ocess..**.** If 
1d590 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
1d5a0 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49  as planned, SQLI
1d5b0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1d5c0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a  d. Otherwise, .*
1d5d0 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  * an SQLite erro
1d5e0 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
1d5f0 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48  c int pagerSyncH
1d600 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  otJournal(Pager 
1d610 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1d620 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d630 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
1d640 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  oSync ){.    rc 
1d650 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
1d660 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
1d670 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
1d680 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1d690 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d6a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1d6b0 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
1d6c0 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  jfd, &pPager->jo
1d6d0 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20  urnalHdr);.  }. 
1d6e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d6f0 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
1d700 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46  e page cache.  F
1d710 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
1d720 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  nd close all fil
1d730 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  es..**.** If a t
1d740 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69  ransaction was i
1d750 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20  n progress when 
1d760 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1d770 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20  called, that.** 
1d780 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
1d790 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c  olled back.  All
1d7a0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
1d7b0 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
1d7c0 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20  ed.** and their 
1d7d0 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e  memory is freed.
1d7e0 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
1d7f0 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f   use a page asso
1d800 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
1d810 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61  his page cache a
1d820 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
1d830 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20  on returns will 
1d840 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
1d850 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
1d860 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
1d870 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65  ion always succe
1d880 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61  eds. If a transa
1d890 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
1d8a0 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73  an attempt.** is
1d8b0 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74   made to roll it
1d8c0 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72   back. If an err
1d8d0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
1d8e0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a   the rollback .*
1d8f0 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * a hot journal 
1d900 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74  may be left in t
1d910 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75  he filesystem bu
1d920 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65  t no error is re
1d930 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65  turned.** to the
1d940 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20   caller..*/.int 
1d950 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
1d960 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
1d970 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28  {.  u8 *pTmp = (
1d980 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  u8 *)pPager->pTm
1d990 70 53 70 61 63 65 3b 0a 0a 20 20 64 69 73 61 62  pSpace;..  disab
1d9a0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
1d9b0 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69  errors();.  sqli
1d9c0 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
1d9d0 6c 6c 6f 63 28 29 3b 0a 20 20 70 50 61 67 65 72  lloc();.  pPager
1d9e0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20  ->errCode = 0;. 
1d9f0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
1da00 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50  veMode = 0;.  pP
1da10 61 67 65 72 2d 3e 73 61 66 65 4a 72 6e 6c 48 61  ager->safeJrnlHa
1da20 6e 64 6c 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  ndle = 0;.#ifnde
1da30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1da40 4c 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c  L.  sqlite3WalCl
1da50 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ose(pPager->pWal
1da60 2c 0a 20 20 20 20 28 70 50 61 67 65 72 2d 3e 6e  ,.    (pPager->n
1da70 6f 53 79 6e 63 20 3f 20 30 20 3a 20 70 50 61 67  oSync ? 0 : pPag
1da80 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 2c  er->sync_flags),
1da90 20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61   .    pPager->pa
1daa0 67 65 53 69 7a 65 2c 20 70 54 6d 70 0a 20 20 29  geSize, pTmp.  )
1dab0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  ;.  pPager->pWal
1dac0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70   = 0;.#endif.  p
1dad0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
1dae0 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  r);.  if( MEMDB 
1daf0 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  ){.    pager_unl
1db00 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ock(pPager);.  }
1db10 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 74  else{.    /* Set
1db20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 48 64   Pager.journalHd
1db30 72 20 74 6f 20 2d 31 20 66 6f 72 20 74 68 65 20  r to -1 for the 
1db40 62 65 6e 65 66 69 74 20 6f 66 20 74 68 65 20 70  benefit of the p
1db50 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
1db60 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 68 69  .    ** call whi
1db70 63 68 20 6d 61 79 20 62 65 20 6d 61 64 65 20 66  ch may be made f
1db80 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
1db90 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
1dba0 6b 28 29 2e 20 49 66 20 69 74 0a 20 20 20 20 2a  k(). If it.    *
1dbb0 2a 20 69 73 20 6e 6f 74 20 2d 31 2c 20 74 68 65  * is not -1, the
1dbc0 6e 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 70  n the unsynced p
1dbd0 6f 72 74 69 6f 6e 20 6f 66 20 61 6e 20 6f 70 65  ortion of an ope
1dbe0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  n journal file m
1dbf0 61 79 0a 20 20 20 20 2a 2a 20 62 65 20 70 6c 61  ay.    ** be pla
1dc00 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  yed back into th
1dc10 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61  e database. If a
1dc20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
1dc30 63 63 75 72 73 20 77 68 69 6c 65 0a 20 20 20 20  ccurs while.    
1dc40 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65  ** this is happe
1dc50 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61  ning, the databa
1dc60 73 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f  se may become co
1dc70 72 72 75 70 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  rrupt..    */.  
1dc80 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
1dc90 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
1dca0 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
1dcb0 64 65 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f  de = pagerSyncHo
1dcc0 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  tJournal(pPager)
1dcd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
1dce0 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
1dcf0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
1dd00 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
1dd10 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e  gnMalloc();.  en
1dd20 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
1dd30 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41  o_errors();.  PA
1dd40 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45  GERTRACE(("CLOSE
1dd50 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1dd60 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54  pPager)));.  IOT
1dd70 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c  RACE(("CLOSE %p\
1dd80 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73  n", pPager)).  s
1dd90 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
1dda0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c  ager->fd);.  sql
1ddb0 69 74 65 33 50 61 67 65 46 72 65 65 28 70 54 6d  ite3PageFree(pTm
1ddc0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  p);.  sqlite3Pca
1ddd0 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  cheClose(pPager-
1dde0 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64  >pPCache);..#ifd
1ddf0 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
1de00 44 45 43 0a 20 20 69 66 28 20 70 50 61 67 65 72  DEC.  if( pPager
1de10 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20 70  ->xCodecFree ) p
1de20 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65  Pager->xCodecFre
1de30 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63  e(pPager->pCodec
1de40 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
1de50 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53  ert( !pPager->aS
1de60 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61  avepoint && !pPa
1de70 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
1de80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73  );.  assert( !is
1de90 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
1dea0 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61  ) && !isOpen(pPa
1deb0 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20  ger->sjfd) );.. 
1dec0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
1ded0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
1dee0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
1def0 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
1df00 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
1df10 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
1df20 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
1df30 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65   number for page
1df40 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71   pPg..*/.Pgno sq
1df50 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
1df60 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 50 67  mber(DbPage *pPg
1df70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  ){.  return pPg-
1df80 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a  >pgno;.}.#endif.
1df90 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
1dfa0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
1dfb0 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50  ount for page pP
1dfc0 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  g..*/.void sqlit
1dfd0 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67  e3PagerRef(DbPag
1dfe0 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74  e *pPg){.  sqlit
1dff0 65 33 50 63 61 63 68 65 52 65 66 28 70 50 67 29  e3PcacheRef(pPg)
1e000 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
1e010 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20  the journal. In 
1e020 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b  other words, mak
1e030 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70  e sure all the p
1e040 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ages that have.*
1e050 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  * been written t
1e060 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  o the journal ha
1e070 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63  ve actually reac
1e080 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20  hed the surface 
1e090 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  of the.** disk a
1e0a0 6e 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  nd can be restor
1e0b0 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
1e0c0 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  of a hot-journal
1e0d0 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
1e0e0 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65   If the Pager.ne
1e0f0 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 6e  edSync flag is n
1e100 6f 74 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69  ot set, then thi
1e110 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 0a  s function is a.
1e120 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77  ** no-op. Otherw
1e130 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73  ise, the actions
1e140 20 72 65 71 75 69 72 65 64 20 64 65 70 65 6e 64   required depend
1e150 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   on the journal-
1e160 6d 6f 64 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20  mode.** and the 
1e170 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
1e180 69 73 74 69 63 73 20 6f 66 20 74 68 65 20 74 68  istics of the th
1e190 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61  e file-system, a
1e1a0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
1e1b0 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72     * If the jour
1e1c0 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69  nal file is an i
1e1d0 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
1e1e0 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e   file, no action
1e1f0 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20   need.**     be 
1e200 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  taken..**.**   *
1e210 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1e220 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e  he device does n
1e230 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53  ot support the S
1e240 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65  AFE_APPEND prope
1e250 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e  rty,.**     then
1e260 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
1e270 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
1e280 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75  ntly written jou
1e290 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20  rnal header.**  
1e2a0 20 20 20 69 73 20 75 70 64 61 74 65 64 20 74 6f     is updated to
1e2b0 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d   contain the num
1e2c0 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72  ber of journal r
1e2d0 65 63 6f 72 64 73 20 74 68 61 74 20 68 61 76 65  ecords that have
1e2e0 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69  .**     been wri
1e2f0 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  tten following i
1e300 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  t. If the pager 
1e310 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  is operating in 
1e320 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20  full-sync.**    
1e330 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
1e340 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
1e350 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68  synced before th
1e360 69 73 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  is field is upda
1e370 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ted..**.**   * I
1e380 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65  f the device doe
1e390 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68  s not support th
1e3a0 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f  e SEQUENTIAL pro
1e3b0 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20  perty, then .** 
1e3c0 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65      journal file
1e3d0 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a   is synced..**.*
1e3e0 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d  * Or, in pseudo-
1e3f0 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  code:.**.**   if
1e400 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79  ( NOT <in-memory
1e410 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20   journal> ){.** 
1e420 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45      if( NOT SAFE
1e430 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20  _APPEND ){.**   
1e440 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79      if( <full-sy
1e450 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63  nc mode> ) xSync
1e460 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29  (<journal file>)
1e470 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61  ;.**       <upda
1e480 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a  te nRec field>.*
1e490 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20  *     } .**     
1e4a0 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49  if( NOT SEQUENTI
1e4b0 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72  AL ) xSync(<jour
1e4c0 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20  nal file>);.**  
1e4d0 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67   }.**.** The Pag
1e4e0 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
1e4f0 20 69 73 20 6e 65 76 65 72 20 62 65 20 73 65 74   is never be set
1e500 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
1e510 69 6c 65 73 2c 20 6f 72 20 61 6e 79 0a 2a 2a 20  iles, or any.** 
1e520 66 69 6c 65 20 6f 70 65 72 61 74 69 6e 67 20 69  file operating i
1e530 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 28  n no-sync mode (
1e540 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 73 65 74  Pager.noSync set
1e550 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 29 2e 0a 2a   to non-zero)..*
1e560 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
1e570 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ul, this routine
1e580 20 63 6c 65 61 72 73 20 74 68 65 20 50 47 48 44   clears the PGHD
1e590 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
1e5a0 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61   of every .** pa
1e5b0 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  ge currently hel
1e5c0 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f  d in memory befo
1e5d0 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  re returning SQL
1e5e0 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f  ITE_OK. If an IO
1e5f0 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63  .** error is enc
1e600 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74  ountered, then t
1e610 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
1e620 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
1e630 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73  the caller..*/.s
1e640 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
1e650 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
1e660 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
1e670 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  er->needSync ){.
1e680 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
1e690 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
1e6a0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1e6b0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
1e6c0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
1e6d0 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
1e6e0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e700 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1e710 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  ode */.      con
1e720 73 74 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c  st int iDc = sql
1e730 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
1e740 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
1e750 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61  er->fd);.      a
1e760 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1e770 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20  ager->jfd) );.. 
1e780 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
1e790 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
1e7a0 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20  FE_APPEND) ){.  
1e7b0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c        /* This bl
1e7c0 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61  ock deals with a
1e7d0 6e 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65  n obscure proble
1e7e0 6d 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20 63  m. If the last c
1e7f0 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20  onnection.      
1e800 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20    ** that wrote 
1e810 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
1e820 20 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69   was operating i
1e830 6e 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75  n persistent-jou
1e840 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
1e850 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a  mode, then the j
1e860 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
1e870 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63  at this point ac
1e880 74 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72  tually be larger
1e890 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e  .        ** than
1e8a0 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
1e8b0 66 20 62 79 74 65 73 2e 20 49 66 20 74 68 65 20  f bytes. If the 
1e8c0 6e 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68  next thing in th
1e8d0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  e journal.      
1e8e0 20 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e    ** file happen
1e8f0 73 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61  s to be a journa
1e900 6c 2d 68 65 61 64 65 72 20 28 77 72 69 74 74 65  l-header (writte
1e910 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  n as part of the
1e920 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76  .        ** prev
1e930 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27  ious connection'
1e940 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  s transaction), 
1e950 61 6e 64 20 61 20 63 72 61 73 68 20 6f 72 20 70  and a crash or p
1e960 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20  ower-failure .  
1e970 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20        ** occurs 
1e980 61 66 74 65 72 20 6e 52 65 63 20 69 73 20 75 70  after nRec is up
1e990 64 61 74 65 64 20 62 75 74 20 62 65 66 6f 72 65  dated but before
1e9a0 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
1e9b0 20 77 72 69 74 65 73 20 0a 20 20 20 20 20 20 20   writes .       
1e9c0 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73   ** anything els
1e9d0 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
1e9e0 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74   file (or commit
1e9f0 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73  s/rolls back its
1ea00 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61   .        ** tra
1ea10 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20  nsaction), then 
1ea20 53 51 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d  SQLite may becom
1ea30 65 20 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20  e confused when 
1ea40 64 6f 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20  doing the .     
1ea50 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61     ** hot-journa
1ea60 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f  l rollback follo
1ea70 77 69 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49  wing recovery. I
1ea80 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20  t may roll back 
1ea90 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  all.        ** o
1eaa0 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  f this connectio
1eab0 6e 73 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72  ns data, then pr
1eac0 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67  oceed to rolling
1ead0 20 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20   back the old,. 
1eae0 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66         ** out-of
1eaf0 2d 64 61 74 65 20 64 61 74 61 20 74 68 61 74 20  -date data that 
1eb00 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61  follows it. Data
1eb10 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
1eb20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1eb30 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61      ** To work a
1eb40 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74  round this, if t
1eb50 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1eb60 64 6f 65 73 20 61 70 70 65 61 72 20 74 6f 20 63  does appear to c
1eb70 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a  ontain.        *
1eb80 2a 20 61 20 76 61 6c 69 64 20 68 65 61 64 65 72  * a valid header
1eb90 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72   following Pager
1eba0 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65  .journalOff, the
1ebb0 6e 20 77 72 69 74 65 20 61 20 30 78 30 30 0a 20  n write a 0x00. 
1ebc0 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74         ** byte t
1ebd0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69  o the start of i
1ebe0 74 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20  t to prevent it 
1ebf0 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67  from being recog
1ec00 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  nized..        *
1ec10 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72  *.        ** Var
1ec20 69 61 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66  iable iNextHdrOf
1ec30 66 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74  fset is set to t
1ec40 68 65 20 6f 66 66 73 65 74 20 61 74 20 77 68 69  he offset at whi
1ec50 63 68 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  ch this.        
1ec60 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68  ** problematic h
1ec70 65 61 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72  eader will occur
1ec80 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20  , if it exists. 
1ec90 61 4d 61 67 69 63 20 69 73 20 75 73 65 64 20 0a  aMagic is used .
1eca0 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20          ** as a 
1ecb0 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72  temporary buffer
1ecc0 20 74 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20   to inspect the 
1ecd0 66 69 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20  first couple of 
1ece0 62 79 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20  bytes of.       
1ecf0 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61   ** the potentia
1ed00 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  l journal header
1ed10 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1ed20 20 20 20 20 20 69 36 34 20 69 4e 65 78 74 48 64       i64 iNextHd
1ed30 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  rOffset;.       
1ed40 20 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20   u8 aMagic[8];. 
1ed50 20 20 20 20 20 20 20 75 38 20 7a 48 65 61 64 65         u8 zHeade
1ed60 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
1ed70 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20  lMagic)+4];..   
1ed80 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61       memcpy(zHea
1ed90 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  der, aJournalMag
1eda0 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
1edb0 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20  nalMagic));.    
1edc0 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
1edd0 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
1ede0 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70  ournalMagic)], p
1edf0 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20  Pager->nRec);.. 
1ee00 20 20 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f         iNextHdrO
1ee10 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48  ffset = journalH
1ee20 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
1ee30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1ee40 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
1ee50 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
1ee60 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66  , 8, iNextHdrOff
1ee70 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  set);.        if
1ee80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ee90 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61  && 0==memcmp(aMa
1eea0 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
1eeb0 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20  ic, 8) ){.      
1eec0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1eed0 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30   u8 zerobyte = 0
1eee0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1eef0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
1ef00 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65  pPager->jfd, &ze
1ef10 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74  robyte, 1, iNext
1ef20 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  HdrOffset);.    
1ef30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1ef40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ef50 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  && rc!=SQLITE_IO
1ef60 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1ef70 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
1ef80 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
1ef90 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ..        /* Wri
1efa0 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  te the nRec valu
1efb0 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
1efc0 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  al file header. 
1efd0 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  If in.        **
1efe0 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75   full-synchronou
1eff0 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65  s mode, sync the
1f000 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20   journal first. 
1f010 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
1f020 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c  t.        ** all
1f030 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79   data has really
1f040 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65   hit the disk be
1f050 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64  fore nRec is upd
1f060 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20  ated to mark.   
1f070 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20       ** it as a 
1f080 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f  candidate for ro
1f090 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20  llback..        
1f0a0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
1f0b0 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
1f0c0 65 64 20 69 66 20 74 68 65 20 70 65 72 73 69 73  ed if the persis
1f0d0 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f  tent media suppo
1f0e0 72 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  rts the.        
1f0f0 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70  ** SAFE_APPEND p
1f100 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73 65  roperty. Because
1f110 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   in this case it
1f120 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
1f130 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72   .        ** for
1f140 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74 6f   garbage data to
1f150 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20   be appended to 
1f160 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52  the file, the nR
1f170 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20  ec field.       
1f180 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64   ** is populated
1f190 20 77 69 74 68 20 30 78 46 46 46 46 46 46 46 46   with 0xFFFFFFFF
1f1a0 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
1f1b0 6c 20 68 65 61 64 65 72 20 69 73 20 77 72 69 74  l header is writ
1f1c0 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ten.        ** a
1f1d0 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74  nd never needs t
1f1e0 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20  o be updated..  
1f1f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1f200 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
1f210 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63  lSync && 0==(iDc
1f220 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
1f230 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
1f240 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
1f250 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E(("SYNC journal
1f260 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
1f270 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
1f280 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
1f290 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  ("JSYNC %p\n", p
1f2a0 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
1f2b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1f2c0 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
1f2d0 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
1f2e0 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20  lags);.         
1f2f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f300 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1f310 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f320 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
1f330 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61   %p %lld\n", pPa
1f340 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
1f350 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20 20  rnalHdr));.     
1f360 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1f370 73 57 72 69 74 65 28 0a 20 20 20 20 20 20 20 20  sWrite(.        
1f380 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c      pPager->jfd,
1f390 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66   zHeader, sizeof
1f3a0 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67 65  (zHeader), pPage
1f3b0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20  r->journalHdr.  
1f3c0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
1f3d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f3e0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1f3f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1f400 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
1f410 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
1f420 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41  L) ){.        PA
1f430 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20  GERTRACE(("SYNC 
1f440 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
1f450 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1f460 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54  )));.        IOT
1f470 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
1f480 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
1f490 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f4a0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
1f4b0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
1f4c0 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20  c_flags| .      
1f4d0 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e      (pPager->syn
1f4e0 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  c_flags==SQLITE_
1f4f0 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45  SYNC_FULL?SQLITE
1f500 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30  _SYNC_DATAONLY:0
1f510 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
1f520 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1f530 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1f540 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1f550 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f  }..    /* The jo
1f560 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a  urnal file was j
1f570 75 73 74 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ust successfully
1f580 20 73 79 6e 63 65 64 2e 20 53 65 74 20 50 61 67   synced. Set Pag
1f590 65 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20 20  er.needSync .   
1f5a0 20 2a 2a 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20   ** to zero and 
1f5b0 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f  clear the PGHDR_
1f5c0 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f  NEED_SYNC flag o
1f5d0 6e 20 61 6c 6c 20 70 61 67 65 73 73 2e 0a 20 20  n all pagess..  
1f5e0 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
1f5f0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
1f600 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1f610 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20  alStarted = 1;. 
1f620 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1f630 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
1f640 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
1f650 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
1f660 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67  arSyncFlags(pPag
1f670 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
1f680 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
1f690 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1f6a0 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
1f6b0 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c  the first in a l
1f6c0 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69  inked list of di
1f6d0 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63  rty pages connec
1f6e0 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67  ted.** by the Pg
1f6f0 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74  Hdr.pDirty point
1f700 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
1f710 6e 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e  n writes each on
1f720 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d  e of the.** in-m
1f730 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74  emory pages in t
1f740 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64  he list to the d
1f750 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
1f760 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a  e argument may.*
1f770 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65  * be NULL, repre
1f780 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79  senting an empty
1f790 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63   list. In this c
1f7a0 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ase this functio
1f7b0 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e  n is.** a no-op.
1f7c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
1f7d0 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65   must hold at le
1f7e0 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  ast a RESERVED l
1f7f0 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75  ock when this fu
1f800 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c  nction.** is cal
1f810 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74  led. Before writ
1f820 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20  ing anything to 
1f830 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f840 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20  e, this lock.** 
1f850 69 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61  is upgraded to a
1f860 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
1f870 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61  . If the lock ca
1f880 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64  nnot be obtained
1f890 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ,.** SQLITE_BUSY
1f8a0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1f8b0 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74   no data is writ
1f8c0 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
1f8d0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
1f8e0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
1f8f0 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67   a temp-file pag
1f900 65 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61  er and the actua
1f910 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69  l file-system fi
1f920 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74  le.** is not yet
1f930 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65   open, it is cre
1f940 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
1f950 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
1f960 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f  is .** written o
1f970 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  ut..**.** Once t
1f980 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  he lock has been
1f990 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69   upgraded and, i
1f9a0 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65  f necessary, the
1f9b0 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a   file opened,.**
1f9c0 20 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77   the pages are w
1f9d0 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
1f9e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f9f0 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57  in list order. W
1fa00 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65  riting.** a page
1fa10 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69   is skipped if i
1fa20 74 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f  t meets either o
1fa30 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1fa40 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20  criteria:.**.** 
1fa50 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d    * The page num
1fa60 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
1fa70 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
1fa80 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20  , or.**   * The 
1fa90 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
1faa0 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
1fab0 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
1fac0 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61  If writing out a
1fad0 20 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65   page causes the
1fae0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1faf0 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62  o grow, Pager.db
1fb00 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75  FileSize.** is u
1fb10 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  pdated according
1fb20 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73  ly. If page 1 is
1fb30 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68   written out, th
1fb40 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63  en the value cac
1fb50 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e  hed.** in Pager.
1fb60 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
1fb70 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68  updated to match
1fb80 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73   the new value s
1fb90 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  tored in.** the 
1fba0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1fbb0 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
1fbc0 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
1fbd0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1fbe0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
1fbf0 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  O error .** occu
1fc00 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  rs, an IO error 
1fc10 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1fc20 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43  . Or, if the EXC
1fc30 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e  LUSIVE lock cann
1fc40 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65  ot.** be obtaine
1fc50 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  d, SQLITE_BUSY i
1fc60 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1fc70 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1fc80 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50  write_pagelist(P
1fc90 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20  gHdr *pList){.  
1fca0 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
1fcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcc0 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
1fcd0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ject */.  int rc
1fce0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fd00 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1fd10 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 4c  ..  if( NEVER(pL
1fd20 69 73 74 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  ist==0) ) return
1fd30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50   SQLITE_OK;.  pP
1fd40 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50  ager = pList->pP
1fd50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74  ager;..  /* At t
1fd60 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20  his point there 
1fd70 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20  may be either a 
1fd80 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
1fd90 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
1fda0 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
1fdb0 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
1fdc0 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43  s already an EXC
1fdd0 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65  LUSIVE lock, the
1fde0 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20   following.  ** 
1fdf0 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
1fe00 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e  .  **.  ** Movin
1fe10 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20  g the lock from 
1fe20 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c  RESERVED to EXCL
1fe30 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69  USIVE actually i
1fe40 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20  nvolves going.  
1fe50 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e  ** through an in
1fe60 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
1fe70 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45   PENDING.   A PE
1fe80 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65  NDING lock preve
1fe90 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61  nts new.  ** rea
1fea0 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68  ders from attach
1feb0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
1fec0 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66  ase but is unsuf
1fed0 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74  ficient for us t
1fee0 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54  o.  ** write.  T
1fef0 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e  he idea of a PEN
1ff00 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20  DING lock is to 
1ff10 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64  prevent new read
1ff20 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f  ers from.  ** co
1ff30 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65  ming in while we
1ff40 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69   wait for existi
1ff50 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c  ng readers to cl
1ff60 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ear..  **.  ** W
1ff70 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69  hile the pager i
1ff80 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45  s in the RESERVE
1ff90 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69  D state, the ori
1ffa0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
1ffb0 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68  ile.  ** is unch
1ffc0 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e  anged and we can
1ffd0 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75   rollback withou
1ffe0 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79  t having to play
1fff0 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  back the.  ** jo
20000 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f  urnal into the o
20010 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
20020 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20   file.  Once we 
20030 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20  transition to.  
20040 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74  ** EXCLUSIVE, it
20050 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
20060 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  ase file has bee
20070 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e  n changed and an
20080 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  y rollback.  ** 
20090 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a  will require a j
200a0 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e  ournal playback.
200b0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
200c0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 4c 69  !pagerUseWal(pLi
200d0 73 74 2d 3e 70 50 61 67 65 72 29 20 29 3b 0a 20  st->pPager) );. 
200e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
200f0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
20100 53 45 52 56 45 44 20 29 3b 0a 20 20 72 63 20 3d  SERVED );.  rc =
20110 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
20120 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
20130 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 0a 20 20  USIVE_LOCK);..  
20140 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
20150 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61  s a temp-file ha
20160 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  s not yet been o
20170 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e  pened, open it n
20180 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e  ow. It.  ** is n
20190 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
201a0 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74  rc to be other t
201b0 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  han SQLITE_OK if
201c0 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a   this branch.  *
201d0 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70  * is taken, as p
201e0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
201f0 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  k() is a no-op f
20200 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20  or temp-files.. 
20210 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65   */.  if( !isOpe
20220 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
20230 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
20240 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26  ger->tempFile &&
20250 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20260 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
20270 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c  Opentemp(pPager,
20280 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61   pPager->fd, pPa
20290 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a  ger->vfsFlags);.
202a0 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65    }..  /* Before
202b0 20 74 68 65 20 66 69 72 73 74 20 77 72 69 74 65   the first write
202c0 2c 20 67 69 76 65 20 74 68 65 20 56 46 53 20 61  , give the VFS a
202d0 20 68 69 6e 74 20 6f 66 20 77 68 61 74 20 74 68   hint of what th
202e0 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  e final.  ** fil
202f0 65 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a  e size will be..
20300 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
20310 72 2d 3e 64 62 53 69 7a 65 20 3e 20 28 70 50 61  r->dbSize > (pPa
20320 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2b  ger->dbOrigSize+
20330 31 29 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  1) && isOpen(pPa
20340 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
20350 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
20360 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  File = pPager->p
20370 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74  ageSize * (sqlit
20380 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d  e3_int64)pPager-
20390 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c  >dbSize;.    sql
203a0 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
203b0 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  l(pPager->fd, SQ
203c0 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
203d0 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a  HINT, &szFile);.
203e0 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63    }..  while( rc
203f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
20400 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f  List ){.    Pgno
20410 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70   pgno = pList->p
20420 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  gno;..    /* If 
20430 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20  there are dirty 
20440 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
20450 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67  e cache with pag
20460 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65  e numbers greate
20470 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61  r.    ** than Pa
20480 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73  ger.dbSize, this
20490 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61   means sqlite3Pa
204a0 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
204b0 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  () was called to
204c0 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65  .    ** make the
204d0 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70   file smaller (p
204e0 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74  resumably by aut
204f0 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20  o-vacuum code). 
20500 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20  Do not write.   
20510 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67   ** any such pag
20520 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a  es to the file..
20530 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
20540 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65  so, do not write
20550 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74 68   out any page th
20560 61 74 20 68 61 73 20 74 68 65 20 50 47 48 44 52  at has the PGHDR
20570 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67  _DONT_WRITE flag
20580 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74  .    ** set (set
20590 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72   by sqlite3Pager
205a0 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20  DontWrite())..  
205b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e    */.    if( pgn
205c0 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o<=pPager->dbSiz
205d0 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e  e && 0==(pList->
205e0 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54  flags&PGHDR_DONT
205f0 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20  _WRITE) ){.     
20600 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70   i64 offset = (p
20610 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
20620 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20  er->pageSize;   
20630 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69  /* Offset to wri
20640 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  te */.      char
20650 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20   *pData;        
20660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
20680 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20  ta to write */  
20690 20 20 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63    ..      /* Enc
206a0 6f 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ode the database
206b0 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32   */.      CODEC2
206c0 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e  (pPager, pList->
206d0 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20  pData, pgno, 6, 
206e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
206f0 4d 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20  MEM, pData);..  
20700 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74      /* Write out
20710 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 20   the page data. 
20720 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
20730 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
20740 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20  ger->fd, pData, 
20750 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
20760 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20  , offset);..    
20770 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77    /* If page 1 w
20780 61 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c  as just written,
20790 20 75 70 64 61 74 65 20 50 61 67 65 72 2e 64 62   update Pager.db
207a0 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63  FileVers to matc
207b0 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76  h.      ** the v
207c0 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20  alue now stored 
207d0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
207e0 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67  file. If writing
207f0 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20   this .      ** 
20800 70 61 67 65 20 63 61 75 73 65 64 20 74 68 65 20  page caused the 
20810 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
20820 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62   grow, update db
20830 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20  FileSize. .     
20840 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67   */.      if( pg
20850 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  no==1 ){.       
20860 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
20870 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44  >dbFileVers, &pD
20880 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28  ata[24], sizeof(
20890 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
208a0 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rs));.      }.  
208b0 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
208c0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
208d0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
208e0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
208f0 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  pgno;.      }.. 
20900 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61       /* Update a
20910 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  ny backup object
20920 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f  s copying the co
20930 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70  ntents of this p
20940 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73  ager. */.      s
20950 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
20960 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
20970 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70  up, pgno, (u8*)p
20980 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20  List->pData);.. 
20990 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
209a0 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  ("STORE %d page 
209b0 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
209c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
209d0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
209e0 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
209f0 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
20a00 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  )));.      IOTRA
20a10 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64  CE(("PGOUT %p %d
20a20 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
20a30 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  o));.      PAGER
20a40 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
20a50 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
20a60 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  t);.      PAGER_
20a70 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72  INCR(pPager->nWr
20a80 69 74 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ite);.    }else{
20a90 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
20aa0 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70  E(("NOSTORE %d p
20ab0 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
20ac0 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
20ad0 29 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  ));.    }.#ifdef
20ae0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
20af0 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70  GES.    pList->p
20b00 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
20b10 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b  pagehash(pList);
20b20 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73  .#endif.    pLis
20b30 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
20b40 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  y;.  }..  return
20b50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e   rc;.}../*.** En
20b60 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73 75  sure that the su
20b70 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  b-journal file i
20b80 73 20 6f 70 65 6e 2e 20 49 66 20 69 74 20 69 73  s open. If it is
20b90 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74   already open, t
20ba0 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
20bb0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
20bc0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
20bd0 72 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72  returned if ever
20be0 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f  ything goes acco
20bf0 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41  rding to plan. A
20c00 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45  n .** SQLITE_IOE
20c10 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64  RR_XXX error cod
20c20 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
20c30 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
20c40 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66  e3OsOpen() .** f
20c50 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
20c60 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e  int openSubJourn
20c70 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
20c80 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
20c90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21  LITE_OK;.  if( !
20ca0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
20cb0 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20  jfd) ){.    if( 
20cc0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
20cd0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
20ce0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c  ALMODE_MEMORY ||
20cf0 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d   pPager->subjInM
20d00 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 73  emory ){.      s
20d10 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
20d20 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
20d30 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
20d40 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f       rc = pagerO
20d50 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20  pentemp(pPager, 
20d60 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51  pPager->sjfd, SQ
20d70 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
20d80 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  RNAL);.    }.  }
20d90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20da0 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
20db0 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75  record of the cu
20dc0 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70  rrent state of p
20dd0 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20 73  age pPg to the s
20de0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20  ub-journal. .** 
20df0 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72  It is the caller
20e00 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  s responsibility
20e10 20 74 6f 20 75 73 65 20 73 75 62 6a 52 65 71 75   to use subjRequ
20e20 69 72 65 73 50 61 67 65 28 29 20 74 6f 20 63 68  iresPage() to ch
20e30 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74 20  eck .** that it 
20e40 69 73 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72  is really requir
20e50 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ed before callin
20e60 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  g this function.
20e70 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
20e80 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69  sful, set the bi
20e90 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
20ea0 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20  to pPg->pgno in 
20eb0 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66  the bitvecs.** f
20ec0 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  or all open save
20ed0 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65  points before re
20ee0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  turning..**.** T
20ef0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
20f00 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urns SQLITE_OK i
20f10 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
20f20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49  successful, an I
20f30 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  O.** error code 
20f40 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  if the attempt t
20f50 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 73  o write to the s
20f60 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73  ub-journal fails
20f70 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  , or .** SQLITE_
20f80 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f  NOMEM if a mallo
20f90 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65  c fails while se
20fa0 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61  tting a bit in a
20fb0 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69   savepoint.** bi
20fc0 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tvec..*/.static 
20fd0 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  int subjournalPa
20fe0 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
20ff0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
21000 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
21010 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
21020 67 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ger;.  if( pPage
21030 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
21040 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
21050 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a  E_OFF ){..    /*
21060 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f   Open the sub-jo
21070 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 68 61 73  urnal, if it has
21080 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65   not already bee
21090 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20  n opened */.    
210a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
210b0 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
210c0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
210d0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c  (pPager->jfd) ||
210e0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
210f0 67 65 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ger) );.    asse
21100 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
21110 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61 67  r->sjfd) || pPag
21120 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29  er->nSubRec==0 )
21130 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61  ;.    assert( pa
21140 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
21150 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  ) .         || p
21160 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67  ageInJournal(pPg
21170 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  ) .         || p
21180 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
21190 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20  >dbOrigSize .   
211a0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65   );.    rc = ope
211b0 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67  nSubJournal(pPag
211c0 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  er);..    /* If 
211d0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
211e0 77 61 73 20 6f 70 65 6e 65 64 20 73 75 63 63 65  was opened succe
211f0 73 73 66 75 6c 6c 79 20 28 6f 72 20 77 61 73 20  ssfully (or was 
21200 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20  already open),. 
21210 20 20 20 2a 2a 20 77 72 69 74 65 20 74 68 65 20     ** write the 
21220 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 69  journal record i
21230 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 2a  nto the file.  *
21240 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
21250 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21260 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70   void *pData = p
21270 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20  Pg->pData;.     
21280 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70 50   i64 offset = pP
21290 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34  ager->nSubRec*(4
212a0 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
212b0 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  e);.      char *
212c0 70 44 61 74 61 32 3b 0a 20 20 0a 20 20 20 20 20  pData2;.  .     
212d0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
212e0 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
212f0 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 7, return SQLI
21300 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32  TE_NOMEM, pData2
21310 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  );.      PAGERTR
21320 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE(("STMT-JOURN
21330 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
21340 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
21350 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
21360 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
21370 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73  32bits(pPager->s
21380 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67  jfd, offset, pPg
21390 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  ->pgno);.      i
213a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
213b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
213c0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
213d0 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44  pPager->sjfd, pD
213e0 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61  ata2, pPager->pa
213f0 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34  geSize, offset+4
21400 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
21410 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
21420 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21430 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b  pPager->nSubRec+
21440 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  +;.    assert( p
21450 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
21460 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  t>0 );.    rc = 
21470 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
21480 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50  tvecs(pPager, pP
21490 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  g->pgno);.  }.  
214a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
214b0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
214c0 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  n is called by t
214d0 68 65 20 70 63 61 63 68 65 20 6c 61 79 65 72 20  he pcache layer 
214e0 77 68 65 6e 20 69 74 20 68 61 73 20 72 65 61 63  when it has reac
214f0 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74  hed some.** soft
21500 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54   memory limit. T
21510 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
21520 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
21530 6f 20 61 20 50 61 67 65 72 20 6f 62 6a 65 63 74  o a Pager object
21540 0a 2a 2a 20 28 63 61 73 74 20 61 73 20 61 20 76  .** (cast as a v
21550 6f 69 64 2a 29 2e 20 54 68 65 20 70 61 67 65 72  oid*). The pager
21560 20 69 73 20 61 6c 77 61 79 73 20 27 70 75 72 67   is always 'purg
21570 65 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69  eable' (not an i
21580 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61  n-memory.** data
21590 62 61 73 65 29 2e 20 54 68 65 20 73 65 63 6f 6e  base). The secon
215a0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  d argument is a 
215b0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 70  reference to a p
215c0 61 67 65 20 74 68 61 74 20 69 73 20 0a 2a 2a 20  age that is .** 
215d0 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20  currently dirty 
215e0 62 75 74 20 68 61 73 20 6e 6f 20 6f 75 74 73 74  but has no outst
215f0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
21600 73 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a 20 69  s. The page.** i
21610 73 20 61 6c 77 61 79 73 20 61 73 73 6f 63 69 61  s always associa
21620 74 65 64 20 77 69 74 68 20 74 68 65 20 50 61 67  ted with the Pag
21630 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  er object passed
21640 20 61 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a   as the first .*
21650 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  * argument..**.*
21660 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69  * The job of thi
21670 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f  s function is to
21680 20 6d 61 6b 65 20 70 50 67 20 63 6c 65 61 6e 20   make pPg clean 
21690 62 79 20 77 72 69 74 69 6e 67 20 69 74 73 20 63  by writing its c
216a0 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74  ontents.** out t
216b0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
216c0 69 6c 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65  ile, if possible
216d0 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c  . This may invol
216e0 76 65 20 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a  ve syncing the.*
216f0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
21700 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
21710 73 66 75 6c 2c 20 73 71 6c 69 74 65 33 50 63 61  sful, sqlite3Pca
21720 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69  cheMakeClean() i
21730 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
21740 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  page and.** SQLI
21750 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
21760 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
21770 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
21780 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a  ng to make the.*
21790 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c 20 74 68  * page clean, th
217a0 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
217b0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
217c0 74 68 65 20 70 61 67 65 20 63 61 6e 6e 6f 74 20  the page cannot 
217d0 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e  be.** made clean
217e0 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20   for some other 
217f0 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65  reason, but no e
21800 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
21810 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  n SQLITE_OK.** i
21820 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  s returned by sq
21830 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
21840 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74 20 63 61  lean() is not ca
21850 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
21860 69 6e 74 20 70 61 67 65 72 53 74 72 65 73 73 28  int pagerStress(
21870 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a  void *p, PgHdr *
21880 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
21890 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a  Pager = (Pager *
218a0 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  )p;.  int rc = S
218b0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
218c0 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
218d0 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73  ==pPager );.  as
218e0 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73  sert( pPg->flags
218f0 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a  &PGHDR_DIRTY );.
21900 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d  .  pPg->pDirty =
21910 20 30 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55   0;.  if( pagerU
21920 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
21930 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  .    /* Write a 
21940 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72  single frame for
21950 20 74 68 69 73 20 70 61 67 65 20 74 6f 20 74 68   this page to th
21960 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 69 66  e log. */.    if
21970 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  ( subjRequiresPa
21980 67 65 28 70 50 67 29 20 29 7b 20 0a 20 20 20 20  ge(pPg) ){ .    
21990 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61    rc = subjourna
219a0 6c 50 61 67 65 28 70 50 67 29 3b 20 0a 20 20 20  lPage(pPg); .   
219b0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
219c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
219d0 20 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46    rc = pagerWalF
219e0 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50  rames(pPager, pP
219f0 67 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  g, 0, 0, 0);.   
21a00 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
21a10 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79 6e 63  /* The doNotSync
21a20 20 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20   flag is set by 
21a30 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  the sqlite3Pager
21a40 57 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f 6e  Write() function
21a50 20 77 68 69 6c 65 20 69 74 0a 20 20 20 20 2a 2a   while it.    **
21a60 20 69 73 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20   is journalling 
21a70 61 20 73 65 74 20 6f 66 20 74 77 6f 20 6f 72 20  a set of two or 
21a80 6d 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61  more database pa
21a90 67 65 73 20 74 68 61 74 20 61 72 65 20 73 74 6f  ges that are sto
21aa0 72 65 64 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  red.    ** on th
21ab0 65 20 73 61 6d 65 20 64 69 73 6b 20 73 65 63 74  e same disk sect
21ac0 6f 72 2e 20 53 79 6e 63 69 6e 67 20 74 68 65 20  or. Syncing the 
21ad0 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61  journal is not a
21ae0 6c 6c 6f 77 65 64 20 77 68 69 6c 65 0a 20 20 20  llowed while.   
21af0 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70   ** this is happ
21b00 65 6e 69 6e 67 20 61 73 20 69 74 20 69 73 20 69  ening as it is i
21b10 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c  mportant that al
21b20 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20 73 75 63  l members of suc
21b30 68 20 61 0a 20 20 20 20 2a 2a 20 73 65 74 20 6f  h a.    ** set o
21b40 66 20 70 61 67 65 73 20 61 72 65 20 73 79 6e 63  f pages are sync
21b50 65 64 20 74 6f 20 64 69 73 6b 20 74 6f 67 65 74  ed to disk toget
21b60 68 65 72 2e 20 53 6f 2c 20 69 66 20 74 68 65 20  her. So, if the 
21b70 70 61 67 65 20 74 68 69 73 20 66 75 6e 63 74 69  page this functi
21b80 6f 6e 0a 20 20 20 20 2a 2a 20 69 73 20 74 72 79  on.    ** is try
21b90 69 6e 67 20 74 6f 20 6d 61 6b 65 20 63 6c 65 61  ing to make clea
21ba0 6e 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61  n will require a
21bb0 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 61 6e   journal sync an
21bc0 64 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 0a  d the doNotSync.
21bd0 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73      ** flag is s
21be0 65 74 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f  et, return witho
21bf0 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
21c00 67 2e 20 54 68 65 20 70 63 61 63 68 65 20 6c 61  g. The pcache la
21c10 79 65 72 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  yer will.    ** 
21c20 6a 75 73 74 20 68 61 76 65 20 74 6f 20 67 6f 20  just have to go 
21c30 61 68 65 61 64 20 61 6e 64 20 61 6c 6c 6f 63 61  ahead and alloca
21c40 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 62 75  te a new page bu
21c50 66 66 65 72 20 69 6e 73 74 65 61 64 20 6f 66 0a  ffer instead of.
21c60 20 20 20 20 2a 2a 20 72 65 75 73 69 6e 67 20 70      ** reusing p
21c70 50 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  Pg..    **.    *
21c80 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 66 20  * Similarly, if 
21c90 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
21ca0 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
21cb0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64  e error state, d
21cc0 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 72 79  o not.    ** try
21cd0 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 6f   to write the co
21ce0 6e 74 65 6e 74 73 20 6f 66 20 70 50 67 20 74 6f  ntents of pPg to
21cf0 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   disk..    */.  
21d00 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
21d10 65 72 2d 3e 65 72 72 43 6f 64 65 29 0a 20 20 20  er->errCode).   
21d20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 64 6f    || (pPager->do
21d30 4e 6f 74 53 79 6e 63 20 26 26 20 70 50 67 2d 3e  NotSync && pPg->
21d40 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
21d50 5f 53 59 4e 43 29 0a 20 20 20 20 29 7b 0a 20 20  _SYNC).    ){.  
21d60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21d70 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  E_OK;.    }.  . 
21d80 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a     /* Sync the j
21d90 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72  ournal file if r
21da0 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
21db0 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  if( pPg->flags&P
21dc0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29  GHDR_NEED_SYNC )
21dd0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e  {.      rc = syn
21de0 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
21df0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
21e00 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
21e10 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26  ger->fullSync &&
21e20 20 0a 20 20 20 20 20 20 20 20 21 28 70 50 61 67   .        !(pPag
21e30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
21e40 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
21e50 44 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a 20 20  DE_MEMORY) &&.  
21e60 20 20 20 20 20 20 21 28 73 71 6c 69 74 65 33 4f        !(sqlite3O
21e70 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
21e80 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
21e90 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  d)&SQLITE_IOCAP_
21ea0 53 41 46 45 5f 41 50 50 45 4e 44 29 0a 20 20 20  SAFE_APPEND).   
21eb0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50     ){.        pP
21ec0 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
21ed0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
21ee0 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
21ef0 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ger);.      }.  
21f00 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
21f10 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
21f20 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 69 73   of this page is
21f30 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
21f40 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
21f50 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
21f60 62 61 73 65 20 69 6d 61 67 65 2c 20 69 74 20 6d  base image, it m
21f70 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 77 72  ay need to be wr
21f80 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62  itten to the sub
21f90 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a  -journal..    **
21fa0 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
21fb0 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 70 61 67   the call to pag
21fc0 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
21fd0 74 28 29 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e  t() below will n
21fe0 6f 74 0a 20 20 20 20 2a 2a 20 61 63 74 75 61 6c  ot.    ** actual
21ff0 6c 79 20 77 72 69 74 65 20 64 61 74 61 20 74 6f  ly write data to
22000 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74 68 69   the file in thi
22010 73 20 63 61 73 65 2e 0a 20 20 20 20 2a 2a 0a 20  s case..    **. 
22020 20 20 20 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74     ** Consider t
22030 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71  he following seq
22040 75 65 6e 63 65 20 6f 66 20 65 76 65 6e 74 73 3a  uence of events:
22050 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
22060 20 42 45 47 49 4e 3b 0a 20 20 20 20 2a 2a 20 20   BEGIN;.    **  
22070 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65     <journal page
22080 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c   X>.    **     <
22090 6d 6f 64 69 66 79 20 70 61 67 65 20 58 3e 0a 20  modify page X>. 
220a0 20 20 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f     **     SAVEPO
220b0 49 4e 54 20 73 70 3b 0a 20 20 20 20 2a 2a 20 20  INT sp;.    **  
220c0 20 20 20 20 20 3c 73 68 72 69 6e 6b 20 64 61 74       <shrink dat
220d0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 59 20  abase file to Y 
220e0 70 61 67 65 73 3e 0a 20 20 20 20 2a 2a 20 20 20  pages>.    **   
220f0 20 20 20 20 70 61 67 65 72 53 74 72 65 73 73 28      pagerStress(
22100 70 61 67 65 20 58 29 0a 20 20 20 20 2a 2a 20 20  page X).    **  
22110 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73     ROLLBACK TO s
22120 70 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  p;.    **.    **
22130 20 49 66 20 28 58 3e 59 29 2c 20 74 68 65 6e 20   If (X>Y), then 
22140 77 68 65 6e 20 70 61 67 65 72 53 74 72 65 73 73  when pagerStress
22150 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67 65 20   is called page 
22160 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72  X will not be wr
22170 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 6f 75 74  itten.    ** out
22180 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
22190 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20   file, but will 
221a0 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20  be dropped from 
221b0 74 68 65 20 63 61 63 68 65 2e 20 54 68 65 6e 2c  the cache. Then,
221c0 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  .    ** followin
221d0 67 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20  g the "ROLLBACK 
221e0 54 4f 20 73 70 22 20 73 74 61 74 65 6d 65 6e 74  TO sp" statement
221f0 2c 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 58  , reading page X
22200 20 77 69 6c 6c 20 72 65 61 64 0a 20 20 20 20 2a   will read.    *
22210 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
22220 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
22230 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
22240 63 6f 70 79 20 6f 66 20 70 61 67 65 20 58 20 61  copy of page X a
22250 73 20 69 74 0a 20 20 20 20 2a 2a 20 77 61 73 20  s it.    ** was 
22260 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
22270 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 6e 6f  tion started, no
22280 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e  t as it was when
22290 20 22 53 41 56 45 50 4f 49 4e 54 20 73 70 22 0a   "SAVEPOINT sp".
222a0 20 20 20 20 2a 2a 20 77 61 73 20 65 78 65 63 75      ** was execu
222b0 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ted..    **.    
222c0 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  ** The solution 
222d0 69 73 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  is to write the 
222e0 63 75 72 72 65 6e 74 20 64 61 74 61 20 66 6f 72  current data for
222f0 20 70 61 67 65 20 58 20 69 6e 74 6f 20 74 68 65   page X into the
22300 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d 6a 6f 75   .    ** sub-jou
22310 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20 28 69  rnal file now (i
22320 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
22330 61 64 79 20 74 68 65 72 65 29 2c 20 73 6f 20 74  ady there), so t
22340 68 61 74 20 69 74 20 77 69 6c 6c 0a 20 20 20 20  hat it will.    
22350 2a 2a 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  ** be restored t
22360 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61  o its current va
22370 6c 75 65 20 77 68 65 6e 20 74 68 65 20 22 52 4f  lue when the "RO
22380 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 69 73  LLBACK TO sp" is
22390 20 0a 20 20 20 20 2a 2a 20 65 78 65 63 75 74 65   .    ** execute
223a0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
223b0 28 20 4e 45 56 45 52 28 0a 20 20 20 20 20 20 20  ( NEVER(.       
223c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
223d0 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  & pPg->pgno>pPag
223e0 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 73 75  er->dbSize && su
223f0 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
22400 50 67 29 0a 20 20 20 20 29 20 29 7b 0a 20 20 20  Pg).    ) ){.   
22410 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e     rc = subjourn
22420 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  alPage(pPg);.   
22430 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69   }.  .    /* Wri
22440 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
22450 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75 74 20  of the page out 
22460 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
22470 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
22480 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22490 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
224a0 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
224b0 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  t(pPg);.    }.  
224c0 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  }..  /* Mark the
224d0 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20   page as clean. 
224e0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
224f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41  ITE_OK ){.    PA
22500 47 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53  GERTRACE(("STRES
22510 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  S %d page %d\n",
22520 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
22530 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
22540 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
22550 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
22560 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61    }..  return pa
22570 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
22580 2c 20 72 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  , rc);.}.../*.**
22590 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
225a0 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50  itialize a new P
225b0 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20  ager object and 
225c0 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  put a pointer to
225d0 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67   it.** in *ppPag
225e0 65 72 2e 20 54 68 65 20 70 61 67 65 72 20 73 68  er. The pager sh
225f0 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20  ould eventually 
22600 62 65 20 66 72 65 65 64 20 62 79 20 70 61 73 73  be freed by pass
22610 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c  ing it.** to sql
22620 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29  ite3PagerClose()
22630 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c  ..**.** The zFil
22640 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69  ename argument i
22650 73 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68  s the path to th
22660 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
22670 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a  to open..** If z
22680 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
22690 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79   then a randomly
226a0 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79  -named temporary
226b0 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
226c0 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20  .** and used as 
226d0 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  the file to be c
226e0 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79  ached. Temporary
226f0 20 66 69 6c 65 73 20 61 72 65 20 62 65 20 64 65   files are be de
22700 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74  leted.** automat
22710 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79  ically when they
22720 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20   are closed. If 
22730 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
22740 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a  emory:" then .**
22750 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
22760 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68   is held in cach
22770 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20 77  e. It is never w
22780 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20  ritten to disk. 
22790 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20  .** This can be 
227a0 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
227b0 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  t an in-memory d
227c0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
227d0 68 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65  he nExtra parame
227e0 74 65 72 20 73 70 65 63 69 66 69 65 73 20 74 68  ter specifies th
227f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
22800 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63  s of space alloc
22810 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69  ated.** along wi
22820 74 68 20 65 61 63 68 20 70 61 67 65 20 72 65 66  th each page ref
22830 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61  erence. This spa
22840 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ce is available 
22850 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76  to the user.** v
22860 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  ia the sqlite3Pa
22870 67 65 72 47 65 74 45 78 74 72 61 28 29 20 41 50  gerGetExtra() AP
22880 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  I..**.** The fla
22890 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75  gs argument is u
228a0 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70  sed to specify p
228b0 72 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61  roperties that a
228c0 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65  ffect the.** ope
228d0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  ration of the pa
228e0 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62  ger. It should b
228f0 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69  e passed some bi
22900 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f  twise combinatio
22910 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45  n.** of the PAGE
22920 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61  R_OMIT_JOURNAL a
22930 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44  nd PAGER_NO_READ
22940 4c 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  LOCK flags..**.*
22950 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70  * The vfsFlags p
22960 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
22970 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f  tmask to pass to
22980 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
22990 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78  eter.** of the x
229a0 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66  Open() method of
229b0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46   the supplied VF
229c0 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66  S when opening f
229d0 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  iles. .**.** If 
229e0 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
229f0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
22a00 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  d the specified 
22a10 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20  file opened .** 
22a20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51  successfully, SQ
22a30 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
22a40 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72  ned and *ppPager
22a50 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
22a60 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65  .** the new page
22a70 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20  r object. If an 
22a80 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
22a90 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f  pPager is set to
22aa0 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72   NULL.** and err
22ab0 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
22ac0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
22ad0 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
22ae0 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69  E_NOMEM.** (sqli
22af0 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75  te3Malloc() is u
22b00 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
22b10 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f  memory), SQLITE_
22b20 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20  CANTOPEN or .** 
22b30 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49  various SQLITE_I
22b40 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f  O_XXX errors..*/
22b50 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
22b60 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  rOpen(.  sqlite3
22b70 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
22b80 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
22b90 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
22ba0 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  use */.  Pager *
22bb0 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
22bc0 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
22bd0 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
22be0 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
22bf0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
22c00 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
22c10 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
22c20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
22c30 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
22c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
22c50 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
22c60 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
22c70 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
22c80 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
22c90 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63        /* flags c
22ca0 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20  ontrolling this 
22cb0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  file */.  int vf
22cc0 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  sFlags,         
22cd0 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73     /* flags pass
22ce0 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
22cf0 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
22d00 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52  ) */.  void (*xR
22d10 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20  einit)(DbPage*) 
22d20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72  /* Function to r
22d30 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65  einitialize page
22d40 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50  s */.){.  u8 *pP
22d50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  tr;.  Pager *pPa
22d60 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ger = 0;       /
22d70 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74  * Pager object t
22d80 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  o allocate and r
22d90 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  eturn */.  int r
22da0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
22db0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
22dc0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70  de */.  int temp
22dd0 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20  File = 0;       
22de0 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d   /* True for tem
22df0 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69  p files (incl. i
22e00 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20  n-memory files) 
22e10 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d  */.  int memDb =
22e20 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
22e30 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
22e40 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
22e50 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64  le */.  int read
22e60 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20  Only = 0;       
22e70 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
22e80 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   is a read-only 
22e90 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f  file */.  int jo
22ea0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20  urnalFileSize;  
22eb0 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
22ec0 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68  llocate for each
22ed0 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20   journal fd */. 
22ee0 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
22ef0 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c   = 0;     /* Ful
22f00 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61  l path to databa
22f10 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
22f20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20   nPathname = 0; 
22f30 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22f40 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74  of bytes in zPat
22f50 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75  hname */.  int u
22f60 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61  seJournal = (fla
22f70 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f  gs & PAGER_OMIT_
22f80 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20  JOURNAL)==0; /* 
22f90 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f  False to omit jo
22fa0 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e  urnal */.  int n
22fb0 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61  oReadlock = (fla
22fc0 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45  gs & PAGER_NO_RE
22fd0 41 44 4c 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a 20  ADLOCK)!=0;  /* 
22fe0 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 72 65 61  True to omit rea
22ff0 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  d-lock */.  int 
23000 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c  pcacheSize = sql
23010 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29  ite3PcacheSize()
23020 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73  ;       /* Bytes
23030 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72   to allocate for
23040 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 31 36   PCache */.  u16
23050 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51   szPageDflt = SQ
23060 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
23070 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61  E_SIZE;  /* Defa
23080 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  ult page size */
23090 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
230a0 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65  t how much space
230b0 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
230c0 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69   each journal fi
230d0 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28  le-handle.  ** (
230e0 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66  there are two of
230f0 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20   them, the main 
23100 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20  journal and the 
23110 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68  sub-journal). Th
23120 69 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6d  is.  ** is the m
23130 61 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71  aximum space req
23140 75 69 72 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d  uired for an in-
23150 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
23160 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a  ile handle .  **
23170 20 61 6e 64 20 61 20 72 65 67 75 6c 61 72 20 6a   and a regular j
23180 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64  ournal file-hand
23190 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20  le. Note that a 
231a0 22 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c  "regular journal
231b0 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61  -handle".  ** ma
231c0 79 20 62 65 20 61 20 77 72 61 70 70 65 72 20 63  y be a wrapper c
231d0 61 70 61 62 6c 65 20 6f 66 20 63 61 63 68 69 6e  apable of cachin
231e0 67 20 74 68 65 20 66 69 72 73 74 20 70 6f 72 74  g the first port
231f0 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ion of the journ
23200 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20  al.  ** file in 
23210 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d  memory to implem
23220 65 6e 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  ent the atomic-w
23230 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
23240 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75  n (see .  ** sou
23250 72 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c  rce file journal
23260 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  .c)..  */.  if( 
23270 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69  sqlite3JournalSi
23280 7a 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65 33  ze(pVfs)>sqlite3
23290 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29  MemJournalSize()
232a0 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46   ){.    journalF
232b0 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38  ileSize = ROUND8
232c0 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53  (sqlite3JournalS
232d0 69 7a 65 28 70 56 66 73 29 29 3b 0a 20 20 7d 65  ize(pVfs));.  }e
232e0 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  lse{.    journal
232f0 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44  FileSize = ROUND
23300 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72  8(sqlite3MemJour
23310 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20 7d 0a  nalSize());.  }.
23320 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75  .  /* Set the ou
23330 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f  tput variable to
23340 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e   NULL in case an
23350 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a   error occurs. *
23360 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30  /.  *ppPager = 0
23370 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  ;..  /* Compute 
23380 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75  and store the fu
23390 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61  ll pathname in a
233a0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  n allocated buff
233b0 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20  er pointed.  ** 
233c0 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c  to by zPathname,
233d0 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d   length nPathnam
233e0 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69  e. Or, if this i
233f0 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
23400 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62  le,.  ** leave b
23410 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e  oth nPathname an
23420 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20  d zPathname set 
23430 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  to 0..  */.  if(
23440 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
23450 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
23460 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56    nPathname = pV
23470 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
23480 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20  ;.    zPathname 
23490 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
234a0 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20  nPathname*2);.  
234b0 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d    if( zPathname=
234c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
234d0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
234e0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
234f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
23500 59 44 42 0a 20 20 20 20 69 66 28 20 73 74 72 63  YDB.    if( strc
23510 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d  mp(zFilename,":m
23520 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20  emory:")==0 ){. 
23530 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a       memDb = 1;.
23540 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b        zPathname[
23550 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  0] = 0;.    }els
23560 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20  e.#endif.    {. 
23570 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30       zPathname[0
23580 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73  ] = 0; /* Make s
23590 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ure initialized 
235a0 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68  even if FullPath
235b0 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a  name() fails */.
235c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
235d0 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
235e0 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
235f0 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61  , nPathname, zPa
23600 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a  thname);.    }..
23610 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
23620 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
23630 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
23640 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23650 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38  K && nPathname+8
23660 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
23670 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  e ){.      /* Th
23680 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
23690 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  en when the jour
236a0 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69 72 65  nal path require
236b0 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68  d by.      ** th
236c0 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67  e database being
236d0 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20   opened will be 
236e0 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e  more than pVfs->
236f0 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20  mxPathname.     
23700 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e   ** bytes in len
23710 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  gth. This means 
23720 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
23730 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20  not be opened,. 
23740 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69       ** as it wi
23750 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ll not be possib
23760 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a  le to open the j
23770 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65  ournal file or e
23780 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65  ven.      ** che
23790 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ck for a hot-jou
237a0 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64  rnal before read
237b0 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ing..      */.  
237c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
237d0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
237e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
237f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23800 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
23810 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
23820 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
23830 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
23840 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
23850 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  r the Pager stru
23860 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f 62  cture, PCache ob
23870 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74  ject, the.  ** t
23880 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72 69  hree file descri
23890 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61 62  ptors, the datab
238a0 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e  ase file name an
238b0 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  d the journal . 
238c0 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54   ** file name. T
238d0 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d  he layout in mem
238e0 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  ory is as follow
238f0 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
23900 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20 20   Pager object   
23910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23920 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29 20   (sizeof(Pager) 
23930 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
23940 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20 20  PCache object   
23950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23960 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69  (sqlite3PcacheSi
23970 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a 2a  ze() bytes).  **
23980 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69       Database fi
23990 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
239a0 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73       (pVfs->szOs
239b0 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a 2a  File bytes).  **
239c0 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c       Sub-journal
239d0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
239e0 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c       (journalFil
239f0 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a  eSize bytes).  *
23a00 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e  *     Main journ
23a10 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
23a20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
23a30 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
23a40 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
23a50 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20  file name       
23a60 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d         (nPathnam
23a70 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  e+1 bytes).  ** 
23a80 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
23a90 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20   name           
23aa0 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38      (nPathname+8
23ab0 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20  +1 bytes).  */. 
23ac0 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73 71   pPtr = (u8 *)sq
23ad0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
23ae0 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65  .    ROUND8(size
23af0 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20 20  of(*pPager)) +  
23b00 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72      /* Pager str
23b10 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f  ucture */.    RO
23b20 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29  UND8(pcacheSize)
23b30 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
23b40 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f  PCache object */
23b50 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66 73  .    ROUND8(pVfs
23b60 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20  ->szOsFile) +   
23b70 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
23b80 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a  db file */.    j
23b90 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a  ournalFileSize *
23ba0 20 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a   2 +          /*
23bb0 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c   The two journal
23bc0 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e   files */ .    n
23bd0 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 20  Pathname + 1 +  
23be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23bf0 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20   zFilename */.  
23c00 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38 20    nPathname + 8 
23c10 2b 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20  + 1             
23c20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a   /* zJournal */.
23c30 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45    );.  assert( E
23c40 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
23c50 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54  ENT(SQLITE_INT_T
23c60 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c  O_PTR(journalFil
23c70 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28  eSize)) );.  if(
23c80 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71   !pPtr ){.    sq
23c90 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68  lite3_free(zPath
23ca0 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  name);.    retur
23cb0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
23cc0 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20    }.  pPager =  
23cd0 20 20 20 20 20 20 20 20 20 20 20 20 28 50 61 67              (Pag
23ce0 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50  er*)(pPtr);.  pP
23cf0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20  ager->pPCache = 
23d00 20 20 20 28 50 43 61 63 68 65 2a 29 28 70 50 74     (PCache*)(pPt
23d10 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  r += ROUND8(size
23d20 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20  of(*pPager)));. 
23d30 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20   pPager->fd =   
23d40 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
23d50 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70  pPtr += ROUND8(p
23d60 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70  cacheSize));.  p
23d70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73  Pager->sjfd = (s
23d80 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50  qlite3_file*)(pP
23d90 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66  tr += ROUND8(pVf
23da0 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20  s->szOsFile));. 
23db0 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20   pPager->jfd =  
23dc0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
23dd0 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46  pPtr += journalF
23de0 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  ileSize);.  pPag
23df0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  er->zFilename = 
23e00 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20     (char*)(pPtr 
23e10 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  += journalFileSi
23e20 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45  ze);.  assert( E
23e30 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
23e40 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ENT(pPager->jfd)
23e50 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
23e60 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c  n the Pager.zFil
23e70 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e  ename and Pager.
23e80 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73  zJournal buffers
23e90 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a  , if required. *
23ea0 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d  /.  if( zPathnam
23eb0 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  e ){.    pPager-
23ec0 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63  >zJournal =   (c
23ed0 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50  har*)(pPtr += nP
23ee0 61 74 68 6e 61 6d 65 20 2b 20 31 29 3b 0a 20 20  athname + 1);.  
23ef0 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
23f00 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74  >zFilename, zPat
23f10 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
23f20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
23f30 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
23f40 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
23f50 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70  name);.    memcp
23f60 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  y(&pPager->zJour
23f70 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20  nal[nPathname], 
23f80 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38 29 3b 0a  "-journal", 8);.
23f90 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
23fa0 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 20  zFilename[0]==0 
23fb0 29 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  ) pPager->zJourn
23fc0 61 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 73  al[0] = 0;.    s
23fd0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
23fe0 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50  hname);.  }.  pP
23ff0 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66  ager->pVfs = pVf
24000 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73  s;.  pPager->vfs
24010 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73  Flags = vfsFlags
24020 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
24030 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a   pager file..  *
24040 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
24050 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
24060 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a 20  ] && !memDb ){. 
24070 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
24080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24090 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73      /* VFS flags
240a0 20 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70   returned by xOp
240b0 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d  en() */.    rc =
240c0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
240d0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  Vfs, pPager->zFi
240e0 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e  lename, pPager->
240f0 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66  fd, vfsFlags, &f
24100 6f 75 74 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e  out);.    readOn
24110 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54  ly = (fout&SQLIT
24120 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
24130 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
24140 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73   file was succes
24150 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f  sfully opened fo
24160 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
24170 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f  ess,.    ** choo
24180 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67  se a default pag
24190 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77  e size in case w
241a0 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65  e have to create
241b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
241c0 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64  base file. The d
241d0 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
241e0 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
241f0 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
24200 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45  *    + SQLITE_DE
24210 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c  FAULT_PAGE_SIZE,
24220 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
24230 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
24240 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74  by sqlite3OsSect
24250 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
24260 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74     + The largest
24270 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20   page size that 
24280 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61  can be written a
24290 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a  tomically..    *
242a0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
242b0 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64  LITE_OK && !read
242c0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 65  Only ){.      se
242d0 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
242e0 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
242f0 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  t(SQLITE_DEFAULT
24300 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49  _PAGE_SIZE<=SQLI
24310 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
24320 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
24330 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c   if( szPageDflt<
24340 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
24350 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ze ){.        if
24360 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
24370 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
24380 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
24390 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  E ){.          s
243a0 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49  zPageDflt = SQLI
243b0 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
243c0 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  AGE_SIZE;.      
243d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
243e0 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
243f0 28 75 31 36 29 70 50 61 67 65 72 2d 3e 73 65 63  (u16)pPager->sec
24400 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  torSize;.       
24410 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65   }.      }.#ifde
24420 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
24430 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
24440 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74     {.        int
24450 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
24460 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
24470 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
24480 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  );.        int i
24490 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  i;.        asser
244a0 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
244b0 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
244c0 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  8));.        ass
244d0 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
244e0 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
244f0 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  36>>8));.       
24500 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d   assert(SQLITE_M
24510 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
24520 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20  SIZE<=65536);.  
24530 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50        for(ii=szP
24540 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c  ageDflt; ii<=SQL
24550 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
24560 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69  PAGE_SIZE; ii=ii
24570 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  *2){.          i
24580 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49  f( iDc&(SQLITE_I
24590 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e  OCAP_ATOMIC|(ii>
245a0 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >8)) ){.        
245b0 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
245c0 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   ii;.          }
245d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
245e0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
245f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
24600 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  If a temporary f
24610 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64  ile is requested
24620 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e  , it is not open
24630 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  ed immediately..
24640 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
24650 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68  ase we accept th
24660 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
24670 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63  ize and delay ac
24680 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70  tually.    ** op
24690 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75  ening the file u
246a0 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63  ntil the first c
246b0 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29  all to OsWrite()
246c0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
246d0 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61  This branch is a
246e0 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69  lso run for an i
246f0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
24700 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  e. An in-memory.
24710 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
24720 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
24730 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20   temp-file that 
24740 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
24750 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64   out to.    ** d
24760 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20  isk and uses an 
24770 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61  in-memory rollba
24780 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  ck journal..    
24790 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c 65  */ .    tempFile
247a0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
247b0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
247c0 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 72  EXCLUSIVE;.    r
247d0 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c  eadOnly = (vfsFl
247e0 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
247f0 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a  READONLY);.  }..
24800 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
24810 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72  ng call to Pager
24820 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73 65  SetPagesize() se
24830 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65 20  rves to set the 
24840 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50  value of .  ** P
24850 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e  ager.pageSize an
24860 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  d to allocate th
24870 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  e Pager.pTmpSpac
24880 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20  e buffer..  */. 
24890 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
248a0 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
248b0 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d  ( pPager->memDb=
248c0 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  =0 );.    rc = s
248d0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
248e0 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
248f0 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b  szPageDflt, -1);
24900 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
24910 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
24920 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
24930 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69  error occurred i
24940 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  n either of the 
24950 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72  blocks above, fr
24960 65 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  ee the .  ** Pag
24970 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
24980 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e   close the file.
24990 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d  .  */.  if( rc!=
249a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
249b0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
249c0 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 3b 0a 20  ->pTmpSpace );. 
249d0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
249e0 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
249f0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
24a00 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
24a10 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
24a20 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
24a30 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20   PCache object. 
24a40 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78  */.  assert( nEx
24a50 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 6e 45  tra<1000 );.  nE
24a60 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45  xtra = ROUND8(nE
24a70 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  xtra);.  sqlite3
24a80 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67  PcacheOpen(szPag
24a90 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21  eDflt, nExtra, !
24aa0 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20  memDb,.         
24ab0 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44             !memD
24ac0 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c  b?pagerStress:0,
24ad0 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c   (void *)pPager,
24ae0 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
24af0 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  );..  PAGERTRACE
24b00 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  (("OPEN %d %s\n"
24b10 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70  , FILEHANDLEID(p
24b20 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67  Pager->fd), pPag
24b30 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b  er->zFilename));
24b40 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45  .  IOTRACE(("OPE
24b50 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67  N %p %s\n", pPag
24b60 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  er, pPager->zFil
24b70 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65  ename))..  pPage
24b80 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  r->useJournal = 
24b90 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a  (u8)useJournal;.
24ba0 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64    pPager->noRead
24bb0 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f  lock = (noReadlo
24bc0 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 29 20  ck && readOnly) 
24bd0 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65  ?1:0;.  /* pPage
24be0 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
24bf0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
24c00 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20  >stmtInUse = 0; 
24c10 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
24c20 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  nRef = 0; */.  p
24c30 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
24c40 69 64 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a  id = (u8)memDb;.
24c50 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
24c60 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  tSize = 0; */.  
24c70 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  /* pPager->stmtJ
24c80 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
24c90 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20  * pPager->nPage 
24ca0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
24cb0 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54  ->mxPgno = SQLIT
24cc0 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54  E_MAX_PAGE_COUNT
24cd0 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
24ce0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
24cf0 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74  OCK; */.  assert
24d00 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  ( pPager->state 
24d10 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20 50  == (tempFile ? P
24d20 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 3a  AGER_EXCLUSIVE :
24d30 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29   PAGER_UNLOCK) )
24d40 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65  ;.  /* pPager->e
24d50 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20  rrMask = 0; */. 
24d60 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
24d70 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65  e = (u8)tempFile
24d80 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70  ;.  assert( temp
24d90 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
24da0 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a  INGMODE_NORMAL .
24db0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d            || tem
24dc0 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
24dd0 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
24de0 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
24df0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
24e00 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29  E_EXCLUSIVE==1 )
24e10 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  ;.  pPager->excl
24e20 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29  usiveMode = (u8)
24e30 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61  tempFile; .  pPa
24e40 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
24e50 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
24e60 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
24e70 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d  r->memDb = (u8)m
24e80 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
24e90 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72  readOnly = (u8)r
24ea0 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50  eadOnly;.  /* pP
24eb0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
24ec0 20 30 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74 28   0; */.  assert(
24ed0 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70   useJournal || p
24ee0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
24ef0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  );.  pPager->noS
24f00 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
24f10 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
24f20 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 70 50 61  ->fullSync = pPa
24f30 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31  ger->noSync ?0:1
24f40 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  ;.  pPager->sync
24f50 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  _flags = SQLITE_
24f60 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f  SYNC_NORMAL;.  /
24f70 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
24f80 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
24f90 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
24fa0 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ed = 0; */.  /* 
24fb0 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
24fc0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
24fd0 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45  nExtra = (u16)nE
24fe0 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e  xtra;.  pPager->
24ff0 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
25000 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
25010 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c  T_JOURNAL_SIZE_L
25020 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20  IMIT;.  assert( 
25030 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
25040 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29  d) || tempFile )
25050 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  ;.  setSectorSiz
25060 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  e(pPager);.  if(
25070 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a   !useJournal ){.
25080 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
25090 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
250a0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b  JOURNALMODE_OFF;
250b0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d  .  }else if( mem
250c0 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  Db ){.    pPager
250d0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
250e0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
250f0 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20  E_MEMORY;.  }.  
25100 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  /* pPager->xBusy
25110 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a  Handler = 0; */.
25120 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75    /* pPager->pBu
25130 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30  syHandlerArg = 0
25140 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78  ; */.  pPager->x
25150 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e  Reiniter = xRein
25160 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28  it;.  /* memset(
25170 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30  pPager->aHash, 0
25180 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
25190 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 0a 20 20  >aHash)); */..  
251a0 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
251b0 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  r;.  return SQLI
251c0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a  TE_OK;.}..../*.*
251d0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
251e0 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
251f0 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72  transitioning fr
25200 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  om PAGER_UNLOCK 
25210 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52  to.** PAGER_SHAR
25220 45 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73  ED state. It tes
25230 74 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ts if there is a
25240 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65   hot journal pre
25250 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66  sent in.** the f
25260 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74  ile-system for t
25270 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20  he given pager. 
25280 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73  A hot journal is
25290 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65   one that .** ne
252a0 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
252b0 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67   back. According
252c0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
252d0 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  n, a hot-journal
252e0 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20  .** file exists 
252f0 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
25300 20 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65   criteria are me
25310 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  t:.**.**   * The
25320 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
25330 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ists in the file
25340 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20   system, and.** 
25350 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68    * No process h
25360 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20  olds a RESERVED 
25370 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
25380 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
25390 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  file, and.**   *
253a0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
253b0 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65  le itself is gre
253c0 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
253d0 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a  s in size, and.*
253e0 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20  *   * The first 
253f0 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  byte of the jour
25400 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
25410 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e  and is not 0x00.
25420 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
25430 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
25440 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
25450 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
25460 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
25470 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
25480 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
25490 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
254a0 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
254b0 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
254c0 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ame name. In thi
254d0 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
254e0 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75  al file is.** ju
254f0 73 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  st deleted using
25500 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69   OsDelete, *pExi
25510 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20  sts is set to 0 
25520 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  and SQLITE_OK.**
25530 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
25540 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
25550 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20   does not check 
25560 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61  if there is a ma
25570 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
25580 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20  ename.** at the 
25590 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  end of the file.
255a0 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e   If there is, an
255b0 64 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f  d that master jo
255c0 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f  urnal file.** do
255d0 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
255e0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
255f0 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  ile is not reall
25600 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a  y hot. In this.*
25610 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74  * case this rout
25620 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
25630 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
25640 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79  . The pager_play
25650 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  back().** routin
25660 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20  e will discover 
25670 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
25680 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
25690 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20  lly hot and .** 
256a0 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74  will not roll it
256b0 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   back. .**.** If
256c0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
256d0 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20  ile is found to 
256e0 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20  exist, *pExists 
256f0 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20  is set to 1 and 
25700 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
25710 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f  turned. If no ho
25720 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
25730 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69  s present, *pExi
25740 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  sts is.** set to
25750 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
25760 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
25770 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
25780 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a   while trying.**
25790 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
257a0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68  ether or not a h
257b0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
257c0 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65  exists, the IO e
257d0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20  rror.** code is 
257e0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
257f0 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73   value of *pExis
25800 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ts is undefined.
25810 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
25820 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
25830 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
25840 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c  *pExists){.  sql
25850 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
25860 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
25870 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pVfs;.  int rc =
25880 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
25890 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
258a0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78  code */.  int ex
258b0 69 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20  ists = 1;       
258c0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
258d0 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  if a journal fil
258e0 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  e is present */.
258f0 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d    int jrnlOpen =
25900 20 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72   !!isOpen(pPager
25910 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72  ->jfd);..  asser
25920 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
25930 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
25940 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
25950 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
25960 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
25970 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
25980 2d 3e 73 74 61 74 65 20 3c 3d 20 50 41 47 45 52  ->state <= PAGER
25990 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 61 73 73  _SHARED );.  ass
259a0 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30  ert( jrnlOpen==0
259b0 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74  .       || sqlit
259c0 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
259d0 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
259e0 2d 3e 6a 66 64 29 26 53 51 4c 49 54 45 5f 49 4f  ->jfd)&SQLITE_IO
259f0 43 41 50 5f 53 41 46 45 5f 44 45 4c 45 54 45 0a  CAP_SAFE_DELETE.
25a00 20 20 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73    );..  *pExists
25a10 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e   = 0;.  if( !jrn
25a20 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  lOpen ){.    rc 
25a30 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
25a40 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  s(pVfs, pPager->
25a50 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
25a60 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
25a70 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20  &exists);.  }.  
25a80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25a90 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20  K && exists ){. 
25aa0 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 3b 20 20     int locked;  
25ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25ac0 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70  * True if some p
25ad0 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52  rocess holds a R
25ae0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a  ESERVED lock */.
25af0 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e  .    /* Race con
25b00 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e  dition here:  An
25b10 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69  other process mi
25b20 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f  ght have been ho
25b30 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  lding the.    **
25b40 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
25b50 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f  ck and have a jo
25b60 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68  urnal open at th
25b70 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  e sqlite3OsAcces
25b80 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  s() .    ** call
25b90 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e   above, but then
25ba0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
25bb0 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65  nal and drop the
25bc0 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20   lock before.   
25bd0 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68   ** we get to th
25be0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69  e following sqli
25bf0 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
25c00 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20  edLock() call.  
25c10 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69  If that.    ** i
25c20 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 69 73  s the case, this
25c30 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74   routine might t
25c40 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20  hink there is a 
25c50 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  hot journal when
25c60 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20  .    ** in fact 
25c70 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20  there is none.  
25c80 54 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20  This results in 
25c90 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
25ca0 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20   which will.    
25cb0 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68  ** be dealt with
25cc0 20 62 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b   by the playback
25cd0 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65   routine.  Ticke
25ce0 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a  t #3883..    */.
25cf0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25d00 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
25d10 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
25d20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66  &locked);.    if
25d30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25d40 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20  && !locked ){.  
25d50 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a      int nPage;..
25d60 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
25d70 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
25d80 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
25d90 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20   it consists of 
25da0 30 20 70 61 67 65 73 2c 0a 20 20 20 20 20 20 2a  0 pages,.      *
25db0 2a 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68  * then delete th
25dc0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
25dd0 53 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63  See the header c
25de0 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 66 6f 72  omment above for
25df0 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72   .      ** the r
25e00 65 61 73 6f 6e 69 6e 67 20 68 65 72 65 2e 20 20  easoning here.  
25e10 44 65 6c 65 74 65 20 74 68 65 20 6f 62 73 6f 6c  Delete the obsol
25e20 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
25e30 20 75 6e 64 65 72 0a 20 20 20 20 20 20 2a 2a 20   under.      ** 
25e40 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
25e50 74 6f 20 61 76 6f 69 64 20 72 61 63 65 20 63 6f  to avoid race co
25e60 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20 74 6f 20  nditions and to 
25e70 61 76 6f 69 64 20 76 69 6f 6c 61 74 69 6e 67 0a  avoid violating.
25e80 20 20 20 20 20 20 2a 2a 20 5b 48 33 33 30 32 30        ** [H33020
25e90 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ]..      */.    
25ea0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
25eb0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
25ec0 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
25ed0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25ee0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
25ef0 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
25f00 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
25f10 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
25f20 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20  loc();.         
25f30 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 4c 6f   if( sqlite3OsLo
25f40 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52  ck(pPager->fd, R
25f50 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53  ESERVED_LOCK)==S
25f60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25f70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
25f80 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50  sDelete(pVfs, pP
25f90 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
25fa0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
25fb0 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
25fc0 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52  pPager->fd, SHAR
25fd0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
25fe0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
25ff0 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
26000 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
26010 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26020 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61     /* The journa
26030 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
26040 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  d no other conne
26050 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65  ction has a rese
26060 72 76 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  rved.          *
26070 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  * or greater loc
26080 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
26090 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63  e file. Now chec
260a0 6b 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  k that there is.
260b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20            ** at 
260c0 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65  least one non-ze
260d0 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65 20  ro bytes at the 
260e0 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
260f0 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
26100 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65       ** If there
26110 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e   is, then we con
26120 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e  sider this journ
26130 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66  al to be hot. If
26140 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20   not, .         
26150 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67   ** it can be ig
26160 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20  nored..         
26170 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
26180 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
26190 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66             int f
261a0 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
261b0 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
261c0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
261d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
261e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
261f0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
26200 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
26210 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20  >jfd, f, &f);.  
26220 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26230 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
26240 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
26250 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20       u8 first = 
26260 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
26270 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
26280 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28  d(pPager->jfd, (
26290 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31  void *)&first, 1
262a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
262b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
262c0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
262d0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  D ){.           
262e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
262f0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  K;.            }
26300 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
26310 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
26320 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
26330 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
26340 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
26350 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26360 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66     *pExists = (f
26370 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20  irst!=0);.      
26380 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
26390 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  ==SQLITE_CANTOPE
263a0 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
263b0 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74   /* If we cannot
263c0 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   open the rollba
263d0 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ck journal file 
263e0 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20  in order to see 
263f0 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  if.            *
26400 2a 20 69 74 73 20 68 61 73 20 61 20 7a 65 72 6f  * its has a zero
26410 20 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69   header, that mi
26420 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e  ght be due to an
26430 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20   I/O error, or. 
26440 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
26450 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
26460 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74   the race condit
26470 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62  ion described ab
26480 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20  ove and in.     
26490 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74         ** ticket
264a0 20 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20   #3883.  Either 
264b0 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74  way, assume that
264c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
264d0 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  hot..           
264e0 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62   ** This might b
264f0 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69  e a false positi
26500 76 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69  ve.  But if it i
26510 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  s, then the.    
26520 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d          ** autom
26530 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  atic journal pla
26540 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65  yback and recove
26550 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c  ry mechanism wil
26560 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20  l deal.         
26570 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e     ** with it un
26580 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45  der an EXCLUSIVE
26590 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64   lock where we d
265a0 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20  o not need to.  
265b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72            ** wor
265c0 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20  ry so much with 
265d0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e  race conditions.
265e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
265f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78              *pEx
26600 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  ists = 1;.      
26610 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26620 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
26630 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
26640 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
26650 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
26660 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
26670 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
26680 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
26690 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
266a0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74  base file..** It
266b0 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63   is illegal to c
266c0 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
266d0 41 63 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20  Acquire() until 
266e0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
266f0 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
26700 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c  successfully cal
26710 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64  led. If a shared
26720 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79  -lock is already
26730 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68   held when.** th
26740 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
26750 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
26760 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
26770 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74  following operat
26780 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65  ions are also pe
26790 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20  rformed by this 
267a0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
267b0 20 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65    1) If the page
267c0 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69  r is currently i
267d0 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73  n PAGER_UNLOCK s
267e0 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65  tate (no lock he
267f0 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68  ld.**      on th
26800 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  e database file)
26810 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70  , then an attemp
26820 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74  t is made to obt
26830 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48  ain a.**      SH
26840 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ARED lock on the
26850 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
26860 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  Immediately afte
26870 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20  r obtaining.**  
26880 20 20 20 20 74 68 65 20 53 48 41 52 45 44 20 6c      the SHARED l
26890 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79  ock, the file-sy
268a0 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20  stem is checked 
268b0 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
268c0 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68  l,.**      which
268d0 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20   is played back 
268e0 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c  if present. Foll
268f0 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f  owing any hot-jo
26900 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72  urnal .**      r
26910 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e  ollback, the con
26920 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63  tents of the cac
26930 68 65 20 61 72 65 20 76 61 6c 69 64 61 74 65 64  he are validated
26940 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20   by checking.** 
26950 20 20 20 20 20 74 68 65 20 27 63 68 61 6e 67 65       the 'change
26960 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20  -counter' field 
26970 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
26980 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a  file header and.
26990 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72 64 65  **      discarde
269a0 64 20 69 66 20 74 68 65 79 20 61 72 65 20 66 6f  d if they are fo
269b0 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69  und to be invali
269c0 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66  d..**.**   2) If
269d0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
269e0 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
269f0 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65  ve-mode, and the
26a00 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  re are currently
26a10 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73  .**      no outs
26a20 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
26a30 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c  es to any pages,
26a40 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65   and is in the e
26a50 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20  rror state,.**  
26a60 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65      then an atte
26a70 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
26a80 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73  lear the error s
26a90 74 61 74 65 20 62 79 20 64 69 73 63 61 72 64 69  tate by discardi
26aa0 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63  ng.**      the c
26ab0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
26ac0 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f  age cache and ro
26ad0 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f  lling back any o
26ae0 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  pen journal.**  
26af0 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
26b00 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  If the operation
26b10 20 64 65 73 63 72 69 62 65 64 20 62 79 20 28 32   described by (2
26b20 29 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 61  ) above is not a
26b30 74 74 65 6d 70 74 65 64 2c 20 61 6e 64 20 69 66  ttempted, and if
26b40 20 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 69 73   the.** pager is
26b50 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
26b60 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  te other than SQ
26b70 4c 49 54 45 5f 46 55 4c 4c 20 77 68 65 6e 20 74  LITE_FULL when t
26b80 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a  his is called,.*
26b90 2a 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  * the error stat
26ba0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
26bb0 72 65 74 75 72 6e 65 64 2e 20 49 74 20 69 73 20  returned. It is 
26bc0 70 65 72 6d 69 74 74 65 64 20 74 6f 20 72 65 61  permitted to rea
26bd0 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  d the.** databas
26be0 65 20 77 68 65 6e 20 69 6e 20 53 51 4c 49 54 45  e when in SQLITE
26bf0 5f 46 55 4c 4c 20 65 72 72 6f 72 20 73 74 61 74  _FULL error stat
26c00 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  e..**.** Otherwi
26c10 73 65 2c 20 69 66 20 65 76 65 72 79 74 68 69 6e  se, if everythin
26c20 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
26c30 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
26c40 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a  turned. If an.**
26c50 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
26c60 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74   while locking t
26c70 68 65 20 64 61 74 61 62 61 73 65 2c 20 63 68 65  he database, che
26c80 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d  cking for a hot-
26c90 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
26ca0 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  or rolling back 
26cb0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  a journal file, 
26cc0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
26cd0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
26ce0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
26cf0 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67  erSharedLock(Pag
26d00 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
26d10 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
26d20 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
26d30 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
26d40 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 72 72 6f   */.  int isErro
26d50 72 52 65 73 65 74 20 3d 20 30 3b 20 20 20 20 20  rReset = 0;     
26d60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
26d70 20 69 66 20 72 65 63 6f 76 65 72 69 6e 67 20 66   if recovering f
26d80 72 6f 6d 20 65 72 72 6f 72 20 73 74 61 74 65 20  rom error state 
26d90 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  */..  /* This ro
26da0 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
26db0 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65  lled from b-tree
26dc0 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74   and only when t
26dd0 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a  here are no.  **
26de0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
26df0 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
26e00 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
26e10 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
26e20 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 69  Cache)==0 );.  i
26e30 66 28 20 4e 45 56 45 52 28 4d 45 4d 44 42 20 26  f( NEVER(MEMDB &
26e40 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
26e50 65 29 20 29 7b 20 72 65 74 75 72 6e 20 70 50 61  e) ){ return pPa
26e60 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a  ger->errCode; }.
26e70 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
26e80 74 61 62 61 73 65 20 69 73 20 69 6e 20 61 6e 20  tabase is in an 
26e90 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77  error-state, now
26ea0 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 6f 20   is a chance to 
26eb0 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65  clear.  ** the e
26ec0 72 72 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68  rror. Discard th
26ed0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
26ee0 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e  e pager-cache an
26ef0 64 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  d rollback.  ** 
26f00 61 6e 79 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  any hot journal 
26f10 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
26f20 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  em..  */.  if( p
26f30 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
26f40 7b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  {.    if( isOpen
26f50 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c  (pPager->jfd) ||
26f60 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
26f70 6c 20 29 7b 0a 20 20 20 20 20 20 69 73 45 72 72  l ){.      isErr
26f80 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a 20 20 20  orReset = 1;.   
26f90 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65   }.    pPager->e
26fa0 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  rrCode = SQLITE_
26fb0 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65  OK;.    pager_re
26fc0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  set(pPager);.  }
26fd0 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
26fe0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
26ff0 20 20 20 72 63 20 3d 20 70 61 67 65 72 42 65 67     rc = pagerBeg
27000 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
27010 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c  n(pPager);.  }el
27020 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  se if( pPager->s
27030 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
27040 43 4b 20 7c 7c 20 69 73 45 72 72 6f 72 52 65 73  CK || isErrorRes
27050 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  et ){.    sqlite
27060 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
27070 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
27080 73 3b 0a 20 20 20 20 69 6e 74 20 69 73 48 6f 74  s;.    int isHot
27090 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
270a0 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
270b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
270c0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
270d0 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
270e0 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ache)==0 );.    
270f0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65  if( pPager->noRe
27100 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  adlock ){.      
27110 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27120 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 20 20  readOnly );.    
27130 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
27140 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
27150 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27160 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
27170 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
27180 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
27190 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
271a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
271b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
271c0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
271d0 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  NLOCK );.       
271e0 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
271f0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
27200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27210 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
27220 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44  r->state>=SHARED
27230 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  _LOCK );..    /*
27240 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
27250 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74  le exists, and t
27260 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52  here is no RESER
27270 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  VED lock on the.
27280 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
27290 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
272a0 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
272b0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
272c0 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
272d0 20 20 20 20 69 66 28 20 21 69 73 45 72 72 6f 72      if( !isError
272e0 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 61  Reset ){.      a
272f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
27300 74 61 74 65 20 3c 3d 20 50 41 47 45 52 5f 53 48  tate <= PAGER_SH
27310 41 52 45 44 20 29 3b 0a 20 20 20 20 20 20 72 63  ARED );.      rc
27320 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c   = hasHotJournal
27330 28 70 50 61 67 65 72 2c 20 26 69 73 48 6f 74 4a  (pPager, &isHotJ
27340 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69  ournal);.      i
27350 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27360 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
27370 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
27380 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
27390 73 45 72 72 6f 72 52 65 73 65 74 20 7c 7c 20 69  sErrorReset || i
273a0 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sHotJournal ){. 
273b0 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45       /* Get an E
273c0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
273d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
273e0 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  le. At this poin
273f0 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a  t it is.      **
27400 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
27410 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
27420 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  is not obtained 
27430 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68  on the way to th
27440 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55  e.      ** EXCLU
27450 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74  SIVE lock. If it
27460 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70   were, another p
27470 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65  rocess might ope
27480 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  n the.      ** d
27490 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65  atabase file, de
274a0 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45  tect the RESERVE
274b0 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63  D lock, and conc
274c0 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20  lude that the.  
274d0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
274e0 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20  is safe to read 
274f0 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65  while this proce
27500 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c  ss is still roll
27510 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a  ing the .      *
27520 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61  * hot-journal ba
27530 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  ck..      ** .  
27540 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74      ** Because t
27550 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
27560 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
27570 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20   not requested, 
27580 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  any.      ** oth
27590 65 72 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d  er process attem
275a0 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20  pting to access 
275b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
275c0 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20  e will get to . 
275d0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69       ** this poi
275e0 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61  nt in the code a
275f0 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69  nd fail to obtai
27600 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53  n its own EXCLUS
27610 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20  IVE lock .      
27620 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
27630 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a  se file..      *
27640 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  /.      if( pPag
27650 65 72 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55 53  er->state<EXCLUS
27660 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
27670 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27680 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
27690 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  d, EXCLUSIVE_LOC
276a0 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  K);.        if( 
276b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
276c0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
276d0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
276e0 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
276f0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
27700 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27710 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
27720 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
27730 45 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20  E;.      }. .   
27740 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a     /* Open the j
27750 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f  ournal for read/
27760 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 68  write access. Th
27770 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e  is is because in
27780 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75   .      ** exclu
27790 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
277a0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
277b0 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70  ptor will be kep
277c0 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20  t open and.     
277d0 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65   ** possibly use
277e0 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
277f0 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e  ion later on. On
27800 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74   some systems, t
27810 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 73 54 72  he.      ** OsTr
27820 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73  uncate() call us
27830 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ed in exclusive-
27840 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f  access mode also
27850 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
27860 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65 20  ** a read/write 
27870 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20  file handle..   
27880 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
27890 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
278a0 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  jfd) ){.        
278b0 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20  int res;.       
278c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
278d0 63 63 65 73 73 28 70 56 66 73 2c 70 50 61 67 65  ccess(pVfs,pPage
278e0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49  r->zJournal,SQLI
278f0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
27900 2c 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20  ,&res);.        
27910 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27920 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  K ){.          i
27930 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
27940 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d        int fout =
27950 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
27960 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f  int f = SQLITE_O
27970 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
27980 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
27990 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20  OURNAL;.        
279a0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
279b0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
279c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
279d0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
279e0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
279f0 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
27a00 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a  jfd, f, &fout);.
27a10 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
27a20 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
27a30 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
27a40 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
27a50 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
27a60 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75  SQLITE_OK && fou
27a70 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  t&SQLITE_OPEN_RE
27a80 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  ADONLY ){.      
27a90 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
27aa0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
27ab0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T;.             
27ac0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
27ad0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
27ae0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27af0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27b00 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
27b10 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  he journal does 
27b20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20 75 73  not exist, it us
27b30 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61 74  ually means that
27b40 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 20 20 20   some .         
27b50 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e     ** other conn
27b60 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74  ection managed t
27b70 6f 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c  o get in and rol
27b80 6c 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65  l it back before
27b90 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
27ba0 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
27bb0 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65 78   obtained the ex
27bc0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f  clusive lock abo
27bd0 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20  ve. Or, it .    
27be0 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d          ** may m
27bf0 65 61 6e 20 74 68 61 74 20 74 68 65 20 70 61 67  ean that the pag
27c00 65 72 20 77 61 73 20 69 6e 20 74 68 65 20 65 72  er was in the er
27c10 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74  ror-state when t
27c20 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  his.            
27c30 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  ** function was 
27c40 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65 20 6a  called and the j
27c50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
27c60 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 2a 2f 0a   not exist.  */.
27c70 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
27c80 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
27c90 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30  action(pPager, 0
27ca0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
27cb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
27cc0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
27cd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27ce0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
27cf0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
27d00 2f 2a 20 52 65 73 65 74 20 74 68 65 20 6a 6f 75  /* Reset the jou
27d10 72 6e 61 6c 20 73 74 61 74 75 73 20 66 69 65 6c  rnal status fiel
27d20 64 73 20 74 6f 20 69 6e 64 69 63 61 74 65 73 20  ds to indicates 
27d30 74 68 61 74 20 77 65 20 68 61 76 65 20 6e 6f 0a  that we have no.
27d40 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63        ** rollbac
27d50 6b 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 69  k journal at thi
27d60 73 20 74 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 20  s time. */.     
27d70 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
27d80 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
27d90 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
27da0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
27db0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
27dc0 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  er = 0;.      pP
27dd0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
27de0 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20 2f 2a   = 0;. .      /*
27df0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6a   Make sure the j
27e00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
27e10 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64  been synced to d
27e20 69 73 6b 2e 20 2a 2f 0a 20 0a 20 20 20 20 20 20  isk. */. .      
27e30 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20  /* Playback and 
27e40 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
27e50 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61  al.  Drop the da
27e60 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20  tabase write.   
27e70 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72     ** lock and r
27e80 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61  eacquire the rea
27e90 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68  d lock. Purge th
27ea0 65 20 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20  e cache before. 
27eb0 20 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20       ** playing 
27ec0 62 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75  back the hot-jou
27ed0 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20  rnal so that we 
27ee0 64 6f 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74  don't end up wit
27ef0 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e  h.      ** an in
27f00 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65  consistent cache
27f10 2e 20 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20  .  Sync the hot 
27f20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70  journal before p
27f30 6c 61 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  laying.      ** 
27f40 69 74 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68  it back since th
27f50 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
27f60 72 61 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20  rashed and left 
27f70 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a  the hot journal.
27f80 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c        ** probabl
27f90 79 20 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69  y did not sync i
27fa0 74 20 61 6e 64 20 77 65 20 61 72 65 20 72 65 71  t and we are req
27fb0 75 69 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20  uired to always 
27fc0 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68  sync.      ** th
27fd0 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  e journal before
27fe0 20 70 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b   playing it back
27ff0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
28000 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
28010 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
28020 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 53 79      rc = pagerSy
28030 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  ncHotJournal(pPa
28040 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ger);.        if
28050 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28060 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
28070 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
28080 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
28090 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
280a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
280b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
280c0 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70   = pager_error(p
280d0 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
280e0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
280f0 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
28100 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
28110 74 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74  t( (pPager->stat
28120 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 29  e==PAGER_SHARED)
28130 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  .           || (
28140 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
28150 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
28160 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41  >state>PAGER_SHA
28170 52 45 44 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  RED).      );.  
28180 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 50 61    }..    if( pPa
28190 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 7c 7c 20  ger->pBackup || 
281a0 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
281b0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  ecount(pPager->p
281c0 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20  PCache)>0 ){.   
281d0 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64     /* The shared
281e0 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62  -lock has just b
281f0 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20  een acquired on 
28200 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28210 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74  e.      ** and t
28220 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79  here are already
28230 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
28240 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76  che (from a prev
28250 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65  ious.      ** re
28260 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
28270 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b  saction).  Check
28280 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64   to see if the d
28290 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
282a0 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
282b0 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61  ed.  If the data
282c0 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64  base has changed
282d0 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20  , flush the.    
282e0 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20    ** cache..    
282f0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61    **.      ** Da
28300 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69  tabase changes i
28310 73 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f  s detected by lo
28320 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65  oking at 15 byte
28330 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20  s beginning.    
28340 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32    ** at offset 2
28350 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  4 into the file.
28360 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66    The first 4 of
28370 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20   these 16 bytes 
28380 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33  are.      ** a 3
28390 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68  2-bit counter th
283a0 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  at is incremente
283b0 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e  d with each chan
283c0 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a  ge.  The.      *
283d0 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68  * other bytes ch
283e0 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69  ange randomly wi
283f0 74 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61  th each file cha
28400 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a  nge when.      *
28410 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20  * a codec is in 
28420 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20  use..      ** . 
28430 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73       ** There is
28440 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73   a vanishingly s
28450 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74  mall chance that
28460 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e   a change will n
28470 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20  ot be .      ** 
28480 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63  detected.  The c
28490 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65  hance of an unde
284a0 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73  tected change is
284b0 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20   so small that. 
284c0 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
284d0 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20  e neglected..   
284e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
284f0 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 63 68 61  nPage;.      cha
28500 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a  r dbFileVers[siz
28510 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
28520 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20 20 20 20  leVers)];.      
28530 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
28540 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
28550 50 61 67 65 29 3b 0a 0a 20 20 20 20 20 20 69 66  Page);..      if
28560 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
28570 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
28580 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
28590 65 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  e;.        goto 
285a0 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
285b0 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65  .      if( nPage
285c0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 49 4f  >0 ){.        IO
285d0 54 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25  TRACE(("CKVERS %
285e0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
285f0 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
28600 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72  rs)));.        r
28610 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
28620 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64  d(pPager->fd, &d
28630 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
28640 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32  f(dbFileVers), 2
28650 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  4);.        if( 
28660 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
28670 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
28680 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
28690 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
286a0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62         memset(db
286b0 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a  FileVers, 0, siz
286c0 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
286d0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
286e0 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67   if( memcmp(pPag
286f0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
28700 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
28710 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 21  of(dbFileVers))!
28720 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  =0 ){.        pa
28730 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
28740 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
28750 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
28760 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
28770 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  de || pPager->st
28780 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
28790 44 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  D );..    /* If 
287a0 74 68 65 72 65 20 69 73 20 61 20 57 41 4c 20 66  there is a WAL f
287b0 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  ile in the file-
287c0 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69  system, open thi
287d0 73 20 64 61 74 61 62 61 73 65 20 69 6e 20 57 41  s database in WA
287e0 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f  L.    ** mode. O
287f0 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f  therwise, the fo
28800 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
28810 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
28820 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
28830 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66  = pagerOpenWalIf
28840 50 72 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b  Present(pPager);
28850 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20  .  }.. failed:. 
28860 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28870 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67  OK ){.    /* pag
28880 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 61  er_unlock() is a
28890 20 6e 6f 2d 6f 70 20 66 6f 72 20 65 78 63 6c 75   no-op for exclu
288a0 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 6e  sive mode and in
288b0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
288c0 73 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f  s. */.    pager_
288d0 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
288e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
288f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
28900 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
28910 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72   has reached zer
28920 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  o, rollback any 
28930 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
28940 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b  ction and unlock
28950 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a   the pager..**.*
28960 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63  * Except, in loc
28970 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
28980 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20 69  IVE when there i
28990 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a  s nothing to in.
289a0 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
289b0 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c  journal, the unl
289c0 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f  ock is not perfo
289d0 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20 69  rmed and there i
289e0 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20  s.** nothing to 
289f0 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69  rollback, so thi
28a00 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
28a10 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  o-op..*/ .static
28a20 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
28a30 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20  kIfUnused(Pager 
28a40 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
28a50 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65  (sqlite3PcacheRe
28a60 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
28a70 50 43 61 63 68 65 29 3d 3d 30 29 0a 20 20 20 26  PCache)==0).   &
28a80 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  & (!pPager->excl
28a90 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61  usiveMode || pPa
28aa0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e  ger->journalOff>
28ab0 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 61 67  0) .  ){.    pag
28ac0 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
28ad0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
28ae0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
28af0 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
28b00 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e   page number pgn
28b10 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61 67 65  o in pager pPage
28b20 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66  r (a page.** ref
28b30 65 72 65 6e 63 65 20 68 61 73 20 74 79 70 65 20  erence has type 
28b40 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65  DbPage*). If the
28b50 20 72 65 71 75 65 73 74 65 64 20 72 65 66 65 72   requested refer
28b60 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63  ence is .** succ
28b70 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65  essfully obtaine
28b80 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  d, it is copied 
28b90 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53  to *ppPage and S
28ba0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
28bb0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
28bc0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
28bd0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
28be0 20 63 61 63 68 65 2c 20 69 74 20 69 73 20 72 65   cache, it is re
28bf0 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65  turned. .** Othe
28c00 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67  rwise, a new pag
28c10 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  e object is allo
28c20 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61  cated and popula
28c30 74 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a  ted with data.**
28c40 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
28c50 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e  atabase file. In
28c60 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65   some cases, the
28c70 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d   pcache module m
28c80 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74  ay.** choose not
28c90 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e   to allocate a n
28ca0 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61  ew page object a
28cb0 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20  nd may reuse an 
28cc0 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65  existing.** obje
28cd0 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74  ct with no outst
28ce0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
28cf0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74  s..**.** The ext
28d00 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64  ra data appended
28d10 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c   to a page is al
28d20 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ways initialized
28d30 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a   to zeros the .*
28d40 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70  * first time a p
28d50 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e  age is loaded in
28d60 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68  to memory. If th
28d70 65 20 70 61 67 65 20 72 65 71 75 65 73 74 65 64  e page requested
28d80 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20   is .** already 
28d90 69 6e 20 74 68 65 20 63 61 63 68 65 20 77 68 65  in the cache whe
28da0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
28db0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  is called, then 
28dc0 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74  the extra.** dat
28dd0 61 20 69 73 20 6c 65 66 74 20 61 73 20 69 74 20  a is left as it 
28de0 77 61 73 20 77 68 65 6e 20 74 68 65 20 70 61 67  was when the pag
28df0 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73  e object was las
28e00 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  t used..**.** If
28e10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
28e20 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  age is smaller t
28e30 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
28e40 64 20 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a  d page or if a .
28e50 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ** non-zero valu
28e60 65 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74  e is passed as t
28e70 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72  he noContent par
28e80 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a  ameter and the .
28e90 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70 61 67  ** requested pag
28ea0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
28eb0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63   stored in the c
28ec0 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a  ache, then no .*
28ed0 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65  * actual disk re
28ee0 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68  ad occurs. In th
28ef0 69 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f  is case the memo
28f00 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
28f10 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74  .** page is init
28f20 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a  ialized to all z
28f30 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  eros. .**.** If 
28f40 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
28f50 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
28f60 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
28f70 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
28f80 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  ts.** of the pag
28f90 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20 69  e. This occurs i
28fa0 6e 20 74 77 6f 20 73 65 70 65 72 61 74 65 20 73  n two seperate s
28fb0 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20  cenarios:.**.** 
28fc0 20 20 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e    a) When readin
28fd0 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  g a free-list le
28fe0 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  af page from the
28ff0 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a   database, and.*
29000 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61  *.**   b) When a
29010 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65   savepoint is be
29020 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ing rolled back 
29030 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c  and we need to l
29040 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65  oad.**      a ne
29050 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  w page into the 
29060 63 61 63 68 65 20 74 6f 20 62 65 20 66 69 6c 6c  cache to be fill
29070 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
29080 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72   read.**      fr
29090 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  om the savepoint
290a0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
290b0 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20  If noContent is 
290c0 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64  true, then the d
290d0 61 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20  ata returned is 
290e0 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f  zeroed instead o
290f0 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20  f.** being read 
29100 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
29110 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  e. Additionally,
29120 20 74 68 65 20 62 69 74 73 20 63 6f 72 72 65 73   the bits corres
29130 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67  ponding.** to pg
29140 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  no in Pager.pInJ
29150 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f  ournal (bitvec o
29160 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
29170 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a  written to the.*
29180 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  * journal file) 
29190 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76  and the PagerSav
291a0 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
291b0 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20 61  int bitvecs of a
291c0 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70  ny open.** savep
291d0 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54  oints are set. T
291e0 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65  his means if the
291f0 20 70 61 67 65 20 69 73 20 6d 61 64 65 20 77 72   page is made wr
29200 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a  itable at any.**
29210 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
29220 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61  ture, using a ca
29230 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
29240 65 72 57 72 69 74 65 28 29 2c 20 69 74 73 20 63  erWrite(), its c
29250 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20  ontents.** will 
29260 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64  not be journaled
29270 2e 20 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e  . This saves IO.
29280 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69  .**.** The acqui
29290 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69  sition might fai
292a0 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65  l for several re
292b0 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63  asons.  In all c
292c0 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72  ases,.** an appr
292d0 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
292e0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
292f0 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  nd *ppPage is se
29300 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
29310 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
29320 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20  3PagerLookup(). 
29330 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
29340 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20  ne and Lookup() 
29350 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69  attempt.** to fi
29360 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
29370 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
29380 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20   first.  If the 
29390 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
293a0 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  ady.** in memory
293b0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  , this routine g
293c0 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72  oes to disk to r
293d0 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61  ead it in wherea
293e0 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75  s Lookup().** ju
293f0 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
29400 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
29410 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
29420 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
29430 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
29440 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
29450 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
29460 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
29470 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
29480 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20   Since Lookup() 
29490 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69  never goes to di
294a0 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73  sk, it never has
294b0 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f   to deal with lo
294c0 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61  cks.** or journa
294d0 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20  l files..*/.int 
294e0 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
294f0 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ire(.  Pager *pP
29500 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
29510 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
29520 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29530 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
29540 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
29550 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
29560 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
29570 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
29580 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
29590 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
295a0 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
295b0 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  nt       /* Do n
295c0 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e  ot bother readin
295d0 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  g content from d
295e0 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  isk if true */.)
295f0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
29600 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73  Hdr *pPg;..  ass
29610 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
29620 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
29630 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
29640 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52  ger->state>PAGER
29650 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66  _UNLOCK );..  if
29660 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ( pgno==0 ){.   
29670 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
29680 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
29690 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
296a0 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72  ger is in the er
296b0 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75 72  ror state, retur
296c0 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64  n an error immed
296d0 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74  iately. .  ** Ot
296e0 68 65 72 77 69 73 65 2c 20 72 65 71 75 65 73 74  herwise, request
296f0 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
29700 68 65 20 50 43 61 63 68 65 20 6c 61 79 65 72 2e  he PCache layer.
29710 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
29720 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
29730 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
29740 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
29750 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d  FULL ){.    rc =
29760 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
29770 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
29780 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
29790 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
297a0 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c  PCache, pgno, 1,
297b0 20 70 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20   ppPage);.  }.. 
297c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
297d0 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74  OK ){.    /* Eit
297e0 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  her the call to 
297f0 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
29800 63 68 28 29 20 72 65 74 75 72 6e 65 64 20 61 6e  ch() returned an
29810 20 65 72 72 6f 72 20 6f 72 20 74 68 65 0a 20 20   error or the.  
29820 20 20 2a 2a 20 70 61 67 65 72 20 77 61 73 20 61    ** pager was a
29830 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72  lready in the er
29840 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74  ror-state when t
29850 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  his function was
29860 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20   called..    ** 
29870 53 65 74 20 70 50 67 20 74 6f 20 30 20 61 6e 64  Set pPg to 0 and
29880 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 78 63   jump to the exc
29890 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20  eption handler. 
298a0 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 30 3b   */.    pPg = 0;
298b0 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f  .    goto pager_
298c0 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d  acquire_err;.  }
298d0 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50  .  assert( (*ppP
298e0 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f  age)->pgno==pgno
298f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a   );.  assert( (*
29900 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d  ppPage)->pPager=
29910 3d 70 50 61 67 65 72 20 7c 7c 20 28 2a 70 70 50  =pPager || (*ppP
29920 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 30 20  age)->pPager==0 
29930 29 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70 50 61  );..  if( (*ppPa
29940 67 65 29 2d 3e 70 50 61 67 65 72 20 26 26 20 21  ge)->pPager && !
29950 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
29960 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
29970 20 74 68 65 20 70 63 61 63 68 65 20 61 6c 72 65   the pcache alre
29980 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  ady contains an 
29990 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79  initialized copy
299a0 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70   of.    ** the p
299b0 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68  age. Return with
299c0 6f 75 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e  out further ado.
299d0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
299e0 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58   pgno<=PAGER_MAX
299f0 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50  _PGNO && pgno!=P
29a00 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
29a10 67 65 72 29 20 29 3b 0a 20 20 20 20 50 41 47 45  ger) );.    PAGE
29a20 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
29a30 48 69 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Hit);.    return
29a40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d   SQLITE_OK;..  }
29a50 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
29a60 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73   pager cache has
29a70 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70   created a new p
29a80 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74  age. Its content
29a90 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a   needs to .    *
29aa0 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  * be initialized
29ab0 2e 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d  .  */.    int nM
29ac0 61 78 3b 0a 0a 20 20 20 20 50 41 47 45 52 5f 49  ax;..    PAGER_I
29ad0 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73  NCR(pPager->nMis
29ae0 73 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 2a 70  s);.    pPg = *p
29af0 70 50 61 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e  pPage;.    pPg->
29b00 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
29b10 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78  ..    /* The max
29b20 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72  imum page number
29b30 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e   is 2^31. Return
29b40 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
29b50 69 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a 2a  if a page.    **
29b60 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
29b70 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74 68  than this, or th
29b80 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67  e unused locking
29b90 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75 65 73  -page, is reques
29ba0 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ted. */.    if( 
29bb0 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50  pgno>PAGER_MAX_P
29bc0 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  GNO || pgno==PAG
29bd0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
29be0 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
29bf0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
29c00 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
29c10 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
29c20 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  rr;.    }..    r
29c30 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
29c40 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
29c50 2c 20 26 6e 4d 61 78 29 3b 0a 20 20 20 20 69 66  , &nMax);.    if
29c60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29c70 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
29c80 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
29c90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
29ca0 4d 45 4d 44 42 20 7c 7c 20 6e 4d 61 78 3c 28 69  MEMDB || nMax<(i
29cb0 6e 74 29 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e  nt)pgno || noCon
29cc0 74 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28  tent || !isOpen(
29cd0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
29ce0 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
29cf0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
29d00 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
29d10 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ITE_FULL;.      
29d20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
29d30 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
29d40 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f  }.      if( noCo
29d50 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  ntent ){.       
29d60 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73   /* Failure to s
29d70 65 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74  et the bits in t
29d80 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  he InJournal bit
29d90 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69  -vectors is beni
29da0 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  gn..        ** I
29db0 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74  t merely means t
29dc0 68 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20  hat we might do 
29dd0 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20  some extra work 
29de0 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20  to journal a .  
29df0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68        ** page th
29e00 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
29e10 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64   to be journaled
29e20 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
29e30 20 62 65 20 73 75 72 65 20 0a 20 20 20 20 20 20   be sure .      
29e40 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65    ** to test the
29e50 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61   case where a ma
29e60 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72  lloc error occur
29e70 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
29e80 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a  o set .        *
29e90 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62 69 74  * a bit in a bit
29ea0 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20   vector..       
29eb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
29ec0 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
29ed0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
29ee0 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72  if( pgno<=pPager
29ef0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a  ->dbOrigSize ){.
29f00 20 20 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e            TESTON
29f10 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74  LY( rc = ) sqlit
29f20 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
29f30 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
29f40 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
29f50 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
29f60 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
29f70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29f80 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20   TESTONLY( rc = 
29f90 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  ) addToSavepoint
29fa0 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
29fb0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74  pgno);.        t
29fc0 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
29fd0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
29fe0 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
29ff0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
2a000 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
2a010 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20  set(pPg->pData, 
2a020 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
2a030 69 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  ize);.      IOTR
2a040 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64  ACE(("ZERO %p %d
2a050 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
2a060 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  o));.    }else{.
2a070 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2a080 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
2a090 72 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  r );.      rc = 
2a0a0 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b  readDbPage(pPg);
2a0b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2a0c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a0d0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
2a0e0 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
2a0f0 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66    }.    }.#ifdef
2a100 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
2a110 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
2a120 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
2a130 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
2a140 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  dif.  }..  retur
2a150 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
2a160 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a  ger_acquire_err:
2a170 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
2a180 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
2a190 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c  ( pPg ){.    sql
2a1a0 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70  ite3PcacheDrop(p
2a1b0 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  Pg);.  }.  pager
2a1c0 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70  UnlockIfUnused(p
2a1d0 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61  Pager);..  *ppPa
2a1e0 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ge = 0;.  return
2a1f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63   rc;.}../*.** Ac
2a200 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20  quire a page if 
2a210 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  it is already in
2a220 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
2a230 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74  ache.  Do.** not
2a240 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66   read the page f
2a250 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72  rom disk.  Retur
2a260 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
2a270 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30  he page,.** or 0
2a280 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
2a290 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 41 6c  not in cache. Al
2a2a0 73 6f 2c 20 72 65 74 75 72 6e 20 30 20 69 66 20  so, return 0 if 
2a2b0 74 68 65 20 0a 2a 2a 20 70 61 67 65 72 20 69 73  the .** pager is
2a2c0 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   in PAGER_UNLOCK
2a2d0 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
2a2e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2a2f0 6c 65 64 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68  led,.** or if th
2a300 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 61 6e  e pager is in an
2a310 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68   error state oth
2a320 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46  er than SQLITE_F
2a330 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ULL..**.** See a
2a340 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
2a350 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66  Get().  The diff
2a360 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
2a370 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
2a380 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  nd sqlite3PagerG
2a390 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65  et() is that _ge
2a3a0 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74  t() will go to t
2a3b0 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64  he disk and read
2a3c0 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20  .** in the page 
2a3d0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
2a3e0 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  ot already in ca
2a3f0 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
2a400 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  ne.** returns NU
2a410 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  LL if the page i
2a420 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
2a430 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20  r if a disk I/O 
2a440 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76  error .** has ev
2a450 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a  er happened..*/.
2a460 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50  DbPage *sqlite3P
2a470 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72  agerLookup(Pager
2a480 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
2a490 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
2a4a0 50 67 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  Pg = 0;.  assert
2a4b0 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
2a4c0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
2a4d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2a4e0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30  ager->pPCache!=0
2a4f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2a500 61 67 65 72 2d 3e 73 74 61 74 65 20 3e 20 50 41  ager->state > PA
2a510 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
2a520 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
2a530 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
2a540 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50  he, pgno, 0, &pP
2a550 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g);.  return pPg
2a560 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
2a570 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72 65  se a page refere
2a580 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nce..**.** If th
2a590 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
2a5a0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
2a5b0 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
2a5c0 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
2a5d0 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
2a5e0 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
2a5f0 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
2a600 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
2a610 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
2a620 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
2a630 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
2a640 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
2a650 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
2a660 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
2a670 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70  rUnref(DbPage *p
2a680 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29  Pg){.  if( pPg )
2a690 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  {.    Pager *pPa
2a6a0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
2a6b0 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  r;.    sqlite3Pc
2a6c0 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29  acheRelease(pPg)
2a6d0 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  ;.    pagerUnloc
2a6e0 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
2a6f0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2a700 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2a710 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73   called at the s
2a720 74 61 72 74 20 6f 66 20 65 76 65 72 79 20 77 72  tart of every wr
2a730 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
2a740 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61  .** There must a
2a750 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45  lready be a RESE
2a760 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
2a770 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
2a780 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
2a790 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
2a7a0 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
2a7b0 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  ** Open the jour
2a7c0 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
2a7d0 65 72 20 70 50 61 67 65 72 20 61 6e 64 20 77 72  er pPager and wr
2a7e0 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65  ite a journal he
2a7f0 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73  ader.** to the s
2a800 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74  tart of it. If t
2a810 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20  here are active 
2a820 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e  savepoints, open
2a830 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2a840 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69  .** as well. Thi
2a850 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
2a860 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  ly used when the
2a870 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2a880 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65   being .** opene
2a890 64 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c  d to write a rol
2a8a0 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20  lback log for a 
2a8b0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20  transaction. It 
2a8c0 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20  is not used .** 
2a8d0 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68  when opening a h
2a8e0 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot journal file 
2a8f0 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  to roll it back.
2a900 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
2a910 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c  urnal file is al
2a920 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69  ready open (as i
2a930 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c  t may be in excl
2a940 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20  usive mode),.** 
2a950 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
2a960 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20 61  on just writes a
2a970 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
2a980 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
2a990 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f  the.** already o
2a9a0 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  pen file. .**.**
2a9b0 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
2a9c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2a9d0 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68   is opened by th
2a9e0 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  is function, the
2a9f0 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  .** Pager.pInJou
2aa00 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72 75  rnal bitvec stru
2aa10 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
2aa20 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
2aa30 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
2aa40 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
2aa50 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73  essful. Otherwis
2aa60 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  e, return .** SQ
2aa70 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68  LITE_NOMEM if th
2aa80 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c  e attempt to all
2aa90 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a  ocate Pager.pInJ
2aaa0 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72  ournal fails, or
2aab0 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72   .** an IO error
2aac0 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67   code if opening
2aad0 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
2aae0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69  journal file fai
2aaf0 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2ab00 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  t pager_open_jou
2ab10 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
2ab20 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
2ab30 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2ab40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab50 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2ab60 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b   */.  int nPage;
2ab70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab90 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61   /* Size of data
2aba0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 73  base file */.  s
2abb0 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
2abc0 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
2abd0 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63  ->pVfs;   /* Loc
2abe0 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73 20  al cache of vfs 
2abf0 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  pointer */..  as
2ac00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
2ac10 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
2ac20 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  VED );.  assert(
2ac30 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
2ac40 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
2ac50 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2ac60 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
2ac70 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20  NALMODE_OFF );. 
2ac80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2ac90 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
2aca0 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72  ;.  .  /* If alr
2acb0 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f  eady in the erro
2acc0 72 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75  r state, this fu
2acd0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
2ace0 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20  p.  But on.  ** 
2acf0 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
2ad00 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
2ad10 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20  never called if 
2ad20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  we are already i
2ad30 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20  n.  ** an error 
2ad40 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20  state. */.  if( 
2ad50 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72  NEVER(pPager->er
2ad60 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20  rCode) ) return 
2ad70 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
2ad80 0a 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50  ..  testcase( pP
2ad90 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
2ada0 64 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73  d==0 );.  rc = s
2adb0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
2adc0 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
2add0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
2ade0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50   return rc;.  pP
2adf0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
2ae00 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
2ae10 43 72 65 61 74 65 28 6e 50 61 67 65 29 3b 0a 20  Create(nPage);. 
2ae20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e   if( pPager->pIn
2ae30 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20  Journal==0 ){.  
2ae40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ae50 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
2ae60 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
2ae70 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  l file if it is 
2ae80 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
2ae90 2e 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70  . */.  if( !isOp
2aea0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
2aeb0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
2aec0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
2aed0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2aee0 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
2aef0 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72    sqlite3MemJour
2af00 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
2af10 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  jfd);.    }else{
2af20 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
2af30 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20   flags =        
2af40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46             /* VF
2af50 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20  S flags to open 
2af60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
2af70 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
2af80 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
2af90 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
2afa0 7c 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65  |.        (pPage
2afb0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20  r->tempFile ? . 
2afc0 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
2afd0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
2afe0 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  OSE|SQLITE_OPEN_
2aff0 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20  TEMP_JOURNAL):. 
2b000 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
2b010 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
2b020 41 4c 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 23  AL).        );.#
2b030 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2b040 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
2b050 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2b060 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a  te3JournalOpen(.
2b070 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
2b080 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2b090 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
2b0a0 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72  lags, jrnlBuffer
2b0b0 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20  Size(pPager).   
2b0c0 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20     );.#else.    
2b0d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2b0e0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
2b0f0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
2b100 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
2b110 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
2b120 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2b130 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 63 20          int iDc 
2b140 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
2b150 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
2b160 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
2b170 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
2b180 61 66 65 4a 72 6e 6c 48 61 6e 64 6c 65 20 3d 20  afeJrnlHandle = 
2b190 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
2b1a0 50 5f 53 41 46 45 5f 44 45 4c 45 54 45 29 21 3d  P_SAFE_DELETE)!=
2b1b0 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  0;.      }.#endi
2b1c0 66 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  f.    }.    asse
2b1d0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
2b1e0 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
2b1f0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 7d 0a  er->jfd) );.  }.
2b200 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  ..  /* Write the
2b210 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
2b220 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75  eader to the jou
2b230 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70  rnal file and op
2b240 65 6e 20 0a 20 20 2a 2a 20 74 68 65 20 73 75 62  en .  ** the sub
2b250 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65  -journal if nece
2b260 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ssary..  */.  if
2b270 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b280 29 7b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  ){.    /* TODO: 
2b290 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20  Check if all of 
2b2a0 74 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79  these are really
2b2b0 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
2b2c0 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67    pPager->dbOrig
2b2d0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
2b2e0 62 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65  bSize;.    pPage
2b2f0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
2b300 64 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  d = 0;.    pPage
2b310 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
2b320 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
2b330 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  c = 0;.    pPage
2b340 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
2b350 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
2b360 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
2b370 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2b380 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 72 63  lHdr = 0;.    rc
2b390 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
2b3a0 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  dr(pPager);.  }.
2b3b0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2b3c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
2b3d0 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
2b3e0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
2b3f0 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  nal);.    pPager
2b400 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
2b410 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2b420 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  c;.}../*.** Begi
2b430 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
2b440 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65  ction on the spe
2b450 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a  cified pager obj
2b460 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72  ect. If a .** wr
2b470 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
2b480 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
2b490 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75   opened, this fu
2b4a0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
2b4b0 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
2b4c0 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  exFlag argument 
2b4d0 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61  is false, then a
2b4e0 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 20  cquire at least 
2b4f0 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f  a RESERVED.** lo
2b500 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2b510 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c  se file. If exFl
2b520 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
2b530 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73   acquire at leas
2b540 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56  t.** an EXCLUSIV
2b550 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20  E lock. If such 
2b560 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  a lock is alread
2b570 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69  y held, no locki
2b580 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  ng .** functions
2b590 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e   need be called.
2b5a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69  .**.** If this i
2b5b0 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72  s not a temporar
2b5c0 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  y or in-memory f
2b5d0 69 6c 65 20 61 6e 64 2c 20 74 68 65 20 6a 6f 75  ile and, the jou
2b5e0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 2a 2a  rnal file is .**
2b5f0 20 6f 70 65 6e 65 64 20 69 66 20 69 74 20 68 61   opened if it ha
2b600 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 72 65 61  s not been alrea
2b610 64 79 2e 20 46 6f 72 20 61 20 74 65 6d 70 6f 72  dy. For a tempor
2b620 61 72 79 20 66 69 6c 65 2c 20 74 68 65 20 6f 70  ary file, the op
2b630 65 6e 69 6e 67 20 0a 2a 2a 20 6f 66 20 74 68 65  ening .** of the
2b640 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2b650 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
2b660 74 68 65 72 65 20 69 73 20 61 6e 20 61 63 74 75  there is an actu
2b670 61 6c 20 6e 65 65 64 20 74 6f 20 0a 2a 2a 20 77  al need to .** w
2b680 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
2b690 6e 61 6c 2e 20 54 4f 44 4f 3a 20 57 68 79 20 68  nal. TODO: Why h
2b6a0 61 6e 64 6c 65 20 74 65 6d 70 6f 72 61 72 79 20  andle temporary 
2b6b0 66 69 6c 65 73 20 64 69 66 66 65 72 65 6e 74 6c  files differentl
2b6c0 79 3f 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y?.**.** If the 
2b6d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2b6e0 6f 70 65 6e 65 64 20 28 6f 72 20 69 66 20 69 74  opened (or if it
2b6f0 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
2b700 29 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 6a 6f 75  ), then a.** jou
2b710 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 77  rnal-header is w
2b720 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 74  ritten to the st
2b730 61 72 74 20 6f 66 20 69 74 2e 0a 2a 2a 0a 2a 2a  art of it..**.**
2b740 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65   If the subjInMe
2b750 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73  mory argument is
2b760 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
2b770 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  any sub-journal 
2b780 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e  opened.** within
2b790 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
2b7a0 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  n will be opened
2b7b0 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
2b7c0 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68   file. This.** h
2b7d0 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66 20  as no effect if 
2b7e0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
2b7f0 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  is already opene
2b800 64 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  d (as it may be 
2b810 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20  when.** running 
2b820 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
2b830 65 29 20 6f 72 20 69 66 20 74 68 65 20 74 72 61  e) or if the tra
2b840 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  nsaction does no
2b850 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20 73  t require a.** s
2b860 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74  ub-journal. If t
2b870 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  he subjInMemory 
2b880 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f  argument is zero
2b890 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69  , then any requi
2b8a0 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e  red.** sub-journ
2b8b0 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  al is implemente
2b8c0 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70  d in-memory if p
2b8d0 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d  Pager is an in-m
2b8e0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
2b8f0 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20 74  .** or using a t
2b900 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f 74  emporary file ot
2b910 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20  herwise..*/.int 
2b920 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
2b930 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  n(Pager *pPager,
2b940 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e 74   int exFlag, int
2b950 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a   subjInMemory){.
2b960 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2b970 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
2b980 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
2b990 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
2b9a0 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d   pPager->subjInM
2b9b0 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62 6a  emory = (u8)subj
2b9c0 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66 28  InMemory;..  if(
2b9d0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
2b9e0 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a  PAGER_SHARED ){.
2b9f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2ba00 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
2ba10 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2ba20 20 21 4d 45 4d 44 42 20 26 26 20 21 70 50 61 67   !MEMDB && !pPag
2ba30 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
2ba40 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
2ba50 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
2ba60 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2ba70 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67 75  pager is configu
2ba80 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69  red to use locki
2ba90 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
2baa0 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20  e, and an.      
2bab0 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  ** exclusive loc
2bac0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2bad0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
2bae0 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74   held, obtain it
2baf0 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   now..      */. 
2bb00 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
2bb10 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
2bb20 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c  & sqlite3WalExcl
2bb30 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72  usiveMode(pPager
2bb40 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20  ->pWal, -1) ){. 
2bb50 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2bb60 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
2bb70 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f  ->fd, EXCLUSIVE_
2bb80 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 70  LOCK);.        p
2bb90 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
2bba0 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
2bbb0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2bbc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2bbd0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2bbe0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bbf0 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75   sqlite3WalExclu
2bc00 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d  siveMode(pPager-
2bc10 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20  >pWal, 1);.     
2bc20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 72 61   }..      /* Gra
2bc30 62 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  b the write lock
2bc40 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   on the log file
2bc50 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
2bc60 20 75 70 67 72 61 64 65 20 74 6f 0a 20 20 20 20   upgrade to.    
2bc70 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52    ** PAGER_RESER
2bc80 56 45 44 20 73 74 61 74 65 2e 20 4f 74 68 65 72  VED state. Other
2bc90 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  wise, return an 
2bca0 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
2bcb0 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20  e caller..      
2bcc0 2a 2a 20 54 68 65 20 62 75 73 79 2d 68 61 6e 64  ** The busy-hand
2bcd0 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b  ler is not invok
2bce0 65 64 20 69 66 20 61 6e 6f 74 68 65 72 20 63 6f  ed if another co
2bcf0 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65 61 64 79  nnection already
2bd00 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20  .      ** holds 
2bd10 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20  the write-lock. 
2bd20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65  If possible, the
2bd30 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c   upper layer wil
2bd40 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20 20 20 20  l call it..     
2bd50 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c   **.      ** WAL
2bd60 20 6d 6f 64 65 20 73 65 74 73 20 50 61 67 65 72   mode sets Pager
2bd70 2e 73 74 61 74 65 20 74 6f 20 50 41 47 45 52 5f  .state to PAGER_
2bd80 52 45 53 45 52 56 45 44 20 77 68 65 6e 20 69 74  RESERVED when it
2bd90 20 68 61 73 20 61 6e 20 6f 70 65 6e 0a 20 20 20   has an open.   
2bda0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
2bdb0 6e 2c 20 62 75 74 20 6e 65 76 65 72 20 74 6f 20  n, but never to 
2bdc0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 2e  PAGER_EXCLUSIVE.
2bdd0 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
2bde0 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 50 41   in .      ** PA
2bdf0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 73 74  GER_EXCLUSIVE st
2be00 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
2be10 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65 70 6f  roll back savepo
2be20 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  int transactions
2be30 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f  .      ** may co
2be40 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  py data from the
2be50 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74   sub-journal int
2be60 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2be70 69 6c 65 20 61 73 20 77 65 6c 6c 0a 20 20 20 20  ile as well.    
2be80 20 20 2a 2a 20 61 73 20 69 6e 74 6f 20 74 68 65    ** as into the
2be90 20 70 61 67 65 20 63 61 63 68 65 2e 20 57 68 69   page cache. Whi
2bea0 63 68 20 77 6f 75 6c 64 20 62 65 20 69 6e 63 6f  ch would be inco
2beb0 72 72 65 63 74 20 69 6e 20 57 41 4c 20 6d 6f 64  rrect in WAL mod
2bec0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
2bed0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
2bee0 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73  lBeginWriteTrans
2bef0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
2bf00 57 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Wal);.      if( 
2bf10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2bf20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
2bf30 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50  >dbOrigSize = pP
2bf40 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
2bf50 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
2bf60 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45  ate = PAGER_RESE
2bf70 52 56 45 44 3b 0a 20 20 20 20 20 20 20 20 70 50  RVED;.        pP
2bf80 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2bf90 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
2bfa0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
2bfb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
2bfc0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
2bfd0 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
2bfe0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
2bff0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
2c000 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
2c010 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20  ER_SHARED );.   
2c020 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
2c030 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   Obtain a RESERV
2c040 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
2c050 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
2c060 20 74 68 65 20 65 78 46 6c 61 67 20 70 61 72 61   the exFlag para
2c070 6d 65 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69  meter.      ** i
2c080 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d  s true, then imm
2c090 65 64 69 61 74 65 6c 79 20 75 70 67 72 61 64 65  ediately upgrade
2c0a0 20 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c   this to an EXCL
2c0b0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a  USIVE lock. The.
2c0c0 20 20 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61        ** busy-ha
2c0d0 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63  ndler callback c
2c0e0 61 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e 20  an be used when 
2c0f0 75 70 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65  upgrading to the
2c100 20 45 58 43 4c 55 53 49 56 45 0a 20 20 20 20 20   EXCLUSIVE.     
2c110 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f   ** lock, but no
2c120 74 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67  t when obtaining
2c130 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
2c140 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ck..      */.   
2c150 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2c160 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
2c170 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
2c180 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2c190 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c1a0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
2c1b0 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52  te = PAGER_RESER
2c1c0 56 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28  VED;.        if(
2c1d0 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   exFlag ){.     
2c1e0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
2c1f0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
2c200 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
2c210 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OCK);.        }.
2c220 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2c230 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f     /* No need to
2c240 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   open the journa
2c250 6c 20 66 69 6c 65 20 61 74 20 74 68 69 73 20 74  l file at this t
2c260 69 6d 65 2e 20 20 49 74 20 77 69 6c 6c 20 62 65  ime.  It will be
2c270 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 65 64 20 62  .    ** opened b
2c280 65 66 6f 72 65 20 69 74 20 69 73 20 77 72 69 74  efore it is writ
2c290 74 65 6e 20 74 6f 2e 20 20 49 66 20 77 65 20 64  ten to.  If we d
2c2a0 65 66 65 72 20 6f 70 65 6e 69 6e 67 20 74 68 65  efer opening the
2c2b0 20 6a 6f 75 72 6e 61 6c 2c 0a 20 20 20 20 2a 2a   journal,.    **
2c2c0 20 77 65 20 6d 69 67 68 74 20 73 61 76 65 20 74   we might save t
2c2d0 68 65 20 77 6f 72 6b 20 6f 66 20 63 72 65 61 74  he work of creat
2c2e0 69 6e 67 20 61 20 66 69 6c 65 20 69 66 20 74 68  ing a file if th
2c2f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  e transaction.  
2c300 20 20 2a 2a 20 65 6e 64 73 20 75 70 20 62 65 69    ** ends up bei
2c310 6e 67 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20  ng a no-op..    
2c320 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  */.  }else if( i
2c330 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2c340 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  d) && pPager->jo
2c350 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20  urnalOff==0 ){. 
2c360 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
2c370 6e 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  ns when the page
2c380 72 20 77 61 73 20 69 6e 20 65 78 63 6c 75 73 69  r was in exclusi
2c390 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74  ve-access mode t
2c3a0 68 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74  he last.    ** t
2c3b0 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72 20 77  ime a (read or w
2c3c0 72 69 74 65 29 20 74 72 61 6e 73 61 63 74 69 6f  rite) transactio
2c3d0 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  n was successful
2c3e0 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20  ly concluded.   
2c3f0 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f 6e 6e   ** by this conn
2c400 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20  ection. Instead 
2c410 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  of deleting the 
2c420 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 20  journal file it 
2c430 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74  was .    ** kept
2c440 20 6f 70 65 6e 20 61 6e 64 20 65 69 74 68 65 72   open and either
2c450 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 20 74   was truncated t
2c460 6f 20 30 20 62 79 74 65 73 20 6f 72 20 69 74 73  o 0 bytes or its
2c470 20 68 65 61 64 65 72 20 77 61 73 0a 20 20 20 20   header was.    
2c480 2a 2a 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  ** overwritten w
2c490 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a  ith zeros..    *
2c4a0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61  /.    assert( pa
2c4b0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2c4c0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
2c4d0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  rt( pPager->nRec
2c4e0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
2c4f0 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  t( pPager->dbOri
2c500 67 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20  gSize==0 );.    
2c510 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2c520 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
2c530 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
2c540 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
2c550 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  ger);.  }..  PAG
2c560 45 52 54 52 41 43 45 28 28 22 54 52 41 4e 53 41  ERTRACE(("TRANSA
2c570 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
2c580 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
2c590 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2c5a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
2c5b0 74 28 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f  t( !pPager->dbMo
2c5c0 64 69 66 69 65 64 20 29 3b 0a 20 20 20 20 2f 2a  dified );.    /*
2c5d0 20 49 67 6e 6f 72 65 20 61 6e 79 20 49 4f 20 65   Ignore any IO e
2c5e0 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 73  rror that occurs
2c5f0 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 65 6e   within pager_en
2c600 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 29 2e  d_transaction().
2c610 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 75 72 70   The.    ** purp
2c620 6f 73 65 20 6f 66 20 74 68 69 73 20 63 61 6c 6c  ose of this call
2c630 20 69 73 20 74 6f 20 72 65 73 65 74 20 74 68 65   is to reset the
2c640 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
2c650 6f 66 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  of the pager.   
2c660 20 2a 2a 20 73 75 62 2d 73 79 73 74 65 6d 2e 20   ** sub-system. 
2c670 49 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  It doesn't matte
2c680 72 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r if the journal
2c690 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 72 6f  -file is not pro
2c6a0 70 65 72 6c 79 0a 20 20 20 20 2a 2a 20 66 69 6e  perly.    ** fin
2c6b0 61 6c 69 7a 65 64 20 61 74 20 74 68 69 73 20 70  alized at this p
2c6c0 6f 69 6e 74 20 28 73 69 6e 63 65 20 69 74 20 69  oint (since it i
2c6d0 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 6a 6f  s not a valid jo
2c6e0 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 79 77 61  urnal file anywa
2c6f0 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  y)..    */.    p
2c700 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
2c710 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b  tion(pPager, 0);
2c720 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2c730 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
2c740 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20 70 61  a single data pa
2c750 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e  ge as writeable.
2c760 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69   The page is wri
2c770 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a  tten into the .*
2c780 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f  * main journal o
2c790 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73  r sub-journal as
2c7a0 20 72 65 71 75 69 72 65 64 2e 20 49 66 20 74 68   required. If th
2c7b0 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
2c7c0 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66  n into.** one of
2c7d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74   the journals, t
2c7e0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
2c7f0 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 74   bit is set in t
2c800 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e  he .** Pager.pIn
2c810 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 61  Journal bitvec a
2c820 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65  nd the PagerSave
2c830 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
2c840 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66  nt bitvecs.** of
2c850 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65 70 6f   any open savepo
2c860 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70 72 69  ints as appropri
2c870 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ate..*/.static i
2c880 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 28 50  nt pager_write(P
2c890 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f  gHdr *pPg){.  vo
2c8a0 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d  id *pData = pPg-
2c8b0 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20  >pData;.  Pager 
2c8c0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
2c8d0 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
2c8e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
2c8f0 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
2c900 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e  is not called un
2c910 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69  less a transacti
2c920 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
2c930 65 65 6e 0a 20 20 2a 2a 20 73 74 61 72 74 65 64  een.  ** started
2c940 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2c950 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
2c960 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
2c970 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
2c980 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 65  ror has been pre
2c990 76 69 6f 75 73 6c 79 20 64 65 74 65 63 74 65 64  viously detected
2c9a0 2c 20 72 65 70 6f 72 74 20 74 68 65 20 73 61 6d  , report the sam
2c9b0 65 20 65 72 72 6f 72 0a 20 20 2a 2a 20 61 67 61  e error.  ** aga
2c9c0 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e  in..  */.  if( N
2c9d0 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
2c9e0 43 6f 64 65 29 20 29 20 20 72 65 74 75 72 6e 20  Code) )  return 
2c9f0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
2ca00 0a 0a 20 20 2f 2a 20 48 69 67 68 65 72 2d 6c 65  ..  /* Higher-le
2ca10 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 6e 65 76  vel routines nev
2ca20 65 72 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  er call this fun
2ca30 63 74 69 6f 6e 20 69 66 20 64 61 74 61 62 61 73  ction if databas
2ca40 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 77 72  e is not.  ** wr
2ca50 69 74 61 62 6c 65 2e 20 20 42 75 74 20 63 68 65  itable.  But che
2ca60 63 6b 20 61 6e 79 77 61 79 2c 20 6a 75 73 74 20  ck anyway, just 
2ca70 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 2e 20  for robustness. 
2ca80 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
2ca90 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 29  Pager->readOnly)
2caa0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2cab0 5f 50 45 52 4d 3b 0a 0a 20 20 61 73 73 65 72 74  _PERM;..  assert
2cac0 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  ( !pPager->setMa
2cad0 73 74 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b  ster );..  CHECK
2cae0 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f  _PAGE(pPg);..  /
2caf0 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
2cb00 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68  as dirty.  If th
2cb10 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61  e page has alrea
2cb20 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a  dy been written.
2cb30 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72    ** to the jour
2cb40 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  nal then we can 
2cb50 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61  return right awa
2cb60 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  y..  */.  sqlite
2cb70 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
2cb80 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 61 67  (pPg);.  if( pag
2cb90 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20  eInJournal(pPg) 
2cba0 26 26 20 21 73 75 62 6a 52 65 71 75 69 72 65 73  && !subjRequires
2cbb0 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20  Page(pPg) ){.   
2cbc0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
2cbd0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
2cbe0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d  .    pPager->dbM
2cbf0 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d  odified = 1;.  }
2cc00 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66  else{..    /* If
2cc10 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
2cc20 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
2cc30 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
2cc40 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74  o be.    ** writ
2cc50 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73  ten to the trans
2cc60 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f  action journal o
2cc70 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74  r the ckeckpoint
2cc80 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
2cc90 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a  or both..    **.
2cca0 20 20 20 20 2a 2a 20 48 69 67 68 65 72 20 6c 65      ** Higher le
2ccb0 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 73 68 6f  vel routines sho
2ccc0 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
2ccd0 20 73 74 61 72 74 65 64 20 61 20 74 72 61 6e 73   started a trans
2cce0 61 63 74 69 6f 6e 2c 0a 20 20 20 20 2a 2a 20 77  action,.    ** w
2ccf0 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 79 20  hich means they 
2cd00 68 61 76 65 20 61 63 71 75 69 72 65 64 20 74 68  have acquired th
2cd10 65 20 6e 65 63 65 73 73 61 72 79 20 6c 6f 63 6b  e necessary lock
2cd20 73 20 62 75 74 20 74 68 65 20 72 6f 6c 6c 62 61  s but the rollba
2cd30 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  ck.    ** journa
2cd40 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79 65 74 20  l might not yet 
2cd50 62 65 20 6f 70 65 6e 2e 0a 20 20 20 20 2a 2f 0a  be open..    */.
2cd60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2cd70 50 61 67 65 72 42 65 67 69 6e 28 70 50 61 67 65  PagerBegin(pPage
2cd80 72 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 73 75  r, 0, pPager->su
2cd90 62 6a 49 6e 4d 65 6d 6f 72 79 29 3b 0a 20 20 20  bjInMemory);.   
2cda0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2cdb0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
2cdc0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2cdd0 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
2cde0 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20  ger->jfd) .     
2cdf0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
2ce00 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
2ce10 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
2ce20 20 20 20 20 26 26 20 21 70 61 67 65 72 55 73 65      && !pagerUse
2ce30 57 61 6c 28 70 50 61 67 65 72 29 0a 20 20 20 20  Wal(pPager).    
2ce40 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2ce50 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
2ce60 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20 72 63 20  nal );.      rc 
2ce70 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
2ce80 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
2ce90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2cea0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
2ceb0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  c;.    }.    pPa
2cec0 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
2ced0 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54  = 1;.  .    /* T
2cee0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
2cef0 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74  ournal now exist
2cf00 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20  s and we have a 
2cf10 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20  RESERVED or an. 
2cf20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
2cf30 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e  lock on the main
2cf40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2cf50 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65   Write the curre
2cf60 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a  nt page to.    *
2cf70 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
2cf80 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20  n journal if it 
2cf90 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
2cfa0 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
2cfb0 20 69 66 28 20 21 70 61 67 65 49 6e 4a 6f 75 72   if( !pageInJour
2cfc0 6e 61 6c 28 70 50 67 29 20 26 26 20 69 73 4f 70  nal(pPg) && isOp
2cfd0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
2cfe0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2cff0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
2d000 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 69  ager) );.      i
2d010 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  f( pPg->pgno<=pP
2d020 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
2d030 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20   ){.        u32 
2d040 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63  cksum;.        c
2d050 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20  har *pData2;..  
2d060 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75        /* We shou
2d070 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74  ld never write t
2d080 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
2d090 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74  le the page that
2d0a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
2d0b0 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
2d0c0 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f  e locks.  The fo
2d0d0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76  llowing assert v
2d0e0 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20  erifies.        
2d0f0 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
2d100 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  t. */.        as
2d110 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21  sert( pPg->pgno!
2d120 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
2d130 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 20  Pager) );..     
2d140 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2d150 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d  r->journalHdr <=
2d160 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2d170 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 20 20 43  Off );.        C
2d180 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44  ODEC2(pPager, pD
2d190 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
2d1a0 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  7, return SQLITE
2d1b0 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b  _NOMEM, pData2);
2d1c0 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d  .        cksum =
2d1d0 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
2d1e0 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32  ger, (u8*)pData2
2d1f0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2d200 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
2d210 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
2d220 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 67  >journalOff, pPg
2d230 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
2d240 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2d250 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2d260 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
2d270 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
2d280 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
2d290 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20  >pageSize,.     
2d2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d2b0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
2d2c0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 20 34 29  >journalOff + 4)
2d2d0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
2d2e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
2d2f0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
2d300 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ze+4;.        }.
2d310 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2d320 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d330 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
2d340 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
2d350 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
2d360 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d 29 3b  rnalOff, cksum);
2d370 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
2d380 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
2d390 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   4;.        }.  
2d3a0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
2d3b0 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20  JOUT %p %d %lld 
2d3c0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
2d3d0 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20  Pg->pgno, .     
2d3e0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
2d3f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
2d400 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
2d410 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  ));.        PAGE
2d420 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
2d430 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
2d440 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  t);.        PAGE
2d450 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c  RTRACE(("JOURNAL
2d460 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
2d470 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38  Sync=%d hash(%08
2d480 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
2d490 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
2d4a0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
2d4b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28  .             ((
2d4c0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2d4d0 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29  _NEED_SYNC)?1:0)
2d4e0 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
2d4f0 28 70 50 67 29 29 29 3b 0a 0a 20 20 20 20 20 20  (pPg)));..      
2d500 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e 20    /* Even if an 
2d510 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65  IO or diskfull e
2d520 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 77 68  rror occurred wh
2d530 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20  ile journalling 
2d540 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  the.        ** p
2d550 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b  age in the block
2d560 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68 65 20   above, set the 
2d570 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67 20 66  need-sync flag f
2d580 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20  or the page..   
2d590 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73       ** Otherwis
2d5a0 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  e, when the tran
2d5b0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
2d5c0 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69  d back, the logi
2d5d0 63 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  c in.        ** 
2d5e0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
2d5f0 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74  e() will think t
2d600 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65  hat the page nee
2d610 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65  ds to be restore
2d620 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  d.        ** in 
2d630 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2d640 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f 20  e. And if an IO 
2d650 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
2d660 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 20  le doing so,.   
2d670 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72       ** then cor
2d680 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c  ruption may foll
2d690 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ow..        */. 
2d6a0 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
2d6b0 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
2d6c0 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61          pPg->fla
2d6d0 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
2d6e0 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  _SYNC;.         
2d6f0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
2d700 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
2d710 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  ..        /* An 
2d720 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
2d730 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  ed writing to th
2d740 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
2d750 54 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  The .        ** 
2d760 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
2d770 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
2d780 62 79 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f  by the layer abo
2d790 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ve..        */. 
2d7a0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2d7b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d7c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2d7d0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
2d7e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
2d7f0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ++;.        asse
2d800 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
2d810 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20  ournal!=0 );.   
2d820 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2d830 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
2d840 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
2d850 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
2d860 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
2d870 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
2d880 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2d890 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
2d8a0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
2d8b0 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  EM );.        rc
2d8c0 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69   |= addToSavepoi
2d8d0 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
2d8e0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
2d8f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2d900 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d910 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
2d920 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
2d930 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2d940 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
2d950 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2d960 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
2d970 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
2d980 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
2d990 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ync ){.         
2d9a0 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
2d9b0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
2d9c0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
2d9d0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
2d9e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d9f0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 41    PAGERTRACE(("A
2da00 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64  PPEND %d page %d
2da10 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c   needSync=%d\n",
2da20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2da30 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2da40 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20  , pPg->pgno,.   
2da50 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50              ((pP
2da60 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
2da70 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29  EED_SYNC)?1:0)))
2da80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2da90 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
2daa0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
2dab0 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  al is open and t
2dac0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
2dad0 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  n it,.    ** the
2dae0 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  n write the curr
2daf0 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20  ent page to the 
2db00 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
2db10 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20  l.  Note that.  
2db20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
2db30 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  nt journal forma
2db40 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74  t differs from t
2db50 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72  he standard jour
2db60 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a  nal format.    *
2db70 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69  * in that it omi
2db80 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  ts the checksums
2db90 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e   and the header.
2dba0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2dbb0 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
2dbc0 28 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20 72  (pPg) ){.      r
2dbd0 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  c = subjournalPa
2dbe0 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  ge(pPg);.    }. 
2dbf0 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
2dc00 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
2dc10 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20  e and return..  
2dc20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
2dc30 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
2dc40 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66  R_SHARED );.  if
2dc50 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
2dc60 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  <pPg->pgno ){.  
2dc70 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
2dc80 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
2dc90 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2dca0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64  ../*.** Mark a d
2dcb0 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
2dcc0 65 61 62 6c 65 2e 20 54 68 69 73 20 72 6f 75 74  eable. This rout
2dcd0 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c  ine must be call
2dce0 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20 6d 61  ed before .** ma
2dcf0 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f 20  king changes to 
2dd00 61 20 70 61 67 65 2e 20 54 68 65 20 63 61 6c 6c  a page. The call
2dd10 65 72 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68  er must check th
2dd20 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 0a  e return value .
2dd30 2a 2a 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ** of this funct
2dd40 69 6f 6e 20 61 6e 64 20 62 65 20 63 61 72 65 66  ion and be caref
2dd50 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61 6e 67 65  ul not to change
2dd60 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75   any page data u
2dd70 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69 73 20 72  nless .** this r
2dd80 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
2dd90 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
2dda0 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
2ddb0 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63  etween this func
2ddc0 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77  tion and pager_w
2ddd0 72 69 74 65 28 29 20 69 73 20 74 68 61 74 20 74  rite() is that t
2dde0 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
2ddf0 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20  also deals with 
2de00 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  the special case
2de10 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65   where 2 or more
2de20 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e   pages.** fit on
2de30 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73   a single disk s
2de40 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63  ector. In this c
2de50 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64  ase all co-resid
2de60 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73  ent pages.** mus
2de70 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  t have been writ
2de80 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
2de90 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72  al file before r
2dea0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
2deb0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2dec0 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rs, SQLITE_NOMEM
2ded0 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
2dee0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2def0 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70 72 69 61  .** as appropria
2df00 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  te. Otherwise, S
2df10 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
2df20 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2df30 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61  te(DbPage *pDbPa
2df40 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ge){.  int rc = 
2df50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67  SQLITE_OK;..  Pg
2df60 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61  Hdr *pPg = pDbPa
2df70 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge;.  Pager *pPa
2df80 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
2df90 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50  r;.  Pgno nPageP
2dfa0 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67  erSector = (pPag
2dfb0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70  er->sectorSize/p
2dfc0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
2dfd0 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67 65 50 65  ;..  if( nPagePe
2dfe0 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20  rSector>1 ){.   
2dff0 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74   Pgno nPageCount
2e000 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
2e010 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
2e020 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
2e030 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  file */.    Pgno
2e040 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20   pg1;           
2e050 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70        /* First p
2e060 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f  age of the secto
2e070 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64  r pPg is located
2e080 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20   on. */.    int 
2e090 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
2e0a0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2e0b0 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e  of pages startin
2e0c0 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72  g at pg1 to jour
2e0d0 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  nal */.    int i
2e0e0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
2e0f0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2e100 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  nter */.    int 
2e110 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 20 20  needSync = 0;   
2e120 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2e130 20 61 6e 79 20 70 61 67 65 20 68 61 73 20 50 47   any page has PG
2e140 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a 2f  HDR_NEED_SYNC */
2e150 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
2e160 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20   doNotSync flag 
2e170 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62 65  to 1. This is be
2e180 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20  cause we cannot 
2e190 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 0a  allow a journal.
2e1a0 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74 6f      ** header to
2e1b0 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 74 77   be written betw
2e1c0 65 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f  een the pages jo
2e1d0 75 72 6e 61 6c 65 64 20 62 79 20 74 68 69 73 20  urnaled by this 
2e1e0 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  function..    */
2e1f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
2e200 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72  MDB );.    asser
2e210 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
2e220 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Sync==0 );.    p
2e230 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
2e240 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68   = 1;..    /* Th
2e250 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73  is trick assumes
2e260 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20 70   that both the p
2e270 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
2e280 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20  tor-size are.   
2e290 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70   ** an integer p
2e2a0 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65  ower of 2. It se
2e2b0 74 73 20 76 61 72 69 61 62 6c 65 20 70 67 31 20  ts variable pg1 
2e2c0 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  to the identifie
2e2d0 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  r.    ** of the 
2e2e0 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
2e2f0 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20  e sector pPg is 
2e300 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20  located on..    
2e310 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70  */.    pg1 = ((p
2e320 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28  Pg->pgno-1) & ~(
2e330 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31  nPagePerSector-1
2e340 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 72 63 20  )) + 1;..    rc 
2e350 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
2e360 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
2e370 28 69 6e 74 20 2a 29 26 6e 50 61 67 65 43 6f 75  (int *)&nPageCou
2e380 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  nt);.    if( rc 
2e390 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2e3a0 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e   if( pPg->pgno>n
2e3b0 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
2e3c0 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d     nPage = (pPg-
2e3d0 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a  >pgno - pg1)+1;.
2e3e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
2e3f0 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f  g1+nPagePerSecto
2e400 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20  r-1)>nPageCount 
2e410 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
2e420 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67   nPageCount+1-pg
2e430 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
2e440 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
2e450 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20  ePerSector;.    
2e460 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50 61  }.    assert(nPa
2e470 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72  ge>0);.    asser
2e480 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f  t(pg1<=pPg->pgno
2e490 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28 70  );.    assert((p
2e4a0 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70  g1+nPage)>pPg->p
2e4b0 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  gno);..    for(i
2e4c0 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26  i=0; ii<nPage &&
2e4d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
2e4e0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e  ii++){.      Pgn
2e4f0 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20  o pg = pg1+ii;. 
2e500 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
2e510 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d  e;.      if( pg=
2e520 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73  =pPg->pgno || !s
2e530 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
2e540 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
2e550 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20  nal, pg) ){.    
2e560 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45      if( pg!=PAGE
2e570 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
2e580 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
2e590 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2e5a0 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20  Get(pPager, pg, 
2e5b0 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  &pPage);.       
2e5c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2e5d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2e5e0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
2e5f0 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20  rite(pPage);.   
2e600 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61           if( pPa
2e610 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  ge->flags&PGHDR_
2e620 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20  NEED_SYNC ){.   
2e630 20 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53             needS
2e640 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
2e650 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50         assert(pP
2e660 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b  ager->needSync);
2e670 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2e680 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2e690 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
2e6a0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ge);.          }
2e6b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e6c0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61 67   }else if( (pPag
2e6d0 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  e = pager_lookup
2e6e0 28 70 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30  (pPager, pg))!=0
2e6f0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
2e700 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48  pPage->flags&PGH
2e710 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a  DR_NEED_SYNC ){.
2e720 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79            needSy
2e730 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
2e740 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
2e750 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
2e760 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
2e770 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
2e780 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
2e790 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72   flag is set for
2e7a0 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61 67   any of the nPag
2e7b0 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  e pages .    ** 
2e7c0 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 2c  starting at pg1,
2e7d0 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20 74   then it needs t
2e7e0 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c 6c  o be set for all
2e7f0 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75 73   of them. Becaus
2e800 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67  e.    ** writing
2e810 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73 65   to any of these
2e820 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61 79   nPage pages may
2e830 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68 65   damage the othe
2e840 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a  rs, the.    ** j
2e850 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
2e860 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29 65   contain sync()e
2e870 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20  d copies of all 
2e880 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62  of them.    ** b
2e890 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68 65  efore any of the
2e8a0 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  m can be written
2e8b0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
2e8c0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
2e8d0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
2e8e0 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 65 65 64 53  LITE_OK && needS
2e8f0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ync ){.      ass
2e900 65 72 74 28 20 21 4d 45 4d 44 42 20 26 26 20 70  ert( !MEMDB && p
2e910 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30  Pager->noSync==0
2e920 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69   );.      for(ii
2e930 3d 30 3b 20 69 69 3c 6e 50 61 67 65 3b 20 69 69  =0; ii<nPage; ii
2e940 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  ++){.        PgH
2e950 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61 67 65  dr *pPage = page
2e960 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
2e970 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20 20 20   pg1+ii);.      
2e980 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
2e990 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e           pPage->
2e9a0 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
2e9b0 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
2e9c0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
2e9d0 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
2e9e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2e9f0 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
2ea00 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a  ger->needSync);.
2ea10 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
2ea20 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
2ea30 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70  Sync==1 );.    p
2ea40 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
2ea50 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
2ea60 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
2ea70 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
2ea80 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2ea90 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
2eaa0 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20  RUE if the page 
2eab0 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
2eac0 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f  ument was previo
2ead0 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74  usly passed.** t
2eae0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
2eaf0 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72  ite().  In other
2eb00 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
2eb10 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a  RUE if it is ok.
2eb20 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ** to change the
2eb30 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
2eb40 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  page..*/.#ifndef
2eb50 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69   NDEBUG.int sqli
2eb60 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2eb70 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67 29  ble(DbPage *pPg)
2eb80 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  {.  return pPg->
2eb90 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
2eba0 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  Y;.}.#endif../*.
2ebb0 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
2ebc0 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
2ebd0 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
2ebe0 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
2ebf0 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74  ry to.** write t
2ec00 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  he information o
2ec10 6e 20 70 61 67 65 20 70 50 67 20 62 61 63 6b 20  n page pPg back 
2ec20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65  to the disk, eve
2ec30 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74  n though.** that
2ec40 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d   page might be m
2ec50 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
2ec60 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66   This happens, f
2ec70 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
2ec80 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 68 61 73  .** the page has
2ec90 20 62 65 65 6e 20 61 64 64 65 64 20 61 73 20 61   been added as a
2eca0 20 6c 65 61 66 20 6f 66 20 74 68 65 20 66 72 65   leaf of the fre
2ecb0 65 6c 69 73 74 20 61 6e 64 20 73 6f 20 69 74 73  elist and so its
2ecc0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c  .** content no l
2ecd0 6f 6e 67 65 72 20 6d 61 74 74 65 72 73 2e 0a 2a  onger matters..*
2ece0 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69  *.** The overlyi
2ecf0 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65  ng software laye
2ed00 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
2ed10 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66  tine when all of
2ed20 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20   the data.** on 
2ed30 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69  the given page i
2ed40 73 20 75 6e 75 73 65 64 2e 20 54 68 65 20 70 61  s unused. The pa
2ed50 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61  ger marks the pa
2ed60 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a  ge as clean so.*
2ed70 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  * that it does n
2ed80 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 74  ot get written t
2ed90 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65  o disk..**.** Te
2eda0 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68  sts show that th
2edb0 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
2edc0 63 61 6e 20 71 75 61 64 72 75 70 6c 65 20 74 68  can quadruple th
2edd0 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65  e speed of large
2ede0 20 0a 2a 2a 20 44 45 4c 45 54 45 20 6f 70 65 72   .** DELETE oper
2edf0 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ations..*/.void 
2ee00 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
2ee10 57 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67  Write(PgHdr *pPg
2ee20 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
2ee30 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
2ee40 3b 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66 6c  ;.  if( (pPg->fl
2ee50 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29  ags&PGHDR_DIRTY)
2ee60 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53 61 76   && pPager->nSav
2ee70 65 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  epoint==0 ){.   
2ee80 20 50 41 47 45 52 54 52 41 43 45 28 28 22 44 4f   PAGERTRACE(("DO
2ee90 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64  NT_WRITE page %d
2eea0 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e   of %d\n", pPg->
2eeb0 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
2eec0 61 67 65 72 29 29 29 3b 0a 20 20 20 20 49 4f 54  ager)));.    IOT
2eed0 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20  RACE(("CLEAN %p 
2eee0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
2eef0 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 70  Pg->pgno)).    p
2ef00 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
2ef10 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b 0a 23  DR_DONT_WRITE;.#
2ef20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
2ef30 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67  CK_PAGES.    pPg
2ef40 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
2ef50 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
2ef60 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a  ;.#endif.  }.}..
2ef70 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2ef80 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
2ef90 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  increment the va
2efa0 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  lue of the datab
2efb0 61 73 65 20 66 69 6c 65 20 0a 2a 2a 20 63 68 61  ase file .** cha
2efc0 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 20 73 74 6f  nge-counter, sto
2efd0 72 65 64 20 61 73 20 61 20 34 2d 62 79 74 65 20  red as a 4-byte 
2efe0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
2eff0 65 72 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a  er starting at .
2f000 2a 2a 20 62 79 74 65 20 6f 66 66 73 65 74 20 32  ** byte offset 2
2f010 34 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66  4 of the pager f
2f020 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ile..**.** If th
2f030 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66  e isDirectMode f
2f040 6c 61 67 20 69 73 20 7a 65 72 6f 2c 20 74 68 65  lag is zero, the
2f050 6e 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62  n this is done b
2f060 79 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71  y calling .** sq
2f070 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2f080 29 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65  ) on page 1, the
2f090 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  n modifying the 
2f0a0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
2f0b0 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 20 49 6e  ** page data. In
2f0c0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 66   this case the f
2f0d0 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 70 64 61  ile will be upda
2f0e0 74 65 64 20 77 68 65 6e 20 74 68 65 20 63 75 72  ted when the cur
2f0f0 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  rent.** transact
2f100 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
2f110 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69  ..**.** The isDi
2f120 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 6d 61  rectMode flag ma
2f130 79 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65  y only be non-ze
2f140 72 6f 20 69 66 20 74 68 65 20 6c 69 62 72 61 72  ro if the librar
2f150 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a 2a  y was compiled.*
2f160 2a 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  * with the SQLIT
2f170 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
2f180 57 52 49 54 45 20 6d 61 63 72 6f 20 64 65 66 69  WRITE macro defi
2f190 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
2f1a0 65 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72 65 63  e,.** if isDirec
2f1b0 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  t is non-zero, t
2f1c0 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
2f1d0 20 66 69 6c 65 20 69 73 20 75 70 64 61 74 65 64   file is updated
2f1e0 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79 20   directly.** by 
2f1f0 77 72 69 74 69 6e 67 20 61 6e 20 75 70 64 61 74  writing an updat
2f200 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61  ed version of pa
2f210 67 65 20 31 20 75 73 69 6e 67 20 61 20 63 61 6c  ge 1 using a cal
2f220 6c 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71 6c  l to the .** sql
2f230 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 66 75  ite3OsWrite() fu
2f240 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
2f250 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72  c int pager_incr
2f260 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50  _changecounter(P
2f270 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
2f280 74 20 69 73 44 69 72 65 63 74 4d 6f 64 65 29 7b  t isDirectMode){
2f290 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2f2a0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 44 65 63  TE_OK;..  /* Dec
2f2b0 6c 61 72 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  lare and initial
2f2c0 69 7a 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74  ize constant int
2f2d0 65 67 65 72 20 27 69 73 44 69 72 65 63 74 27 2e  eger 'isDirect'.
2f2e0 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 61 74 6f   If the.  ** ato
2f2f0 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
2f300 7a 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  zation is enable
2f310 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c  d in this build,
2f320 20 74 68 65 6e 20 69 73 44 69 72 65 63 74 0a 20   then isDirect. 
2f330 20 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 69 7a   ** is initializ
2f340 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ed to the value 
2f350 70 61 73 73 65 64 20 61 73 20 74 68 65 20 69 73  passed as the is
2f360 44 69 72 65 63 74 4d 6f 64 65 20 70 61 72 61 6d  DirectMode param
2f370 65 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68 69  eter.  ** to thi
2f380 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68 65  s function. Othe
2f390 72 77 69 73 65 2c 20 69 74 20 69 73 20 61 6c 77  rwise, it is alw
2f3a0 61 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e  ays set to zero.
2f3b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69  .  **.  ** The i
2f3c0 64 65 61 20 69 73 20 74 68 61 74 20 69 66 20 74  dea is that if t
2f3d0 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
2f3e0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
2f3f0 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61 62 6c 65 64  not.  ** enabled
2f400 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
2f410 2c 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63  , the compiler c
2f420 61 6e 20 6f 6d 69 74 20 74 68 65 20 74 65 73 74  an omit the test
2f430 73 20 6f 66 0a 20 20 2a 2a 20 27 69 73 44 69 72  s of.  ** 'isDir
2f440 65 63 74 27 20 62 65 6c 6f 77 2c 20 61 73 20 77  ect' below, as w
2f450 65 6c 6c 20 61 73 20 74 68 65 20 62 6c 6f 63 6b  ell as the block
2f460 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 74 68 65   enclosed in the
2f470 0a 20 20 2a 2a 20 22 69 66 28 20 69 73 44 69 72  .  ** "if( isDir
2f480 65 63 74 20 29 22 20 63 6f 6e 64 69 74 69 6f 6e  ect )" condition
2f490 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
2f4a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
2f4b0 4d 49 43 5f 57 52 49 54 45 0a 23 20 64 65 66 69  MIC_WRITE.# defi
2f4c0 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 30  ne DIRECT_MODE 0
2f4d0 0a 20 20 61 73 73 65 72 74 28 20 69 73 44 69 72  .  assert( isDir
2f4e0 65 63 74 4d 6f 64 65 3d 3d 30 20 29 3b 0a 20 20  ectMode==0 );.  
2f4f0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2f500 28 69 73 44 69 72 65 63 74 4d 6f 64 65 29 3b 0a  (isDirectMode);.
2f510 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 44  #else.# define D
2f520 49 52 45 43 54 5f 4d 4f 44 45 20 69 73 44 69 72  IRECT_MODE isDir
2f530 65 63 74 4d 6f 64 65 0a 23 65 6e 64 69 66 0a 0a  ectMode.#endif..
2f540 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2f550 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
2f560 45 53 45 52 56 45 44 20 29 3b 0a 20 20 69 66 28  ESERVED );.  if(
2f570 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65   !pPager->change
2f580 43 6f 75 6e 74 44 6f 6e 65 20 26 26 20 70 50 61  CountDone && pPa
2f590 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b  ger->dbSize>0 ){
2f5a0 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48  .    PgHdr *pPgH
2f5b0 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
2f5c0 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20     /* Reference 
2f5d0 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 20  to page 1 */.   
2f5e0 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e   u32 change_coun
2f5f0 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ter;           /
2f600 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  * Initial value 
2f610 6f 66 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  of change-counte
2f620 72 20 66 69 65 6c 64 20 2a 2f 0a 0a 20 20 20 20  r field */..    
2f630 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
2f640 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 69 73 4f  >tempFile && isO
2f650 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2f660 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  );..    /* Open 
2f670 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69  page 1 of the fi
2f680 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20  le for writing. 
2f690 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2f6a0 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
2f6b0 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b  er, 1, &pPgHdr);
2f6c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
2f6d0 48 64 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  Hdr==0 || rc==SQ
2f6e0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20  LITE_OK );..    
2f6f0 2f 2a 20 49 66 20 70 61 67 65 20 6f 6e 65 20 77  /* If page one w
2f700 61 73 20 66 65 74 63 68 65 64 20 73 75 63 63 65  as fetched succe
2f710 73 73 66 75 6c 6c 79 2c 20 61 6e 64 20 74 68 69  ssfully, and thi
2f720 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  s function is no
2f730 74 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69  t.    ** operati
2f740 6e 67 20 69 6e 20 64 69 72 65 63 74 2d 6d 6f 64  ng in direct-mod
2f750 65 2c 20 6d 61 6b 65 20 70 61 67 65 20 31 20 77  e, make page 1 w
2f760 72 69 74 61 62 6c 65 2e 20 20 57 68 65 6e 20 6e  ritable.  When n
2f770 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 64 69  ot in .    ** di
2f780 72 65 63 74 20 6d 6f 64 65 2c 20 70 61 67 65 20  rect mode, page 
2f790 31 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64  1 is always held
2f7a0 20 69 6e 20 63 61 63 68 65 20 61 6e 64 20 68 65   in cache and he
2f7b0 6e 63 65 20 74 68 65 20 50 61 67 65 72 47 65 74  nce the PagerGet
2f7c0 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20  ().    ** above 
2f7d0 69 73 20 61 6c 77 61 79 73 20 73 75 63 63 65 73  is always succes
2f7e0 73 66 75 6c 20 2d 20 68 65 6e 63 65 20 74 68 65  sful - hence the
2f7f0 20 41 4c 57 41 59 53 20 6f 6e 20 72 63 3d 3d 53   ALWAYS on rc==S
2f800 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 20 20 2a 2f  QLITE_OK..    */
2f810 0a 20 20 20 20 69 66 28 20 21 44 49 52 45 43 54  .    if( !DIRECT
2f820 5f 4d 4f 44 45 20 26 26 20 41 4c 57 41 59 53 28  _MODE && ALWAYS(
2f830 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29  rc==SQLITE_OK) )
2f840 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
2f850 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2f860 50 67 48 64 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  PgHdr);.    }.. 
2f870 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2f880 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
2f890 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   Increment the v
2f8a0 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61  alue just read a
2f8b0 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b  nd write it back
2f8c0 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a   to byte 24. */.
2f8d0 20 20 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75        change_cou
2f8e0 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65  nter = sqlite3Ge
2f8f0 74 34 62 79 74 65 28 28 75 38 2a 29 70 50 61 67  t4byte((u8*)pPag
2f900 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 3b  er->dbFileVers);
2f910 0a 20 20 20 20 20 20 63 68 61 6e 67 65 5f 63 6f  .      change_co
2f920 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 70  unter++;.      p
2f930 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
2f940 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29 2b  )pPgHdr->pData)+
2f950 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  24, change_count
2f960 65 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41  er);..      /* A
2f970 6c 73 6f 20 73 74 6f 72 65 20 74 68 65 20 53 51  lso store the SQ
2f980 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d  Lite version num
2f990 62 65 72 20 69 6e 20 62 79 74 65 73 20 39 36 2e  ber in bytes 96.
2f9a0 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20 20 20 20  .99 and in.     
2f9b0 20 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35   ** bytes 92..95
2f9c0 20 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67   store the chang
2f9d0 65 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68  e counter for wh
2f9e0 69 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20  ich the version 
2f9f0 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20  number.      ** 
2fa00 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 20  is valid. */.   
2fa10 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63     put32bits(((c
2fa20 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44 61  har*)pPgHdr->pDa
2fa30 74 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63  ta)+92, change_c
2fa40 6f 75 6e 74 65 72 29 3b 0a 20 20 20 20 20 20 70  ounter);.      p
2fa50 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
2fa60 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29 2b  )pPgHdr->pData)+
2fa70 39 36 2c 20 53 51 4c 49 54 45 5f 56 45 52 53 49  96, SQLITE_VERSI
2fa80 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 0a 20 20 20  ON_NUMBER);..   
2fa90 20 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67     /* If running
2faa0 20 69 6e 20 64 69 72 65 63 74 20 6d 6f 64 65 2c   in direct mode,
2fab0 20 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65   write the conte
2fac0 6e 74 73 20 6f 66 20 70 61 67 65 20 31 20 74 6f  nts of page 1 to
2fad0 20 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20   the file. */.  
2fae0 20 20 20 20 69 66 28 20 44 49 52 45 43 54 5f 4d      if( DIRECT_M
2faf0 4f 44 45 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ODE ){.        c
2fb00 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 20  onst void *zBuf 
2fb10 3d 20 70 50 67 48 64 72 2d 3e 70 44 61 74 61 3b  = pPgHdr->pData;
2fb20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2fb30 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
2fb40 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  ize>0 );.       
2fb50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
2fb60 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
2fb70 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70   zBuf, pPager->p
2fb80 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20  ageSize, 0);.   
2fb90 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2fba0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2fbb0 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
2fbc0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b  geCountDone = 1;
2fbd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2fbe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2fbf0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
2fc00 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  untDone = 1;.   
2fc10 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2fc20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70  /* Release the p
2fc30 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a  age reference. *
2fc40 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  /.    sqlite3Pag
2fc50 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b  erUnref(pPgHdr);
2fc60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2fc70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
2fc80 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 74  the pager file t
2fc90 6f 20 64 69 73 6b 2e 20 54 68 69 73 20 69 73 20  o disk. This is 
2fca0 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d  a no-op for in-m
2fcb0 65 6d 6f 72 79 20 66 69 6c 65 73 0a 2a 2a 20 6f  emory files.** o
2fcc0 72 20 70 61 67 65 73 20 77 69 74 68 20 74 68 65  r pages with the
2fcd0 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c   Pager.noSync fl
2fce0 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
2fcf0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
2fd00 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67 65  called on a page
2fd10 72 20 66 6f 72 20 77 68 69 63 68 20 69 74 20 69  r for which it i
2fd20 73 20 61 20 6e 6f 2d 6f 70 2c 20 74 68 69 73 0a  s a no-op, this.
2fd30 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
2fd40 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  rns SQLITE_OK. O
2fd50 74 68 65 72 77 69 73 65 2c 20 61 6e 20 49 4f 20  therwise, an IO 
2fd60 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2fd70 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
2fd80 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
2fd90 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2fda0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2fdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fdc0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2fdd0 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72   code */.  asser
2fde0 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69  t( !MEMDB );.  i
2fdf0 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
2fe00 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  c ){.    rc = SQ
2fe10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2fe20 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
2fe30 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
2fe40 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
2fe50 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20  c_flags);.  }.  
2fe60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2fe70 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74  .** Sync the dat
2fe80 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
2fe90 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e  he pager pPager.
2fea0 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
2feb0 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f  to the name.** o
2fec0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
2fed0 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
2fee0 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
2fef0 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75  nto the individu
2ff00 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  al.** journal fi
2ff10 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  le. zMaster may 
2ff20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69  be NULL, which i
2ff30 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
2ff40 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f   no master.** jo
2ff50 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20  urnal (a single 
2ff60 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
2ff70 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tion)..**.** Thi
2ff80 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
2ff90 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  s that:.**.**   
2ffa0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
2ffb0 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  ile change-count
2ffc0 65 72 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a  er is updated,.*
2ffd0 2a 20 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e 61  *   * the journa
2ffe0 6c 20 69 73 20 73 79 6e 63 65 64 20 28 75 6e 6c  l is synced (unl
2fff0 65 73 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  ess the atomic-w
30000 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
30010 6e 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20 20  n is used),.**  
30020 20 2a 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67   * all dirty pag
30030 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 74  es are written t
30040 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
30050 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68 65  ile, .**   * the
30060 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
30070 73 20 74 72 75 6e 63 61 74 65 64 20 28 69 66 20  s truncated (if 
30080 72 65 71 75 69 72 65 64 29 2c 20 61 6e 64 0a 2a  required), and.*
30090 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61  *   * the databa
300a0 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20  se file synced. 
300b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  .**.** The only 
300c0 74 68 69 6e 67 20 74 68 61 74 20 72 65 6d 61 69  thing that remai
300d0 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  ns to commit the
300e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
300f0 74 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20  to finalize .** 
30100 28 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74  (delete, truncat
30110 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 66 69  e or zero the fi
30120 72 73 74 20 70 61 72 74 20 6f 66 29 20 74 68 65  rst part of) the
30130 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
30140 72 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65  r .** delete the
30150 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
30160 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65  file if specifie
30170 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  d)..**.** Note t
30180 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d  hat if zMaster==
30190 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20  NULL, this does 
301a0 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20  not overwrite a 
301b0 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a  previous value.*
301c0 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73  * passed to an s
301d0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
301e0 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
301f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
30200 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 2d  inal parameter -
30210 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72 75   noSync - is tru
30220 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  e, then the data
30230 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66  base file itself
30240 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63 65  .** is not synce
30250 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  d. The caller mu
30260 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  st call sqlite3P
30270 61 67 65 72 53 79 6e 63 28 29 20 64 69 72 65 63  agerSync() direc
30280 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74  tly to.** sync t
30290 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
302a0 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
302b0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
302c0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a 2a   to delete the.*
302d0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
302e0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a  n this case..*/.
302f0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
30300 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a  CommitPhaseOne(.
30310 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
30320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30330 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
30340 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
30350 72 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20 20  r *zMaster,     
30360 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74         /* If not
30370 20 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74 65   NULL, the maste
30380 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
30390 2f 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20 20  /.  int noSync  
303a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
303b0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f      /* True to o
303c0 6d 69 74 20 74 68 65 20 78 53 79 6e 63 20 6f 6e  mit the xSync on
303d0 20 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a   the db file */.
303e0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
303f0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
30400 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
30410 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ode */..  /* The
30420 20 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 6e   dbOrigSize is n
30430 65 76 65 72 20 73 65 74 20 69 66 20 6a 6f 75 72  ever set if jour
30440 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 20 2a 2f 0a  nal_mode=OFF */.
30450 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
30460 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
30470 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
30480 5f 4f 46 46 20 7c 7c 20 70 50 61 67 65 72 2d 3e  _OFF || pPager->
30490 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29 3b  dbOrigSize==0 );
304a0 0a 0a 20 20 2f 2a 20 49 66 20 61 20 70 72 69 6f  ..  /* If a prio
304b0 72 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  r error occurred
304c0 2c 20 72 65 70 6f 72 74 20 74 68 61 74 20 65 72  , report that er
304d0 72 6f 72 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20  ror again. */.  
304e0 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
304f0 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74  ->errCode) ) ret
30500 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
30510 6f 64 65 3b 0a 0a 20 20 50 41 47 45 52 54 52 41  ode;..  PAGERTRA
30520 43 45 28 28 22 44 41 54 41 42 41 53 45 20 53 59  CE(("DATABASE SY
30530 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73  NC: File=%s zMas
30540 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64 5c  ter=%s nSize=%d\
30550 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65  n", .      pPage
30560 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d  r->zFilename, zM
30570 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 64  aster, pPager->d
30580 62 53 69 7a 65 29 29 3b 0a 0a 20 20 69 66 28 20  bSize));..  if( 
30590 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
305a0 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a 20  >dbModified ){. 
305b0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
305c0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62   an in-memory db
305d0 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61  , or no pages ha
305e0 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
305f0 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 20 20  to, or this.    
30600 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
30610 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
30620 6c 65 64 2c 20 69 74 20 69 73 20 6d 6f 73 74 6c  led, it is mostl
30630 79 20 61 20 6e 6f 2d 6f 70 2e 20 20 48 6f 77 65  y a no-op.  Howe
30640 76 65 72 2c 20 61 6e 79 0a 20 20 20 20 2a 2a 20  ver, any.    ** 
30650 62 61 63 6b 75 70 20 69 6e 20 70 72 6f 67 72 65  backup in progre
30660 73 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  ss needs to be r
30670 65 73 74 61 72 74 65 64 2e 0a 20 20 20 20 2a 2f  estarted..    */
30680 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b  .    sqlite3Back
30690 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
306a0 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 7d 65  ->pBackup);.  }e
306b0 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
306c0 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e  state!=PAGER_SYN
306d0 43 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e 64  CED && pPager->d
306e0 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a 20 20 20  bModified ){.   
306f0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
30700 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
30710 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 20 3d    PgHdr *pList =
30720 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69   sqlite3PcacheDi
30730 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
30740 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 20 20  pPCache);.      
30750 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
30760 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57       rc = pagerW
30770 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c  alFrames(pPager,
30780 20 70 4c 69 73 74 2c 20 70 50 61 67 65 72 2d 3e   pList, pPager->
30790 64 62 53 69 7a 65 2c 20 31 2c 20 0a 20 20 20 20  dbSize, 1, .    
307a0 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
307b0 3e 66 75 6c 6c 53 79 6e 63 20 3f 20 70 50 61 67  >fullSync ? pPag
307c0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3a  er->sync_flags :
307d0 20 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20   0).        );. 
307e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
307f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
30800 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
30810 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28  3PcacheCleanAll(
30820 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
30830 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
30840 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  lse{.      /* Th
30850 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
30860 6b 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68  k updates the ch
30870 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 45 78  ange-counter. Ex
30880 61 63 74 6c 79 20 68 6f 77 20 69 74 0a 20 20 20  actly how it.   
30890 20 20 20 2a 2a 20 64 6f 65 73 20 74 68 69 73 20     ** does this 
308a0 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68  depends on wheth
308b0 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74  er or not the at
308c0 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74 69  omic-update opti
308d0 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  mization.      *
308e0 2a 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74  * was enabled at
308f0 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 61   compile time, a
30900 6e 64 20 69 66 20 74 68 69 73 20 74 72 61 6e 73  nd if this trans
30910 61 63 74 69 6f 6e 20 6d 65 65 74 73 20 74 68 65  action meets the
30920 20 0a 20 20 20 20 20 20 2a 2a 20 72 75 6e 74 69   .      ** runti
30930 6d 65 20 63 72 69 74 65 72 69 61 20 74 6f 20 75  me criteria to u
30940 73 65 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  se the operation
30950 3a 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  : .      **.    
30960 20 20 2a 2a 20 20 20 20 2a 20 54 68 65 20 66 69    **    * The fi
30970 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le-system suppor
30980 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ts the atomic-wr
30990 69 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72  ite property for
309a0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 62  .      **      b
309b0 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20 70 61  locks of size pa
309c0 67 65 2d 73 69 7a 65 2c 20 61 6e 64 20 0a 20 20  ge-size, and .  
309d0 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 69 73      **    * This
309e0 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70   commit is not p
309f0 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66  art of a multi-f
30a00 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ile transaction,
30a10 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 20 20   and.      **   
30a20 20 2a 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 70   * Exactly one p
30a30 61 67 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64  age has been mod
30a40 69 66 69 65 64 20 61 6e 64 20 73 74 6f 72 65 20  ified and store 
30a50 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
30a60 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ile..      **.  
30a70 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70      ** If the op
30a80 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61 73 20 6e  timization was n
30a90 6f 74 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  ot enabled at co
30aa0 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 6e  mpile time, then
30ab0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61   the.      ** pa
30ac0 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
30ad0 6f 75 6e 74 65 72 28 29 20 66 75 6e 63 74 69 6f  ounter() functio
30ae0 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 75  n is called to u
30af0 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
30b00 0a 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74 65  .      ** counte
30b10 72 20 69 6e 20 27 69 6e 64 69 72 65 63 74 2d 6d  r in 'indirect-m
30b20 6f 64 65 27 2e 20 49 66 20 74 68 65 20 6f 70 74  ode'. If the opt
30b30 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f 6d  imization is com
30b40 70 69 6c 65 64 20 69 6e 20 62 75 74 0a 20 20 20  piled in but.   
30b50 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 70 70     ** is not app
30b60 6c 69 63 61 62 6c 65 20 74 6f 20 74 68 69 73 20  licable to this 
30b70 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63 61 6c  transaction, cal
30b80 6c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  l sqlite3Journal
30b90 43 72 65 61 74 65 28 29 0a 20 20 20 20 20 20 2a  Create().      *
30ba0 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  * to make sure t
30bb0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
30bc0 68 61 73 20 61 63 74 75 61 6c 6c 79 20 62 65 65  has actually bee
30bd0 6e 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20  n created, then 
30be0 63 61 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 70 61  call.      ** pa
30bf0 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
30c00 6f 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61  ounter() to upda
30c10 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  te the change-co
30c20 75 6e 74 65 72 20 69 6e 20 69 6e 64 69 72 65 63  unter in indirec
30c30 74 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2e  t.      ** mode.
30c40 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
30c50 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69   ** Otherwise, i
30c60 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
30c70 6f 6e 20 69 73 20 62 6f 74 68 20 65 6e 61 62 6c  on is both enabl
30c80 65 64 20 61 6e 64 20 61 70 70 6c 69 63 61 62 6c  ed and applicabl
30c90 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  e,.      ** then
30ca0 20 63 61 6c 6c 20 70 61 67 65 72 5f 69 6e 63 72   call pager_incr
30cb0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
30cc0 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
30cd0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 0a 20 20  hange-counter.  
30ce0 20 20 20 20 2a 2a 20 69 6e 20 27 64 69 72 65 63      ** in 'direc
30cf0 74 27 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69 73  t' mode. In this
30d00 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61   case the journa
30d10 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65  l file will neve
30d20 72 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 63 72  r be.      ** cr
30d30 65 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 74  eated for this t
30d40 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
30d50 20 20 2a 2f 0a 20 20 23 69 66 64 65 66 20 53 51    */.  #ifdef SQ
30d60 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
30d70 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 50  IC_WRITE.      P
30d80 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20  gHdr *pPg;.     
30d90 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
30da0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20  pPager->jfd) || 
30db0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
30dc0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
30dd0 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20  ALMODE_OFF );.  
30de0 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72      if( !zMaster
30df0 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
30e00 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  r->jfd) .       
30e10 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
30e20 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65  alOff==jrnlBuffe
30e30 72 53 69 7a 65 28 70 50 61 67 65 72 29 20 0a 20  rSize(pPager) . 
30e40 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d        && pPager-
30e50 3e 64 62 53 69 7a 65 3e 3d 70 50 61 67 65 72 2d  >dbSize>=pPager-
30e60 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20 20 20  >dbFileSize.    
30e70 20 20 20 26 26 20 28 30 3d 3d 28 70 50 67 20 3d     && (0==(pPg =
30e80 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69   sqlite3PcacheDi
30e90 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
30ea0 70 50 43 61 63 68 65 29 29 20 7c 7c 20 30 3d 3d  pPCache)) || 0==
30eb0 70 50 67 2d 3e 70 44 69 72 74 79 29 0a 20 20 20  pPg->pDirty).   
30ec0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
30ed0 20 55 70 64 61 74 65 20 74 68 65 20 64 62 20 66   Update the db f
30ee0 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  ile change count
30ef0 65 72 20 76 69 61 20 74 68 65 20 64 69 72 65 63  er via the direc
30f00 74 2d 77 72 69 74 65 20 6d 65 74 68 6f 64 2e 20  t-write method. 
30f10 54 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  The .        ** 
30f20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77  following call w
30f30 69 6c 6c 20 6d 6f 64 69 66 79 20 74 68 65 20 69  ill modify the i
30f40 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
30f50 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61 67 65 20  ntation of page 
30f60 31 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  1 .        ** to
30f70 20 69 6e 63 6c 75 64 65 20 74 68 65 20 75 70 64   include the upd
30f80 61 74 65 64 20 63 68 61 6e 67 65 20 63 6f 75 6e  ated change coun
30f90 74 65 72 20 61 6e 64 20 74 68 65 6e 20 77 72 69  ter and then wri
30fa0 74 65 20 70 61 67 65 20 31 20 0a 20 20 20 20 20  te page 1 .     
30fb0 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74     ** directly t
30fc0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
30fd0 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20  ile. Because of 
30fe0 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
30ff0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f   .        ** pro
31000 70 65 72 74 79 20 6f 66 20 74 68 65 20 68 6f 73  perty of the hos
31010 74 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74  t file-system, t
31020 68 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20  his is safe..   
31030 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
31040 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f  rc = pager_incr_
31050 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50  changecounter(pP
31060 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  ager, 1);.      
31070 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
31080 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
31090 61 6c 43 72 65 61 74 65 28 70 50 61 67 65 72 2d  alCreate(pPager-
310a0 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69  >jfd);.        i
310b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
310c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
310d0 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68   = pager_incr_ch
310e0 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67  angecounter(pPag
310f0 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
31100 7d 0a 20 20 20 20 20 20 7d 0a 20 20 23 65 6c 73  }.      }.  #els
31110 65 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  e.      rc = pag
31120 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
31130 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30 29  unter(pPager, 0)
31140 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20 20 20 20  ;.  #endif.     
31150 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31160 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
31170 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
31180 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  .  .      /* If 
31190 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
311a0 20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64 61   has made the da
311b0 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20  tabase smaller, 
311c0 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20  then all pages. 
311d0 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69       ** being di
311e0 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74  scarded by the t
311f0 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62  runcation must b
31200 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
31210 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
31220 2a 20 66 69 6c 65 2e 20 54 68 69 73 20 63 61 6e  * file. This can
31230 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 6e 20   only happen in 
31240 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
31250 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
31260 20 2a 2a 20 42 65 66 6f 72 65 20 72 65 61 64 69   ** Before readi
31270 6e 67 20 74 68 65 20 70 61 67 65 73 20 77 69 74  ng the pages wit
31280 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 6c  h page numbers l
31290 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a  arger than the .
312a0 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74        ** current
312b0 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
312c0 64 62 53 69 7a 65 2c 20 73 65 74 20 64 62 53 69  dbSize, set dbSi
312d0 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76  ze back to the v
312e0 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  alue.      ** th
312f0 61 74 20 69 74 20 74 6f 6f 6b 20 61 74 20 74 68  at it took at th
31300 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
31310 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4f 74 68 65  ransaction. Othe
31320 72 77 69 73 65 2c 20 74 68 65 0a 20 20 20 20 20  rwise, the.     
31330 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   ** calls to sql
31340 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 72  ite3PagerGet() r
31350 65 74 75 72 6e 20 7a 65 72 6f 65 64 20 70 61 67  eturn zeroed pag
31360 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 0a 20  es instead of . 
31370 20 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20       ** reading 
31380 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61  data from the da
31390 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
313a0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57     **.      ** W
313b0 68 65 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  hen journal_mode
313c0 3d 3d 4f 46 46 20 74 68 65 20 64 62 4f 72 69 67  ==OFF the dbOrig
313d0 53 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20 7a  Size is always z
313e0 65 72 6f 2c 20 73 6f 20 74 68 69 73 0a 20 20 20  ero, so this.   
313f0 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6e 65 76 65     ** block neve
31400 72 20 72 75 6e 73 20 69 66 20 6a 6f 75 72 6e 61  r runs if journa
31410 6c 5f 6d 6f 64 65 3d 4f 46 46 2e 0a 20 20 20 20  l_mode=OFF..    
31420 20 20 2a 2f 0a 20 20 23 69 66 6e 64 65 66 20 53    */.  #ifndef S
31430 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
31440 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
31450 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70  pPager->dbSize<p
31460 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
31470 65 20 0a 20 20 20 20 20 20 20 26 26 20 41 4c 57  e .       && ALW
31480 41 59 53 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  AYS(pPager->jour
31490 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
314a0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 29 0a  OURNALMODE_OFF).
314b0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
314c0 20 50 67 6e 6f 20 69 3b 20 20 20 20 20 20 20 20   Pgno i;        
314d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
314e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
314f0 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
31500 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  */.        const
31510 20 50 67 6e 6f 20 69 53 6b 69 70 20 3d 20 50 41   Pgno iSkip = PA
31520 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
31530 65 72 29 3b 20 2f 2a 20 50 65 6e 64 69 6e 67 20  er); /* Pending 
31540 6c 6f 63 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20  lock page */.   
31550 20 20 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20       const Pgno 
31560 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
31570 3e 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 2f  >dbSize;       /
31580 2a 20 44 61 74 61 62 61 73 65 20 69 6d 61 67 65  * Database image
31590 20 73 69 7a 65 20 2a 2f 20 0a 20 20 20 20 20 20   size */ .      
315a0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
315b0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69   = pPager->dbOri
315c0 67 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 66  gSize;.        f
315d0 6f 72 28 20 69 3d 64 62 53 69 7a 65 2b 31 3b 20  or( i=dbSize+1; 
315e0 69 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  i<=pPager->dbOri
315f0 67 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20  gSize; i++ ){.  
31600 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c          if( !sql
31610 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
31620 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
31630 6c 2c 20 69 29 20 26 26 20 69 21 3d 69 53 6b 69  l, i) && i!=iSki
31640 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  p ){.           
31650 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 20 20   PgHdr *pPage;  
31660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
31670 67 65 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f  ge to journal */
31680 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
31690 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
316a0 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50  t(pPager, i, &pP
316b0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
316c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
316d0 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
316e0 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
316f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
31700 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
31710 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20  rite(pPage);.   
31720 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
31730 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
31740 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
31750 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31760 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70   ) goto commit_p
31770 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20  hase_one_exit;. 
31780 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31790 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
317a0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 64 62  ger->dbSize = db
317b0 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 20 0a 20  Size;.      } . 
317c0 20 23 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 20   #endif.  .     
317d0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61   /* Write the ma
317e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
317f0 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
31800 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 20 6d 61  al file. If a ma
31810 73 74 65 72 20 0a 20 20 20 20 20 20 2a 2a 20 6a  ster .      ** j
31820 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
31830 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
31840 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
31850 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 0a   journal file, .
31860 20 20 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 7a        ** or if z
31870 4d 61 73 74 65 72 20 69 73 20 4e 55 4c 4c 20 28  Master is NULL (
31880 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
31890 6c 29 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61  l), then this ca
318a0 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  ll is a no-op.. 
318b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
318c0 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f   = writeMasterJo
318d0 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d  urnal(pPager, zM
318e0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66  aster);.      if
318f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31900 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68  ) goto commit_ph
31910 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20  ase_one_exit;.  
31920 0a 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  .      /* Sync t
31930 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
31940 20 49 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 75   If the atomic-u
31950 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  pdate optimizati
31960 6f 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20  on is being.    
31970 20 20 2a 2a 20 75 73 65 64 2c 20 74 68 69 73 20    ** used, this 
31980 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20 63 72  call will not cr
31990 65 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eate the journal
319a0 20 66 69 6c 65 20 6f 72 20 70 65 72 66 6f 72 6d   file or perform
319b0 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 72 65   any.      ** re
319c0 61 6c 20 49 4f 2e 0a 20 20 20 20 20 20 2a 2f 0a  al IO..      */.
319d0 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a        rc = syncJ
319e0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
319f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
31a00 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63  LITE_OK ) goto c
31a10 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
31a20 65 78 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f  exit;.  .      /
31a30 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74  * Write all dirt
31a40 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64  y pages to the d
31a50 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
31a60 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
31a70 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
31a80 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69  (sqlite3PcacheDi
31a90 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
31aa0 70 50 43 61 63 68 65 29 29 3b 0a 20 20 20 20 20  pPCache));.     
31ab0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31ac0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  OK ){.        as
31ad0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
31ae0 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29  _IOERR_BLOCKED )
31af0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 63  ;.        goto c
31b00 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
31b10 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  exit;.      }.  
31b20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
31b30 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72  eCleanAll(pPager
31b40 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 0a 20  ->pPCache);.  . 
31b50 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66       /* If the f
31b60 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6e  ile on disk is n
31b70 6f 74 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65  ot the same size
31b80 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65   as the database
31b90 20 69 6d 61 67 65 2c 0a 20 20 20 20 20 20 2a 2a   image,.      **
31ba0 20 74 68 65 6e 20 75 73 65 20 70 61 67 65 72 5f   then use pager_
31bb0 74 72 75 6e 63 61 74 65 20 74 6f 20 67 72 6f 77  truncate to grow
31bc0 20 6f 72 20 73 68 72 69 6e 6b 20 74 68 65 20 66   or shrink the f
31bd0 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20  ile here..      
31be0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  */.      if( pPa
31bf0 67 65 72 2d 3e 64 62 53 69 7a 65 21 3d 70 50 61  ger->dbSize!=pPa
31c00 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
31c10 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
31c20 6e 4e 65 77 20 3d 20 70 50 61 67 65 72 2d 3e 64  nNew = pPager->d
31c30 62 53 69 7a 65 20 2d 20 28 70 50 61 67 65 72 2d  bSize - (pPager-
31c40 3e 64 62 53 69 7a 65 3d 3d 50 41 47 45 52 5f 4d  >dbSize==PAGER_M
31c50 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b  J_PGNO(pPager));
31c60 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
31c70 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
31c80 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
31c90 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
31ca0 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
31cb0 50 61 67 65 72 2c 20 6e 4e 65 77 29 3b 0a 20 20  Pager, nNew);.  
31cc0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
31cd0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63  LITE_OK ) goto c
31ce0 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
31cf0 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  exit;.      }.  
31d00 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c  .      /* Finall
31d10 79 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61  y, sync the data
31d20 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
31d30 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
31d40 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53 79  >noSync && !noSy
31d50 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  nc ){.        rc
31d60 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
31d70 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
31d80 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
31d90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31da0 49 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e 43  IOTRACE(("DBSYNC
31db0 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
31dc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67  .    }..    pPag
31dd0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
31de0 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 63  R_SYNCED;.  }..c
31df0 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
31e00 65 78 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72  exit:.  return r
31e10 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  c;.}.../*.** Whe
31e20 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
31e30 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 64  is called, the d
31e40 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
31e50 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79   been completely
31e60 0a 2a 2a 20 75 70 64 61 74 65 64 20 74 6f 20 72  .** updated to r
31e70 65 66 6c 65 63 74 20 74 68 65 20 63 68 61 6e 67  eflect the chang
31e80 65 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 63  es made by the c
31e90 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
31ea0 6f 6e 20 61 6e 64 0a 2a 2a 20 73 79 6e 63 65 64  on and.** synced
31eb0 20 74 6f 20 64 69 73 6b 2e 20 54 68 65 20 6a 6f   to disk. The jo
31ec0 75 72 6e 61 6c 20 66 69 6c 65 20 73 74 69 6c 6c  urnal file still
31ed0 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66   exists in the f
31ee0 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a 2a 20 74  ile-system .** t
31ef0 68 6f 75 67 68 2c 20 61 6e 64 20 69 66 20 61 20  hough, and if a 
31f00 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 61  failure occurs a
31f10 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
31f20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 0a  will eventually.
31f30 2a 2a 20 62 65 20 75 73 65 64 20 61 73 20 61 20  ** be used as a 
31f40 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  hot-journal and 
31f50 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
31f60 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 65 64 20 62  saction rolled b
31f70 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
31f80 66 75 6e 63 74 69 6f 6e 20 66 69 6e 61 6c 69 7a  function finaliz
31f90 65 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  es the journal f
31fa0 69 6c 65 2c 20 65 69 74 68 65 72 20 62 79 20 64  ile, either by d
31fb0 65 6c 65 74 69 6e 67 2c 20 0a 2a 2a 20 74 72 75  eleting, .** tru
31fc0 6e 63 61 74 69 6e 67 20 6f 72 20 70 61 72 74 69  ncating or parti
31fd0 61 6c 6c 79 20 7a 65 72 6f 69 6e 67 20 69 74 2c  ally zeroing it,
31fe0 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 6e   so that it cann
31ff0 6f 74 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66  ot be used .** f
32000 6f 72 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  or hot-journal r
32010 6f 6c 6c 62 61 63 6b 2e 20 4f 6e 63 65 20 74 68  ollback. Once th
32020 69 73 20 69 73 20 64 6f 6e 65 20 74 68 65 20 74  is is done the t
32030 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a  ransaction is.**
32040 20 69 72 72 65 76 6f 63 61 62 6c 79 20 63 6f 6d   irrevocably com
32050 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  mitted..**.** If
32060 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
32070 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  , an IO error co
32080 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
32090 6e 64 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  nd the pager.** 
320a0 6d 6f 76 65 73 20 69 6e 74 6f 20 74 68 65 20 65  moves into the e
320b0 72 72 6f 72 20 73 74 61 74 65 2e 20 4f 74 68 65  rror state. Othe
320c0 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
320d0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
320e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
320f0 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
32100 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
32110 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
32120 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
32130 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
32140 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54   code */..  /* T
32150 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
32160 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64  ld not be called
32170 20 69 66 20 61 20 70 72 69 6f 72 20 65 72 72 6f   if a prior erro
32180 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a  r has occurred..
32190 20 20 2a 2a 20 42 75 74 20 69 66 20 28 64 75 65    ** But if (due
321a0 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72   to a coding err
321b0 6f 72 20 65 6c 73 65 77 68 65 72 65 20 69 6e 20  or elsewhere in 
321c0 74 68 65 20 73 79 73 74 65 6d 29 20 69 74 20 64  the system) it d
321d0 6f 65 73 20 67 65 74 0a 20 20 2a 2a 20 63 61 6c  oes get.  ** cal
321e0 6c 65 64 2c 20 6a 75 73 74 20 72 65 74 75 72 6e  led, just return
321f0 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72 20   the same error 
32200 63 6f 64 65 20 77 69 74 68 6f 75 74 20 64 6f 69  code without doi
32210 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 2a 2f 0a  ng anything. */.
32220 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
32230 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72  er->errCode) ) r
32240 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
32250 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 54 68 69  rCode;..  /* Thi
32260 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
32270 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20  d not be called 
32280 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
32290 6e 6f 74 20 69 6e 20 61 74 20 6c 65 61 73 74 0a  not in at least.
322a0 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52    ** PAGER_RESER
322b0 56 45 44 20 73 74 61 74 65 2e 20 41 6e 64 20 69  VED state. And i
322c0 6e 64 65 65 64 20 53 51 4c 69 74 65 20 6e 65 76  ndeed SQLite nev
322d0 65 72 20 64 6f 65 73 20 74 68 69 73 2e 20 42 75  er does this. Bu
322e0 74 20 69 74 20 69 73 0a 20 20 2a 2a 20 6e 69 63  t it is.  ** nic
322f0 65 20 74 6f 20 68 61 76 65 20 74 68 69 73 20 64  e to have this d
32300 65 66 65 6e 73 69 76 65 20 74 65 73 74 20 68 65  efensive test he
32310 72 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2f 0a  re anyway..  */.
32320 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
32330 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
32340 52 45 53 45 52 56 45 44 29 20 29 20 72 65 74 75  RESERVED) ) retu
32350 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
32360 0a 0a 20 20 2f 2a 20 41 6e 20 6f 70 74 69 6d 69  ..  /* An optimi
32370 7a 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 64  zation. If the d
32380 61 74 61 62 61 73 65 20 77 61 73 20 6e 6f 74 20  atabase was not 
32390 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 69 65  actually modifie
323a0 64 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 74 68  d during.  ** th
323b0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
323c0 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
323d0 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
323e0 65 2d 6d 6f 64 65 20 61 6e 64 20 69 73 0a 20 20  e-mode and is.  
323f0 2a 2a 20 75 73 69 6e 67 20 70 65 72 73 69 73 74  ** using persist
32400 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68  ent journals, th
32410 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
32420 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
32430 2a 0a 20 20 2a 2a 20 54 68 65 20 73 74 61 72 74  *.  ** The start
32440 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
32450 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63  file currently c
32460 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65  ontains a single
32470 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68   journal .  ** h
32480 65 61 64 65 72 20 77 69 74 68 20 74 68 65 20 6e  eader with the n
32490 52 65 63 20 66 69 65 6c 64 20 73 65 74 20 74 6f  Rec field set to
324a0 20 30 2e 20 49 66 20 73 75 63 68 20 61 20 6a 6f   0. If such a jo
324b0 75 72 6e 61 6c 20 69 73 20 75 73 65 64 20 61 73  urnal is used as
324c0 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72  .  ** a hot-jour
324d0 6e 61 6c 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a  nal during hot-j
324e0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c  ournal rollback,
324f0 20 30 20 63 68 61 6e 67 65 73 20 77 69 6c 6c 20   0 changes will 
32500 62 65 20 6d 61 64 65 0a 20 20 2a 2a 20 74 6f 20  be made.  ** to 
32510 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
32520 65 2e 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e  e. So there is n
32530 6f 20 6e 65 65 64 20 74 6f 20 7a 65 72 6f 20 74  o need to zero t
32540 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  he journal .  **
32550 20 68 65 61 64 65 72 2e 20 53 69 6e 63 65 20 74   header. Since t
32560 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
32570 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
32580 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a  here is no need.
32590 20 20 2a 2a 20 74 6f 20 64 72 6f 70 20 61 6e 79    ** to drop any
325a0 20 6c 6f 63 6b 73 20 65 69 74 68 65 72 2e 0a 20   locks either.. 
325b0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
325c0 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20  ->dbModified==0 
325d0 26 26 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  && pPager->exclu
325e0 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20  siveMode .   && 
325f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
32600 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
32610 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20  ALMODE_PERSIST. 
32620 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
32630 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
32640 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
32650 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
32660 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32670 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  OK;.  }..  PAGER
32680 54 52 41 43 45 28 28 22 43 4f 4d 4d 49 54 20 25  TRACE(("COMMIT %
32690 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
326a0 61 67 65 72 29 29 29 3b 0a 20 20 61 73 73 65 72  ager)));.  asser
326b0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
326c0 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 7c  ==PAGER_SYNCED |
326d0 7c 20 4d 45 4d 44 42 20 7c 7c 20 21 70 50 61 67  | MEMDB || !pPag
326e0 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29  er->dbModified )
326f0 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65  ;.  rc = pager_e
32700 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
32710 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
32720 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74  etMaster);.  ret
32730 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
32740 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a  pPager, rc);.}..
32750 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
32760 6c 6c 20 63 68 61 6e 67 65 73 2e 20 54 68 65 20  ll changes. The 
32770 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62  database falls b
32780 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ack to PAGER_SHA
32790 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  RED mode..**.** 
327a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65  This function pe
327b0 72 66 6f 72 6d 73 20 74 77 6f 20 74 61 73 6b 73  rforms two tasks
327c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 74 20  :.**.**   1) It 
327d0 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 20 6a  rolls back the j
327e0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 72 65 73  ournal file, res
327f0 74 6f 72 69 6e 67 20 61 6c 6c 20 64 61 74 61 62  toring all datab
32800 61 73 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a  ase file and .**
32810 20 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20        in-memory 
32820 63 61 63 68 65 20 70 61 67 65 73 20 74 6f 20 74  cache pages to t
32830 68 65 20 73 74 61 74 65 20 74 68 65 79 20 77 65  he state they we
32840 72 65 20 69 6e 20 77 68 65 6e 20 74 68 65 20 74  re in when the t
32850 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
32860 20 20 20 77 61 73 20 6f 70 65 6e 65 64 2c 20 61     was opened, a
32870 6e 64 0a 2a 2a 20 20 20 32 29 20 49 74 20 66 69  nd.**   2) It fi
32880 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72  nalizes the jour
32890 6e 61 6c 20 66 69 6c 65 2c 20 73 6f 20 74 68 61  nal file, so tha
328a0 74 20 69 74 20 69 73 20 6e 6f 74 20 75 73 65 64  t it is not used
328b0 20 66 6f 72 20 68 6f 74 0a 2a 2a 20 20 20 20 20   for hot.**     
328c0 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6e 79   rollback at any
328d0 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
328e0 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 73 75 62 6a  ture..**.** subj
328f0 65 63 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ect to the follo
32900 77 69 6e 67 20 71 75 61 6c 69 66 69 63 61 74 69  wing qualificati
32910 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20  ons:.**.** * If 
32920 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
32930 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e   is not yet open
32940 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
32950 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a  ion is called,.*
32960 2a 20 20 20 74 68 65 6e 20 6f 6e 6c 79 20 28 32  *   then only (2
32970 29 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20  ) is performed. 
32980 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
32990 72 65 20 69 73 20 6e 6f 20 6a 6f 75 72 6e 61 6c  re is no journal
329a0 20 66 69 6c 65 0a 2a 2a 20 20 20 74 6f 20 72 6f   file.**   to ro
329b0 6c 6c 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 2a  ll back..**.** *
329c0 20 49 66 20 69 6e 20 61 6e 20 65 72 72 6f 72 20   If in an error 
329d0 73 74 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e  state other than
329e0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 74 68   SQLITE_FULL, th
329f0 65 6e 20 74 61 73 6b 20 28 31 29 20 69 73 20 0a  en task (1) is .
32a00 2a 2a 20 20 20 70 65 72 66 6f 72 6d 65 64 2e 20  **   performed. 
32a10 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
32a20 61 73 6b 20 28 32 29 2e 20 52 65 67 61 72 64 6c  ask (2). Regardl
32a30 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f  ess of the outco
32a40 6d 65 0a 2a 2a 20 20 20 6f 66 20 65 69 74 68 65  me.**   of eithe
32a50 72 2c 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  r, the error sta
32a60 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
32a70 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
32a80 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20 28 69 2e   caller.**   (i.
32a90 65 2e 20 65 69 74 68 65 72 20 53 51 4c 49 54 45  e. either SQLITE
32aa0 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49 54 45  _IOERR or SQLITE
32ab0 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a  _CORRUPT)..**.**
32ac0 20 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20   * If the pager 
32ad0 69 73 20 69 6e 20 50 41 47 45 52 5f 52 45 53 45  is in PAGER_RESE
32ae0 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e  RVED state, then
32af0 20 61 74 74 65 6d 70 74 20 28 31 29 2e 20 57 68   attempt (1). Wh
32b00 65 74 68 65 72 0a 2a 2a 20 20 20 6f 72 20 6e 6f  ether.**   or no
32b10 74 20 28 31 29 20 69 73 20 73 75 63 63 75 73 73  t (1) is succuss
32b20 66 75 6c 2c 20 61 6c 73 6f 20 61 74 74 65 6d 70  ful, also attemp
32b30 74 20 28 32 29 2e 20 49 66 20 73 75 63 63 65 73  t (2). If succes
32b40 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  sful, return.** 
32b50 20 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68    SQLITE_OK. Oth
32b60 65 72 77 69 73 65 2c 20 65 6e 74 65 72 20 74 68  erwise, enter th
32b70 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e  e error state an
32b80 64 20 72 65 74 75 72 6e 20 74 68 65 20 66 69 72  d return the fir
32b90 73 74 20 0a 2a 2a 20 20 20 65 72 72 6f 72 20 63  st .**   error c
32ba0 6f 64 65 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  ode encountered.
32bb0 20 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74 68 69   .**.**   In thi
32bc0 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20  s case there is 
32bd0 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  no chance that t
32be0 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
32bf0 77 72 69 74 74 65 6e 20 74 6f 2e 20 0a 2a 2a 20  written to. .** 
32c00 20 20 53 6f 20 69 73 20 73 61 66 65 20 74 6f 20    So is safe to 
32c10 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
32c20 72 6e 61 6c 20 66 69 6c 65 20 65 76 65 6e 20 69  rnal file even i
32c30 66 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 0a  f the playback .
32c40 2a 2a 20 20 20 28 6f 70 65 72 61 74 69 6f 6e 20  **   (operation 
32c50 31 29 20 66 61 69 6c 65 64 2e 20 48 6f 77 65 76  1) failed. Howev
32c60 65 72 20 74 68 65 20 70 61 67 65 72 20 6d 75 73  er the pager mus
32c70 74 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f  t enter the erro
32c80 72 20 73 74 61 74 65 0a 2a 2a 20 20 20 61 73 20  r state.**   as 
32c90 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
32ca0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
32cb0 63 68 65 20 61 72 65 20 6e 6f 77 20 73 75 73 70  che are now susp
32cc0 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 2a 20 46 69 6e  ect..**.** * Fin
32cd0 61 6c 6c 79 2c 20 69 66 20 69 6e 20 50 41 47 45  ally, if in PAGE
32ce0 52 5f 45 58 43 4c 55 53 49 56 45 20 73 74 61 74  R_EXCLUSIVE stat
32cf0 65 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20  e, then attempt 
32d00 28 31 29 2e 20 4f 6e 6c 79 0a 2a 2a 20 20 20 61  (1). Only.**   a
32d10 74 74 65 6d 70 74 20 28 32 29 20 69 66 20 28 31  ttempt (2) if (1
32d20 29 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e  ) is successful.
32d30 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
32d40 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  K if successful,
32d50 0a 2a 2a 20 20 20 6f 74 68 65 72 77 69 73 65 20  .**   otherwise 
32d60 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20  enter the error 
32d70 73 74 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  state and return
32d80 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
32d90 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 20 20 66  from the .**   f
32da0 61 69 6c 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ailing operation
32db0 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74 68 69  ..**.**   In thi
32dc0 73 20 63 61 73 65 20 74 68 65 20 64 61 74 61 62  s case the datab
32dd0 61 73 65 20 66 69 6c 65 20 6d 61 79 20 68 61 76  ase file may hav
32de0 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
32df0 6f 2e 20 53 6f 20 69 66 20 74 68 65 0a 2a 2a 20  o. So if the.** 
32e00 20 20 70 6c 61 79 62 61 63 6b 20 6f 70 65 72 61    playback opera
32e10 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 73 75 63  tion did not suc
32e20 63 65 65 64 20 69 74 20 77 6f 75 6c 64 20 6e 6f  ceed it would no
32e30 74 20 62 65 20 73 61 66 65 20 74 6f 20 66 69 6e  t be safe to fin
32e40 61 6c 69 7a 65 0a 2a 2a 20 20 20 74 68 65 20 6a  alize.**   the j
32e50 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20  ournal file. It 
32e60 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 65 66 74  needs to be left
32e70 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
32e80 74 65 6d 20 73 6f 20 74 68 61 74 0a 2a 2a 20 20  tem so that.**  
32e90 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
32ea0 65 73 73 20 63 61 6e 20 75 73 65 20 69 74 20 74  ess can use it t
32eb0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
32ec0 74 61 62 61 73 65 20 73 74 61 74 65 20 28 62 79  tabase state (by
32ed0 0a 2a 2a 20 20 20 68 6f 74 2d 6a 6f 75 72 6e 61  .**   hot-journa
32ee0 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 2a 2f 0a  l rollback)..*/.
32ef0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
32f00 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  Rollback(Pager *
32f10 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
32f20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
32f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f40 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
32f50 2f 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  /.  PAGERTRACE((
32f60 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  "ROLLBACK %d\n",
32f70 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
32f80 29 29 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55  ));.  if( pagerU
32f90 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
32fa0 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20  .    int rc2;.. 
32fb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
32fc0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 50  agerSavepoint(pP
32fd0 61 67 65 72 2c 20 53 41 56 45 50 4f 49 4e 54 5f  ager, SAVEPOINT_
32fe0 52 4f 4c 4c 42 41 43 4b 2c 20 2d 31 29 3b 0a 20  ROLLBACK, -1);. 
32ff0 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 65     rc2 = pager_e
33000 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
33010 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
33020 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 69  etMaster);.    i
33030 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
33040 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20   ) rc = rc2;.   
33050 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f   rc = pager_erro
33060 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
33070 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
33080 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 7c  er->dbModified |
33090 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  | !isOpen(pPager
330a0 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 72 63  ->jfd) ){.    rc
330b0 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
330c0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
330d0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
330e0 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  er);.  }else if(
330f0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
33100 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
33110 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode!=SQLITE_FULL
33120 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
33130 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
33140 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20  _EXCLUSIVE ){.  
33150 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61      pager_playba
33160 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  ck(pPager, 0);. 
33170 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 50     }.    rc = pP
33180 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
33190 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
331a0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
331b0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
331c0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  .      int rc2;.
331d0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
331e0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
331f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 32 20  , 0);.      rc2 
33200 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
33210 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
33220 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
33230 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
33240 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
33250 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b         rc = rc2;
33260 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
33270 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
33280 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
33290 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ager, 0);.    }.
332a0 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
332b0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
332c0 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30  >dbSizeValid = 0
332d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
332e0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
332f0 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c  rs during a ROLL
33300 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20  BACK, we can no 
33310 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68 65  longer trust the
33320 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 63 61   pager.    ** ca
33330 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67  che. So call pag
33340 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74 68  er_error() on th
33350 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b  e way out to mak
33360 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20 20  e any error .   
33370 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a   ** persistent..
33380 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
33390 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
333a0 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72  er, rc);.  }.  r
333b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
333c0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
333d0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
333e0 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65  ile is opened re
333f0 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e  ad-only.  Return
33400 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65   FALSE.** if the
33410 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69 6e   database is (in
33420 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c   theory) writabl
33430 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33  e..*/.u8 sqlite3
33440 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28  PagerIsreadonly(
33450 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
33460 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
33470 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a  >readOnly;.}../*
33480 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
33490 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
334a0 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 72  ces to the pager
334b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
334c0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50 61  PagerRefcount(Pa
334d0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
334e0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63  return sqlite3Pc
334f0 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
33500 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d  ger->pPCache);.}
33510 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
33520 68 65 20 61 70 70 72 6f 78 69 6d 61 74 65 20 6e  he approximate n
33530 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
33540 66 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e 74  f memory current
33550 6c 79 0a 2a 2a 20 75 73 65 64 20 62 79 20 74 68  ly.** used by th
33560 65 20 70 61 67 65 72 20 61 6e 64 20 69 74 73 20  e pager and its 
33570 61 73 73 6f 63 69 61 74 65 64 20 63 61 63 68 65  associated cache
33580 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
33590 50 61 67 65 72 4d 65 6d 55 73 65 64 28 50 61 67  PagerMemUsed(Pag
335a0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
335b0 6e 74 20 70 65 72 50 61 67 65 53 69 7a 65 20 3d  nt perPageSize =
335c0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
335d0 65 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  e + pPager->nExt
335e0 72 61 20 2b 20 32 30 3b 0a 20 20 72 65 74 75 72  ra + 20;.  retur
335f0 6e 20 70 65 72 50 61 67 65 53 69 7a 65 2a 73 71  n perPageSize*sq
33600 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63  lite3PcachePagec
33610 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
33620 61 63 68 65 29 0a 20 20 20 20 20 20 20 20 20 20  ache).          
33630 20 2b 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   + sqlite3Malloc
33640 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a  Size(pPager);.}.
33650 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
33660 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
33670 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 70  rences to the sp
33680 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
33690 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
336a0 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 44 62  rPageRefcount(Db
336b0 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
336c0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63  return sqlite3Pc
336d0 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74  achePageRefcount
336e0 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 23 69 66 64  (pPage);.}..#ifd
336f0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
33700 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
33710 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  e is used for te
33720 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
33730 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  is only..*/.int 
33740 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61  *sqlite3PagerSta
33750 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
33760 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
33770 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20  a[11];.  a[0] = 
33780 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
33790 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
337a0 43 61 63 68 65 29 3b 0a 20 20 61 5b 31 5d 20 3d  Cache);.  a[1] =
337b0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
337c0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
337d0 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 32 5d  pPCache);.  a[2]
337e0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
337f0 47 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61  GetCachesize(pPa
33800 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
33810 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[3] = pPager->
33820 64 62 53 69 7a 65 56 61 6c 69 64 20 3f 20 28 69  dbSizeValid ? (i
33830 6e 74 29 20 70 50 61 67 65 72 2d 3e 64 62 53 69  nt) pPager->dbSi
33840 7a 65 20 3a 20 2d 31 3b 0a 20 20 61 5b 34 5d 20  ze : -1;.  a[4] 
33850 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b  = pPager->state;
33860 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72  .  a[5] = pPager
33870 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36  ->errCode;.  a[6
33880 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74  ] = pPager->nHit
33890 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65  ;.  a[7] = pPage
338a0 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d  r->nMiss;.  a[8]
338b0 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74   = 0;  /* Used t
338c0 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76  o be pPager->nOv
338d0 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70  fl */.  a[9] = p
338e0 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20  Pager->nRead;.  
338f0 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e  a[10] = pPager->
33900 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e  nWrite;.  return
33910 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   a;.}.#endif../*
33920 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
33930 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  if this is an in
33940 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a  -memory pager..*
33950 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
33960 65 72 49 73 4d 65 6d 64 62 28 50 61 67 65 72 20  erIsMemdb(Pager 
33970 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
33980 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 0a 2f 2a 0a  rn MEMDB;.}../*.
33990 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  ** Check that th
339a0 65 72 65 20 61 72 65 20 61 74 20 6c 65 61 73 74  ere are at least
339b0 20 6e 53 61 76 65 70 6f 69 6e 74 20 73 61 76 65   nSavepoint save
339c0 70 6f 69 6e 74 73 20 6f 70 65 6e 2e 20 49 66 20  points open. If 
339d0 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 63 75 72  there are.** cur
339e0 72 65 6e 74 6c 79 20 6c 65 73 73 20 74 68 61 6e  rently less than
339f0 20 6e 53 61 76 65 70 6f 69 6e 74 73 20 6f 70 65   nSavepoints ope
33a00 6e 2c 20 74 68 65 6e 20 6f 70 65 6e 20 6f 6e 65  n, then open one
33a10 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69   or more savepoi
33a20 6e 74 73 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 75  nts.** to make u
33a30 70 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  p the difference
33a40 2e 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  . If the number 
33a50 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 20 69 73  of savepoints is
33a60 20 61 6c 72 65 61 64 79 0a 2a 2a 20 65 71 75 61   already.** equa
33a70 6c 20 74 6f 20 6e 53 61 76 65 70 6f 69 6e 74 2c  l to nSavepoint,
33a80 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
33a90 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
33aa0 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
33ab0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
33ac0 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ls, SQLITE_NOMEM
33ad0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
33ae0 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63   an error .** oc
33af0 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69  curs while openi
33b00 6e 67 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ng the sub-journ
33b10 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 61 6e  al file, then an
33b20 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
33b30 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f  s.** returned. O
33b40 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
33b50 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
33b60 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
33b70 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61  point(Pager *pPa
33b80 67 65 72 2c 20 69 6e 74 20 6e 53 61 76 65 70 6f  ger, int nSavepo
33b90 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
33ba0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
33bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33bc0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
33bd0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 72 65   */.  int nCurre
33be0 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 61  nt = pPager->nSa
33bf0 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20  vepoint;        
33c00 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d 62 65  /* Current numbe
33c10 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 20  r of savepoints 
33c20 2a 2f 0a 0a 20 20 69 66 28 20 6e 53 61 76 65 70  */..  if( nSavep
33c30 6f 69 6e 74 3e 6e 43 75 72 72 65 6e 74 20 26 26  oint>nCurrent &&
33c40 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
33c50 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  nal ){.    int i
33c60 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
33c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c80 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
33c90 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 50  ariable */.    P
33ca0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61  agerSavepoint *a
33cb0 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
33cc0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 50 61         /* New Pa
33cd0 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
33ce0 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rray */.    int 
33cf0 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
33d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d10 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
33d20 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
33d30 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
33d40 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
33d50 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
33d60 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
33d70 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 2f 2a  turn rc;..    /*
33d80 20 47 72 6f 77 20 74 68 65 20 50 61 67 65 72 2e   Grow the Pager.
33d90 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72 61 79  aSavepoint array
33da0 20 75 73 69 6e 67 20 72 65 61 6c 6c 6f 63 28 29   using realloc()
33db0 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
33dc0 4e 4f 4d 45 4d 0a 20 20 20 20 2a 2a 20 69 66 20  NOMEM.    ** if 
33dd0 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  the allocation f
33de0 61 69 6c 73 2e 20 4f 74 68 65 72 77 69 73 65 2c  ails. Otherwise,
33df0 20 7a 65 72 6f 20 74 68 65 20 6e 65 77 20 70 6f   zero the new po
33e00 72 74 69 6f 6e 20 69 6e 20 63 61 73 65 20 61 20  rtion in case a 
33e10 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 66  .    ** malloc f
33e20 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
33e30 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 69  ile populating i
33e40 74 20 69 6e 20 74 68 65 20 66 6f 72 28 2e 2e 2e  t in the for(...
33e50 29 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e 0a 20 20  ) loop below..  
33e60 20 20 2a 2f 0a 20 20 20 20 61 4e 65 77 20 3d 20    */.    aNew = 
33e70 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20  (PagerSavepoint 
33e80 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  *)sqlite3Realloc
33e90 28 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  (.        pPager
33ea0 2d 3e 61 53 61 76 65 70 6f 69 6e 74 2c 20 73 69  ->aSavepoint, si
33eb0 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65 70 6f  zeof(PagerSavepo
33ec0 69 6e 74 29 2a 6e 53 61 76 65 70 6f 69 6e 74 0a  int)*nSavepoint.
33ed0 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
33ee0 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 65  aNew ){.      re
33ef0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
33f00 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  M;.    }.    mem
33f10 73 65 74 28 26 61 4e 65 77 5b 6e 43 75 72 72 65  set(&aNew[nCurre
33f20 6e 74 5d 2c 20 30 2c 20 28 6e 53 61 76 65 70 6f  nt], 0, (nSavepo
33f30 69 6e 74 2d 6e 43 75 72 72 65 6e 74 29 20 2a 20  int-nCurrent) * 
33f40 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65  sizeof(PagerSave
33f50 70 6f 69 6e 74 29 29 3b 0a 20 20 20 20 70 50 61  point));.    pPa
33f60 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20  ger->aSavepoint 
33f70 3d 20 61 4e 65 77 3b 0a 0a 20 20 20 20 2f 2a 20  = aNew;..    /* 
33f80 50 6f 70 75 6c 61 74 65 20 74 68 65 20 50 61 67  Populate the Pag
33f90 65 72 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75  erSavepoint stru
33fa0 63 74 75 72 65 73 20 6a 75 73 74 20 61 6c 6c 6f  ctures just allo
33fb0 63 61 74 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f  cated. */.    fo
33fc0 72 28 69 69 3d 6e 43 75 72 72 65 6e 74 3b 20 69  r(ii=nCurrent; i
33fd0 69 3c 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  i<nSavepoint; ii
33fe0 2b 2b 29 7b 0a 20 20 20 20 20 20 61 4e 65 77 5b  ++){.      aNew[
33ff0 69 69 5d 2e 6e 4f 72 69 67 20 3d 20 6e 50 61 67  ii].nOrig = nPag
34000 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f  e;.      if( isO
34010 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
34020 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
34030 6e 61 6c 4f 66 66 3e 30 20 29 7b 0a 20 20 20 20  nalOff>0 ){.    
34040 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66      aNew[ii].iOf
34050 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  fset = pPager->j
34060 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20  ournalOff;.     
34070 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
34080 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74  aNew[ii].iOffset
34090 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   = JOURNAL_HDR_S
340a0 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  Z(pPager);.     
340b0 20 7d 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69   }.      aNew[ii
340c0 5d 2e 69 53 75 62 52 65 63 20 3d 20 70 50 61 67  ].iSubRec = pPag
340d0 65 72 2d 3e 6e 53 75 62 52 65 63 3b 0a 20 20 20  er->nSubRec;.   
340e0 20 20 20 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53     aNew[ii].pInS
340f0 61 76 65 70 6f 69 6e 74 20 3d 20 73 71 6c 69 74  avepoint = sqlit
34100 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 6e  e3BitvecCreate(n
34110 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
34120 20 21 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61   !aNew[ii].pInSa
34130 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20  vepoint ){.     
34140 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
34150 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
34160 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72 55        if( pagerU
34170 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
34180 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34190 57 61 6c 53 61 76 65 70 6f 69 6e 74 28 70 50 61  WalSavepoint(pPa
341a0 67 65 72 2d 3e 70 57 61 6c 2c 20 61 4e 65 77 5b  ger->pWal, aNew[
341b0 69 69 5d 2e 61 57 61 6c 44 61 74 61 29 3b 0a 20  ii].aWalData);. 
341c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
341d0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
341e0 3d 20 69 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  = ii+1;.    }.  
341f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
34200 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 6e 53  ->nSavepoint==nS
34210 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 20 20  avepoint );.    
34220 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
34230 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
34240 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
34250 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
34260 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
34270 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  lled to rollback
34280 20 6f 72 20 72 65 6c 65 61 73 65 20 28 63 6f 6d   or release (com
34290 6d 69 74 29 20 61 20 73 61 76 65 70 6f 69 6e 74  mit) a savepoint
342a0 2e 0a 2a 2a 20 54 68 65 20 73 61 76 65 70 6f 69  ..** The savepoi
342b0 6e 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6f 72  nt to release or
342c0 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 20 6e   rollback need n
342d0 6f 74 20 62 65 20 74 68 65 20 6d 6f 73 74 20 72  ot be the most r
342e0 65 63 65 6e 74 6c 79 20 0a 2a 2a 20 63 72 65 61  ecently .** crea
342f0 74 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a  ted savepoint..*
34300 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6f  *.** Parameter o
34310 70 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68  p is always eith
34320 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  er SAVEPOINT_ROL
34330 4c 42 41 43 4b 20 6f 72 20 53 41 56 45 50 4f 49  LBACK or SAVEPOI
34340 4e 54 5f 52 45 4c 45 41 53 45 2e 0a 2a 2a 20 49  NT_RELEASE..** I
34350 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e  f it is SAVEPOIN
34360 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20  T_RELEASE, then 
34370 72 65 6c 65 61 73 65 20 61 6e 64 20 64 65 73 74  release and dest
34380 72 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69 6e  roy the savepoin
34390 74 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20  t with.** index 
343a0 69 53 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69  iSavepoint. If i
343b0 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  t is SAVEPOINT_R
343c0 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 72 6f  OLLBACK, then ro
343d0 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67  llback all chang
343e0 65 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20  es.** that have 
343f0 6f 63 63 75 72 72 65 64 20 73 69 6e 63 65 20 74  occurred since t
34400 68 65 20 73 70 65 63 69 66 69 65 64 20 73 61 76  he specified sav
34410 65 70 6f 69 6e 74 20 77 61 73 20 63 72 65 61 74  epoint was creat
34420 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61  ed..**.** The sa
34430 76 65 70 6f 69 6e 74 20 74 6f 20 72 6f 6c 6c 62  vepoint to rollb
34440 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 20 69  ack or release i
34450 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  s identified by 
34460 70 61 72 61 6d 65 74 65 72 20 0a 2a 2a 20 69 53  parameter .** iS
34470 61 76 65 70 6f 69 6e 74 2e 20 41 20 76 61 6c 75  avepoint. A valu
34480 65 20 6f 66 20 30 20 6d 65 61 6e 73 20 74 6f 20  e of 0 means to 
34490 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 6f  operate on the o
344a0 75 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69  utermost savepoi
344b0 6e 74 0a 2a 2a 20 28 74 68 65 20 66 69 72 73 74  nt.** (the first
344c0 20 63 72 65 61 74 65 64 29 2e 20 41 20 76 61 6c   created). A val
344d0 75 65 20 6f 66 20 28 50 61 67 65 72 2e 6e 53 61  ue of (Pager.nSa
344e0 76 65 70 6f 69 6e 74 2d 31 29 20 6d 65 61 6e 73  vepoint-1) means
344f0 20 6f 70 65 72 61 74 65 0a 2a 2a 20 6f 6e 20 74   operate.** on t
34500 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
34510 20 63 72 65 61 74 65 64 20 73 61 76 65 70 6f 69   created savepoi
34520 6e 74 2e 20 49 66 20 69 53 61 76 65 70 6f 69 6e  nt. If iSavepoin
34530 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
34540 6e 0a 2a 2a 20 28 50 61 67 65 72 2e 6e 53 61 76  n.** (Pager.nSav
34550 65 70 6f 69 6e 74 2d 31 29 2c 20 74 68 65 6e 20  epoint-1), then 
34560 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
34570 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
34580 49 66 20 61 20 6e 65 67 61 74 69 76 65 20 76 61  If a negative va
34590 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 74 6f  lue is passed to
345a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
345b0 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  then the current
345c0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
345d0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
345e0 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e  This is differen
345f0 74 20 74 6f 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a  t to calling .**
34600 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
34610 6c 62 61 63 6b 28 29 20 62 65 63 61 75 73 65 20  lback() because 
34620 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
34630 65 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65  es not terminate
34640 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74  .** the transact
34650 69 6f 6e 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ion or unlock th
34660 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 6a  e database, it j
34670 75 73 74 20 72 65 73 74 6f 72 65 73 20 74 68 65  ust restores the
34680 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66   .** contents of
34690 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
346a0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
346b0 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  ate. .**.** In a
346c0 6e 79 20 63 61 73 65 2c 20 61 6c 6c 20 73 61 76  ny case, all sav
346d0 65 70 6f 69 6e 74 73 20 77 69 74 68 20 61 6e 20  epoints with an 
346e0 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68  index greater th
346f0 61 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 0a 2a  an iSavepoint .*
34700 2a 20 61 72 65 20 64 65 73 74 72 6f 79 65 64 2e  * are destroyed.
34710 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72 65   If this is a re
34720 6c 65 61 73 65 20 6f 70 65 72 61 74 69 6f 6e 20  lease operation 
34730 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  (op==SAVEPOINT_R
34740 45 4c 45 41 53 45 29 2c 0a 2a 2a 20 74 68 65 6e  ELEASE),.** then
34750 20 73 61 76 65 70 6f 69 6e 74 20 69 53 61 76 65   savepoint iSave
34760 70 6f 69 6e 74 20 69 73 20 61 6c 73 6f 20 64 65  point is also de
34770 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  stroyed..**.** T
34780 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
34790 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
347a0 4f 4d 45 4d 20 69 66 20 61 20 6d 65 6d 6f 72 79  OMEM if a memory
347b0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
347c0 73 2c 0a 2a 2a 20 6f 72 20 61 6e 20 49 4f 20 65  s,.** or an IO e
347d0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20  rror code if an 
347e0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
347f0 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 20 62 61  while rolling ba
34800 63 6b 20 61 20 0a 2a 2a 20 73 61 76 65 70 6f 69  ck a .** savepoi
34810 6e 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 73  nt. If no errors
34820 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f   occur, SQLITE_O
34830 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
34840 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  / .int sqlite3Pa
34850 67 65 72 53 61 76 65 70 6f 69 6e 74 28 50 61 67  gerSavepoint(Pag
34860 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
34870 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69  op, int iSavepoi
34880 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nt){.  int rc = 
34890 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
348a0 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f  sert( op==SAVEPO
348b0 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f  INT_RELEASE || o
348c0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
348d0 4c 42 41 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  LBACK );.  asser
348e0 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30  t( iSavepoint>=0
348f0 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   || op==SAVEPOIN
34900 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 0a 20  T_ROLLBACK );.. 
34910 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c   if( iSavepoint<
34920 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
34930 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69  nt ){.    int ii
34940 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
34950 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
34960 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 65  e */.    int nNe
34970 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  w;          /* N
34980 75 6d 62 65 72 20 6f 66 20 72 65 6d 61 69 6e 69  umber of remaini
34990 6e 67 20 73 61 76 65 70 6f 69 6e 74 73 20 61 66  ng savepoints af
349a0 74 65 72 20 74 68 69 73 20 6f 70 2e 20 2a 2f 0a  ter this op. */.
349b0 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
349c0 75 74 20 68 6f 77 20 6d 61 6e 79 20 73 61 76 65  ut how many save
349d0 70 6f 69 6e 74 73 20 77 69 6c 6c 20 73 74 69 6c  points will stil
349e0 6c 20 62 65 20 61 63 74 69 76 65 20 61 66 74 65  l be active afte
349f0 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6f 70  r this.    ** op
34a00 65 72 61 74 69 6f 6e 2e 20 53 74 6f 72 65 20 74  eration. Store t
34a10 68 69 73 20 76 61 6c 75 65 20 69 6e 20 6e 4e 65  his value in nNe
34a20 77 2e 20 54 68 65 6e 20 66 72 65 65 20 72 65 73  w. Then free res
34a30 6f 75 72 63 65 73 20 61 73 73 6f 63 69 61 74 65  ources associate
34a40 64 20 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 61  d .    ** with a
34a50 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68  ny savepoints th
34a60 61 74 20 61 72 65 20 64 65 73 74 72 6f 79 65 64  at are destroyed
34a70 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
34a80 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  on..    */.    n
34a90 4e 65 77 20 3d 20 69 53 61 76 65 70 6f 69 6e 74  New = iSavepoint
34aa0 20 2b 20 28 28 20 6f 70 3d 3d 53 41 56 45 50 4f   + (( op==SAVEPO
34ab0 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 20 3f 20  INT_RELEASE ) ? 
34ac0 30 20 3a 20 31 29 3b 0a 20 20 20 20 66 6f 72 28  0 : 1);.    for(
34ad0 69 69 3d 6e 4e 65 77 3b 20 69 69 3c 70 50 61 67  ii=nNew; ii<pPag
34ae0 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
34af0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c  ii++){.      sql
34b00 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
34b10 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70  y(pPager->aSavep
34b20 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65  oint[ii].pInSave
34b30 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  point);.    }.  
34b40 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70    pPager->nSavep
34b50 6f 69 6e 74 20 3d 20 6e 4e 65 77 3b 0a 0a 20 20  oint = nNew;..  
34b60 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
34b70 61 20 72 65 6c 65 61 73 65 20 6f 66 20 74 68 65  a release of the
34b80 20 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65 70   outermost savep
34b90 6f 69 6e 74 2c 20 74 72 75 6e 63 61 74 65 20 0a  oint, truncate .
34ba0 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
34bb0 6f 75 72 6e 61 6c 20 74 6f 20 7a 65 72 6f 20 62  ournal to zero b
34bc0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 2a 2f  ytes in size. */
34bd0 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56  .    if( op==SAV
34be0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29  EPOINT_RELEASE )
34bf0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 65 77  {.      if( nNew
34c00 3d 3d 30 20 26 26 20 69 73 4f 70 65 6e 28 70 50  ==0 && isOpen(pP
34c10 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
34c20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74         /* Only t
34c30 72 75 6e 63 61 74 65 20 69 66 20 69 74 20 69 73  runcate if it is
34c40 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 75   an in-memory su
34c50 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  b-journal. */.  
34c60 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
34c70 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50  3IsMemJournal(pP
34c80 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
34c90 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
34ca0 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
34cb0 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 30 29  pPager->sjfd, 0)
34cc0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
34cd0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
34ce0 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  K );.        }. 
34cf0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
34d00 53 75 62 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  SubRec = 0;.    
34d10 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a    }.    }.    /*
34d20 20 45 6c 73 65 20 74 68 69 73 20 69 73 20 61 20   Else this is a 
34d30 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69  rollback operati
34d40 6f 6e 2c 20 70 6c 61 79 62 61 63 6b 20 74 68 65  on, playback the
34d50 20 73 70 65 63 69 66 69 65 64 20 73 61 76 65 70   specified savep
34d60 6f 69 6e 74 2e 0a 20 20 20 20 2a 2a 20 49 66 20  oint..    ** If 
34d70 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 2d 66  this is a temp-f
34d80 69 6c 65 2c 20 69 74 20 69 73 20 70 6f 73 73 69  ile, it is possi
34d90 62 6c 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ble that the jou
34da0 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 0a 20 20  rnal file has.  
34db0 20 20 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65    ** not yet bee
34dc0 6e 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69  n opened. In thi
34dd0 73 20 63 61 73 65 20 74 68 65 72 65 20 68 61 76  s case there hav
34de0 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65  e been no change
34df0 73 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  s to.    ** the 
34e00 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 73  database file, s
34e10 6f 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 6f  o the playback o
34e20 70 65 72 61 74 69 6f 6e 20 63 61 6e 20 62 65 20  peration can be 
34e30 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a  skipped..    */.
34e40 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 61 67      else if( pag
34e50 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
34e60 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
34e70 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
34e80 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
34e90 2a 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 28 6e  *pSavepoint = (n
34ea0 4e 65 77 3d 3d 30 29 3f 30 3a 26 70 50 61 67 65  New==0)?0:&pPage
34eb0 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 6e 4e  r->aSavepoint[nN
34ec0 65 77 2d 31 5d 3b 0a 20 20 20 20 20 20 72 63 20  ew-1];.      rc 
34ed0 3d 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  = pagerPlaybackS
34ee0 61 76 65 70 6f 69 6e 74 28 70 50 61 67 65 72 2c  avepoint(pPager,
34ef0 20 70 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   pSavepoint);.  
34f00 20 20 20 20 61 73 73 65 72 74 28 72 63 21 3d 53      assert(rc!=S
34f10 51 4c 49 54 45 5f 44 4f 4e 45 29 3b 0a 20 20 20  QLITE_DONE);.   
34f20 20 7d 0a 20 20 0a 20 20 7d 0a 20 20 72 65 74 75   }.  .  }.  retu
34f30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
34f40 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
34f50 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
34f60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
34f70 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
34f80 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
34f90 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
34fa0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
34fb0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d  er->zFilename;.}
34fc0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
34fd0 68 65 20 56 46 53 20 73 74 72 75 63 74 75 72 65  he VFS structure
34fe0 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e 0a   for the pager..
34ff0 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  */.const sqlite3
35000 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61 67  _vfs *sqlite3Pag
35010 65 72 56 66 73 28 50 61 67 65 72 20 2a 70 50 61  erVfs(Pager *pPa
35020 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
35030 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a  Pager->pVfs;.}..
35040 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
35050 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72   file handle for
35060 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35070 6c 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  le associated.**
35080 20 77 69 74 68 20 74 68 65 20 70 61 67 65 72 2e   with the pager.
35090 20 20 54 68 69 73 20 6d 69 67 68 74 20 72 65 74    This might ret
350a0 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  urn NULL if the 
350b0 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74 20  file has.** not 
350c0 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  yet been opened.
350d0 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c 65  .*/.sqlite3_file
350e0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69   *sqlite3PagerFi
350f0 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  le(Pager *pPager
35100 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
35110 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  er->fd;.}../*.**
35120 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
35130 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
35140 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
35150 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
35160 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
35170 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  lname(Pager *pPa
35180 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
35190 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b  Pager->zJournal;
351a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
351b0 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28 29   true if fsync()
351c0 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62   calls are disab
351d0 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67  led for this pag
351e0 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  er.  Return FALS
351f0 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73  E.** if fsync()s
35200 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f   are executed no
35210 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  rmally..*/.int s
35220 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e  qlite3PagerNosyn
35230 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  c(Pager *pPager)
35240 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
35250 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69  r->noSync;.}..#i
35260 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
35270 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CODEC./*.** Set 
35280 6f 72 20 72 65 74 72 69 65 76 65 20 74 68 65 20  or retrieve the 
35290 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70  codec for this p
352a0 61 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ager.*/.static v
352b0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
352c0 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65  SetCodec(.  Page
352d0 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69  r *pPager,.  voi
352e0 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
352f0 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
35300 74 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f  t),.  void (*xCo
35310 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69  decSizeChng)(voi
35320 64 2a 2c 69 6e 74 2c 69 6e 74 29 2c 0a 20 20 76  d*,int,int),.  v
35330 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65  oid (*xCodecFree
35340 29 28 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64  )(void*),.  void
35350 20 2a 70 43 6f 64 65 63 0a 29 7b 0a 20 20 69 66   *pCodec.){.  if
35360 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ( pPager->xCodec
35370 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78  Free ) pPager->x
35380 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65 72  CodecFree(pPager
35390 2d 3e 70 43 6f 64 65 63 29 3b 0a 20 20 70 50 61  ->pCodec);.  pPa
353a0 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 70 50  ger->xCodec = pP
353b0 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3f 20 30 20  ager->memDb ? 0 
353c0 3a 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67  : xCodec;.  pPag
353d0 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68  er->xCodecSizeCh
353e0 6e 67 20 3d 20 78 43 6f 64 65 63 53 69 7a 65 43  ng = xCodecSizeC
353f0 68 6e 67 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78  hng;.  pPager->x
35400 43 6f 64 65 63 46 72 65 65 20 3d 20 78 43 6f 64  CodecFree = xCod
35410 65 63 46 72 65 65 3b 0a 20 20 70 50 61 67 65 72  ecFree;.  pPager
35420 2d 3e 70 43 6f 64 65 63 20 3d 20 70 43 6f 64 65  ->pCodec = pCode
35430 63 3b 0a 20 20 70 61 67 65 72 52 65 70 6f 72 74  c;.  pagerReport
35440 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a  Size(pPager);.}.
35450 73 74 61 74 69 63 20 76 6f 69 64 20 2a 73 71 6c  static void *sql
35460 69 74 65 33 50 61 67 65 72 47 65 74 43 6f 64 65  ite3PagerGetCode
35470 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  c(Pager *pPager)
35480 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
35490 72 2d 3e 70 43 6f 64 65 63 3b 0a 7d 0a 23 65 6e  r->pCodec;.}.#en
354a0 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
354b0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
354c0 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  UUM./*.** Move t
354d0 68 65 20 70 61 67 65 20 70 50 67 20 74 6f 20 6c  he page pPg to l
354e0 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20  ocation pgno in 
354f0 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
35500 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f  There must be no
35510 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
35520 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73  he page previous
35530 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a  ly located at.**
35540 20 70 67 6e 6f 20 28 77 68 69 63 68 20 77 65 20   pgno (which we 
35550 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f  call pPgOld) tho
35560 75 67 68 20 74 68 61 74 20 70 61 67 65 20 69 73  ugh that page is
35570 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a   allowed to be.*
35580 2a 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66 20  * in cache.  If 
35590 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75  the page previou
355a0 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 20 70  sly located at p
355b0 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  gno is not alrea
355c0 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c  dy.** in the rol
355d0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69  lback journal, i
355e0 74 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68 65  t is not put the
355f0 72 65 20 62 79 20 62 79 20 74 68 69 73 20 72 6f  re by by this ro
35600 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66  utine..**.** Ref
35610 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
35620 61 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20 76  age pPg remain v
35630 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61  alid. Updating a
35640 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20  ny.** meta-data 
35650 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
35660 70 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20 73  pPg (i.e. data s
35670 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78  tored in the nEx
35680 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c  tra bytes.** all
35690 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
356a0 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74  h the page) is t
356b0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
356c0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e  y of the caller.
356d0 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63  .**.** A transac
356e0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74  tion must be act
356f0 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ive when this ro
35700 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
35710 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a   It used to be.*
35720 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74 20  * required that 
35730 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
35740 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20  saction was not 
35750 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69 73  active, but this
35760 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20   restriction.** 
35770 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64  has been removed
35780 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e   (CREATE INDEX n
35790 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70  eeds to move a p
357a0 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74 65  age when a state
357b0 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ment.** transact
357c0 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a  ion is active)..
357d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 75  **.** If the fou
357e0 72 74 68 20 61 72 67 75 6d 65 6e 74 2c 20 69 73  rth argument, is
357f0 43 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e 2d 7a  Commit, is non-z
35800 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 70  ero, then this p
35810 61 67 65 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20  age is being.** 
35820 6d 6f 76 65 64 20 61 73 20 70 61 72 74 20 6f 66  moved as part of
35830 20 61 20 64 61 74 61 62 61 73 65 20 72 65 6f 72   a database reor
35840 67 61 6e 69 7a 61 74 69 6f 6e 20 6a 75 73 74 20  ganization just 
35850 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
35860 61 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 62 65  action .** is be
35870 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49  ing committed. I
35880 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69 74 20  n this case, it 
35890 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
358a0 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
358b0 70 61 67 65 20 0a 2a 2a 20 70 50 67 20 72 65 66  page .** pPg ref
358c0 65 72 73 20 74 6f 20 77 69 6c 6c 20 6e 6f 74 20  ers to will not 
358d0 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 61 67  be written to ag
358e0 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20  ain within this 
358f0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
35900 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
35910 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
35920 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49  TE_NOMEM or an I
35930 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  O error code if 
35940 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  an error.** occu
35950 72 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  rs. Otherwise, i
35960 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
35970 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
35980 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
35990 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
359a0 44 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e  DbPage *pPg, Pgn
359b0 6f 20 70 67 6e 6f 2c 20 69 6e 74 20 69 73 43 6f  o pgno, int isCo
359c0 6d 6d 69 74 29 7b 0a 20 20 50 67 48 64 72 20 2a  mmit){.  PgHdr *
359d0 70 50 67 4f 6c 64 3b 20 20 20 20 20 20 20 20 20  pPgOld;         
359e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
359f0 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74  e being overwrit
35a00 74 65 6e 2e 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  ten. */.  Pgno n
35a10 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b  eedSyncPgno = 0;
35a20 20 20 20 20 20 20 20 2f 2a 20 4f 6c 64 20 76 61         /* Old va
35a30 6c 75 65 20 6f 66 20 70 50 67 2d 3e 70 67 6e 6f  lue of pPg->pgno
35a40 2c 20 69 66 20 73 79 6e 63 20 69 73 20 72 65 71  , if sync is req
35a50 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72  uired */.  int r
35a60 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
35a70 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
35a80 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f  n code */.  Pgno
35a90 20 6f 72 69 67 50 67 6e 6f 3b 20 20 20 20 20 20   origPgno;      
35aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
35ab0 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 6e 75  original page nu
35ac0 6d 62 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  mber */..  asser
35ad0 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
35ae0 3b 0a 0a 20 20 2f 2a 20 49 6e 20 6f 72 64 65 72  ;..  /* In order
35af0 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 72   to be able to r
35b00 6f 6c 6c 62 61 63 6b 2c 20 61 6e 20 69 6e 2d 6d  ollback, an in-m
35b10 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 6d  emory database m
35b20 75 73 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  ust journal.  **
35b30 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
35b40 20 6d 6f 76 69 6e 67 20 66 72 6f 6d 2e 0a 20 20   moving from..  
35b50 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  */.  if( MEMDB )
35b60 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
35b70 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
35b80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
35b90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
35ba0 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
35bb0 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 69 73 20   being moved is 
35bc0 64 69 72 74 79 20 61 6e 64 20 68 61 73 20 6e 6f  dirty and has no
35bd0 74 20 62 65 65 6e 20 73 61 76 65 64 20 62 79 20  t been saved by 
35be0 74 68 65 20 6c 61 74 65 73 74 0a 20 20 2a 2a 20  the latest.  ** 
35bf0 73 61 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20  savepoint, then 
35c00 73 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  save the current
35c10 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
35c20 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 0a   page into the .
35c30 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c    ** sub-journal
35c40 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 72 65   now. This is re
35c50 71 75 69 72 65 64 20 74 6f 20 68 61 6e 64 6c 65  quired to handle
35c60 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
35c70 63 65 6e 61 72 69 6f 3a 0a 20 20 2a 2a 0a 20 20  cenario:.  **.  
35c80 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a  **   BEGIN;.  **
35c90 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61       <journal pa
35ca0 67 65 20 58 2c 20 74 68 65 6e 20 6d 6f 64 69 66  ge X, then modif
35cb0 79 20 69 74 20 69 6e 20 6d 65 6d 6f 72 79 3e 0a  y it in memory>.
35cc0 20 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49    **     SAVEPOI
35cd0 4e 54 20 6f 6e 65 3b 0a 20 20 2a 2a 20 20 20 20  NT one;.  **    
35ce0 20 20 20 3c 4d 6f 76 65 20 70 61 67 65 20 58 20     <Move page X 
35cf0 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 59 3e 0a 20  to location Y>. 
35d00 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b   **     ROLLBACK
35d10 20 54 4f 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20   TO one;.  **.  
35d20 2a 2a 20 49 66 20 70 61 67 65 20 58 20 77 65 72  ** If page X wer
35d30 65 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f  e not written to
35d40 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
35d50 20 68 65 72 65 2c 20 69 74 20 77 6f 75 6c 64 20   here, it would 
35d60 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 70 6f 73 73  not.  ** be poss
35d70 69 62 6c 65 20 74 6f 20 72 65 73 74 6f 72 65 20  ible to restore 
35d80 69 74 73 20 63 6f 6e 74 65 6e 74 73 20 77 68 65  its contents whe
35d90 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20  n the "ROLLBACK 
35da0 54 4f 20 6f 6e 65 22 0a 20 20 2a 2a 20 73 74 61  TO one".  ** sta
35db0 74 65 6d 65 6e 74 20 77 65 72 65 20 69 73 20 70  tement were is p
35dc0 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2a 0a 20  rocessed..  **. 
35dd0 20 2a 2a 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61   ** subjournalPa
35de0 67 65 28 29 20 6d 61 79 20 6e 65 65 64 20 74 6f  ge() may need to
35df0 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
35e00 74 6f 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67  to store pPg->pg
35e10 6e 6f 20 69 6e 74 6f 0a 20 20 2a 2a 20 6f 6e 65  no into.  ** one
35e20 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69   or more savepoi
35e30 6e 74 20 62 69 74 76 65 63 73 2e 20 54 68 69 73  nt bitvecs. This
35e40 20 69 73 20 74 68 65 20 72 65 61 73 6f 6e 20 74   is the reason t
35e50 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  his function.  *
35e60 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  * may return SQL
35e70 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 20 20 2a 2f 0a  ITE_NOMEM..  */.
35e80 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73    if( pPg->flags
35e90 26 50 47 48 44 52 5f 44 49 52 54 59 0a 20 20 20  &PGHDR_DIRTY.   
35ea0 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  && subjRequiresP
35eb0 61 67 65 28 70 50 67 29 0a 20 20 20 26 26 20 53  age(pPg).   && S
35ec0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
35ed0 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
35ee0 50 67 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  Pg)).  ){.    re
35ef0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
35f00 50 41 47 45 52 54 52 41 43 45 28 28 22 4d 4f 56  PAGERTRACE(("MOV
35f10 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e 65  E %d page %d (ne
35f20 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73  edSync=%d) moves
35f30 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20   to %d\n", .    
35f40 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
35f50 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 70  ), pPg->pgno, (p
35f60 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
35f70 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 2c 20  NEED_SYNC)?1:0, 
35f80 70 67 6e 6f 29 29 3b 0a 20 20 49 4f 54 52 41 43  pgno));.  IOTRAC
35f90 45 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25  E(("MOVE %p %d %
35fa0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
35fb0 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a  g->pgno, pgno)).
35fc0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75  .  /* If the jou
35fd0 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  rnal needs to be
35fe0 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65   sync()ed before
35ff0 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20   page pPg->pgno 
36000 63 61 6e 0a 20 20 2a 2a 20 62 65 20 77 72 69 74  can.  ** be writ
36010 74 65 6e 20 74 6f 2c 20 73 74 6f 72 65 20 70 50  ten to, store pP
36020 67 2d 3e 70 67 6e 6f 20 69 6e 20 6c 6f 63 61 6c  g->pgno in local
36030 20 76 61 72 69 61 62 6c 65 20 6e 65 65 64 53 79   variable needSy
36040 6e 63 50 67 6e 6f 2e 0a 20 20 2a 2a 0a 20 20 2a  ncPgno..  **.  *
36050 2a 20 49 66 20 74 68 65 20 69 73 43 6f 6d 6d 69  * If the isCommi
36060 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  t flag is set, t
36070 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
36080 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
36090 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  .  ** the journa
360a0 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79  l needs to be sy
360b0 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61  nc()ed before da
360c0 74 61 62 61 73 65 20 70 61 67 65 20 70 50 67 2d  tabase page pPg-
360d0 3e 70 67 6e 6f 20 0a 20 20 2a 2a 20 63 61 6e 20  >pgno .  ** can 
360e0 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54  be written to. T
360f0 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
36100 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e  ready promised n
36110 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 69  ot to write to i
36120 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  t..  */.  if( (p
36130 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
36140 4e 45 45 44 5f 53 59 4e 43 29 20 26 26 20 21 69  NEED_SYNC) && !i
36150 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 6e  sCommit ){.    n
36160 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50  eedSyncPgno = pP
36170 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73  g->pgno;.    ass
36180 65 72 74 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e  ert( pageInJourn
36190 61 6c 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e  al(pPg) || pPg->
361a0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f  pgno>pPager->dbO
361b0 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  rigSize );.    a
361c0 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67  ssert( pPg->flag
361d0 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b  s&PGHDR_DIRTY );
361e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
361f0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b  ger->needSync );
36200 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
36210 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73  e cache contains
36220 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67   a page with pag
36230 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72  e-number pgno, r
36240 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72  emove it.  ** fr
36250 6f 6d 20 69 74 73 20 68 61 73 68 20 63 68 61 69  om its hash chai
36260 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20  n. Also, if the 
36270 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77  PgHdr.needSync w
36280 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a  as set for .  **
36290 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72   page pgno befor
362a0 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65  e the 'move' ope
362b0 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73  ration, it needs
362c0 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20   to be retained 
362d0 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61  .  ** for the pa
362e0 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a  ge moved there..
362f0 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67    */.  pPg->flag
36300 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44  s &= ~PGHDR_NEED
36310 5f 53 59 4e 43 3b 0a 20 20 70 50 67 4f 6c 64 20  _SYNC;.  pPgOld 
36320 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
36330 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
36340 61 73 73 65 72 74 28 20 21 70 50 67 4f 6c 64 20  assert( !pPgOld 
36350 7c 7c 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d  || pPgOld->nRef=
36360 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 50 67 4f  =1 );.  if( pPgO
36370 6c 64 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 66  ld ){.    pPg->f
36380 6c 61 67 73 20 7c 3d 20 28 70 50 67 4f 6c 64 2d  lags |= (pPgOld-
36390 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
363a0 44 5f 53 59 4e 43 29 3b 0a 20 20 20 20 69 66 28  D_SYNC);.    if(
363b0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
363c0 2f 2a 20 44 6f 20 6e 6f 74 20 64 69 73 63 61 72  /* Do not discar
363d0 64 20 70 61 67 65 73 20 66 72 6f 6d 20 61 6e 20  d pages from an 
363e0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
363f0 73 65 20 73 69 6e 63 65 20 77 65 20 6d 69 67 68  se since we migh
36400 74 0a 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20  t.      ** need 
36410 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6c 61 74 65  to rollback late
36420 72 2e 20 20 4a 75 73 74 20 6d 6f 76 65 20 74 68  r.  Just move th
36430 65 20 70 61 67 65 20 6f 75 74 20 6f 66 20 74 68  e page out of th
36440 65 20 77 61 79 2e 20 2a 2f 0a 20 20 20 20 20 20  e way. */.      
36450 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
36460 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20  dbSizeValid );. 
36470 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
36480 68 65 4d 6f 76 65 28 70 50 67 4f 6c 64 2c 20 70  heMove(pPgOld, p
36490 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 31 29  Pager->dbSize+1)
364a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
364b0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
364c0 44 72 6f 70 28 70 50 67 4f 6c 64 29 3b 0a 20 20  Drop(pPgOld);.  
364d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 6f 72 69 67 50    }.  }..  origP
364e0 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
364f0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
36500 4d 6f 76 65 28 70 50 67 2c 20 70 67 6e 6f 29 3b  Move(pPg, pgno);
36510 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
36520 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  MakeDirty(pPg);.
36530 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69    pPager->dbModi
36540 66 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66 28  fied = 1;..  if(
36550 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b   needSyncPgno ){
36560 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53  .    /* If needS
36570 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a  yncPgno is non-z
36580 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ero, then the jo
36590 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73  urnal file needs
365a0 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73   to be .    ** s
365b0 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61  ync()ed before a
365c0 6e 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74  ny data is writt
365d0 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  en to database f
365e0 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e  ile page needSyn
365f0 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75  cPgno..    ** Cu
36600 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68  rrently, no such
36610 20 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20   page exists in 
36620 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61  the page-cache a
36630 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 22  nd the .    ** "
36640 69 73 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62 69  is journaled" bi
36650 74 76 65 63 20 66 6c 61 67 20 68 61 73 20 62 65  tvec flag has be
36660 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65  en set. This nee
36670 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65  ds to be remedie
36680 64 20 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61 64  d by.    ** load
36690 69 6e 67 20 74 68 65 20 70 61 67 65 20 69 6e 74  ing the page int
366a0 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  o the pager-cach
366b0 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68  e and setting th
366c0 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
366d0 20 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a 20   .    ** flag.. 
366e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
366f0 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6c  the attempt to l
36700 6f 61 64 20 74 68 65 20 70 61 67 65 20 69 6e 74  oad the page int
36710 6f 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  o the page-cache
36720 20 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20 20   fails, (due.   
36730 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28   ** to a malloc(
36740 29 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 29  ) or IO failure)
36750 2c 20 63 6c 65 61 72 20 74 68 65 20 62 69 74 20  , clear the bit 
36760 69 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e 61  in the pInJourna
36770 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61 79  l[].    ** array
36780 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
36790 74 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61 64  the page is load
367a0 65 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20 61  ed and written a
367b0 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20 74  gain in.    ** t
367c0 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  his transaction,
367d0 20 69 74 20 6d 61 79 20 62 65 20 77 72 69 74 74   it may be writt
367e0 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
367f0 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 20  se file before. 
36800 20 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e 63     ** it is sync
36810 65 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ed into the jour
36820 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 77  nal file. This w
36830 61 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20 75  ay, it may end u
36840 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  p in.    ** the 
36850 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77 69  journal file twi
36860 63 65 2c 20 62 75 74 20 74 68 61 74 20 69 73 20  ce, but that is 
36870 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20  not a problem.. 
36880 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
36890 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
368a0 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73  () call may caus
368b0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f  e the journal to
368c0 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20   sync. So make. 
368d0 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50     ** sure the P
368e0 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
368f0 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20  ag is set too.. 
36900 20 20 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20     */.    PgHdr 
36910 2a 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73 73  *pPgHdr;.    ass
36920 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
36930 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20  dSync );.    rc 
36940 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
36950 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79  t(pPager, needSy
36960 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72 29  ncPgno, &pPgHdr)
36970 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
36980 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36990 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e   if( needSyncPgn
369a0 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
369b0 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
369c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
369d0 3e 70 54 6d 70 53 70 61 63 65 21 3d 30 20 29 3b  >pTmpSpace!=0 );
369e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
369f0 42 69 74 76 65 63 43 6c 65 61 72 28 70 50 61 67  BitvecClear(pPag
36a00 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
36a10 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 70 50  needSyncPgno, pP
36a20 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29  ager->pTmpSpace)
36a30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
36a40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
36a50 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
36a60 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 61  dSync = 1;.    a
36a70 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
36a80 6f 53 79 6e 63 3d 3d 30 20 26 26 20 21 4d 45 4d  oSync==0 && !MEM
36a90 44 42 20 29 3b 0a 20 20 20 20 70 50 67 48 64 72  DB );.    pPgHdr
36aa0 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
36ab0 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
36ac0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
36ad0 65 44 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a  eDirty(pPgHdr);.
36ae0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
36af0 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
36b00 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 6f   }..  /*.  ** Fo
36b10 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
36b20 61 74 61 62 61 73 65 2c 20 6d 61 6b 65 20 73 75  atabase, make su
36b30 72 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  re the original 
36b40 70 61 67 65 20 63 6f 6e 74 69 6e 75 65 73 0a 20  page continues. 
36b50 20 2a 2a 20 74 6f 20 65 78 69 73 74 2c 20 69 6e   ** to exist, in
36b60 20 63 61 73 65 20 74 68 65 20 74 72 61 6e 73 61   case the transa
36b70 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 72  ction needs to r
36b80 6f 6c 6c 20 62 61 63 6b 2e 20 20 55 73 65 20 70  oll back.  Use p
36b90 50 67 4f 6c 64 0a 20 20 2a 2a 20 61 73 20 74 68  PgOld.  ** as th
36ba0 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  e original page 
36bb0 73 69 6e 63 65 20 69 74 20 68 61 73 20 61 6c 72  since it has alr
36bc0 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
36bd0 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ted..  */.  if( 
36be0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 73 71 6c  MEMDB ){.    sql
36bf0 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70  ite3PcacheMove(p
36c00 50 67 4f 6c 64 2c 20 6f 72 69 67 50 67 6e 6f 29  PgOld, origPgno)
36c10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
36c20 65 72 55 6e 72 65 66 28 70 50 67 4f 6c 64 29 3b  erUnref(pPgOld);
36c30 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
36c40 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
36c50 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
36c60 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
36c70 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 73  e data for the s
36c80 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a  pecified page..*
36c90 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
36ca0 61 67 65 72 47 65 74 44 61 74 61 28 44 62 50 61  agerGetData(DbPa
36cb0 67 65 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65  ge *pPg){.  asse
36cc0 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
36cd0 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  || pPg->pPager->
36ce0 6d 65 6d 44 62 20 29 3b 0a 20 20 72 65 74 75 72  memDb );.  retur
36cf0 6e 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a  n pPg->pData;.}.
36d00 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
36d10 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50  pointer to the P
36d20 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65  ager.nExtra byte
36d30 73 20 6f 66 20 22 65 78 74 72 61 22 20 73 70 61  s of "extra" spa
36d40 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  ce .** allocated
36d50 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
36d60 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a  specified page..
36d70 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
36d80 50 61 67 65 72 47 65 74 45 78 74 72 61 28 44 62  PagerGetExtra(Db
36d90 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
36da0 74 75 72 6e 20 70 50 67 2d 3e 70 45 78 74 72 61  turn pPg->pExtra
36db0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73  ;.}../*.** Get/s
36dc0 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d  et the locking-m
36dd0 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ode for this pag
36de0 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d  er. Parameter eM
36df0 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a  ode must be one.
36e00 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b  ** of PAGER_LOCK
36e10 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50  INGMODE_QUERY, P
36e20 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
36e30 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50  _NORMAL or .** P
36e40 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
36e50 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74  _EXCLUSIVE. If t
36e60 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  he parameter is 
36e70 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e  not _QUERY, then
36e80 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d  .** the locking-
36e90 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74  mode is set to t
36ea0 68 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 69  he value specifi
36eb0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ed..**.** The re
36ec0 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20  turned value is 
36ed0 65 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43  either PAGER_LOC
36ee0 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
36ef0 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b  or.** PAGER_LOCK
36f00 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
36f10 45 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  E, indicating th
36f20 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69  e current (possi
36f30 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20  bly updated).** 
36f40 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f  locking-mode..*/
36f50 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
36f60 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67  rLockingMode(Pag
36f70 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
36f80 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74  eMode){.  assert
36f90 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  ( eMode==PAGER_L
36fa0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
36fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
36fc0 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
36fd0 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a  KINGMODE_NORMAL.
36fe0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
36ff0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
37000 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
37010 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  E );.  assert( P
37020 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
37030 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73  _QUERY<0 );.  as
37040 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
37050 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d  INGMODE_NORMAL>=
37060 30 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49  0 && PAGER_LOCKI
37070 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
37080 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f  >=0 );.  if( eMo
37090 64 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72  de>=0 && !pPager
370a0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
370b0 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
370c0 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d  iveMode = (u8)eM
370d0 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ode;.  }.  retur
370e0 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65  n (int)pPager->e
370f0 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a  xclusiveMode;.}.
37100 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6a  ./*.** Set the j
37110 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f 72 20  ournal-mode for 
37120 74 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61  this pager. Para
37130 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74  meter eMode must
37140 20 62 65 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a   be one of:.**.*
37150 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e  *    PAGER_JOURN
37160 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 2a 2a  ALMODE_DELETE.**
37170 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
37180 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 2a  LMODE_TRUNCATE.*
37190 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e  *    PAGER_JOURN
371a0 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 2a  ALMODE_PERSIST.*
371b0 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e  *    PAGER_JOURN
371c0 41 4c 4d 4f 44 45 5f 4f 46 46 0a 2a 2a 20 20 20  ALMODE_OFF.**   
371d0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
371e0 44 45 5f 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20  DE_MEMORY.**    
371f0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
37200 45 5f 57 41 4c 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E_WAL.**.** The 
37210 6a 6f 75 72 6e 61 6c 6d 6f 64 65 20 69 73 20 73  journalmode is s
37220 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
37230 73 70 65 63 69 66 69 65 64 20 69 66 20 74 68 65  specified if the
37240 20 63 68 61 6e 67 65 20 69 73 20 61 6c 6c 6f 77   change is allow
37250 65 64 2e 0a 2a 2a 20 54 68 65 20 63 68 61 6e 67  ed..** The chang
37260 65 20 6d 61 79 20 62 65 20 64 69 73 61 6c 6c 6f  e may be disallo
37270 77 65 64 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c  wed for the foll
37280 6f 77 69 6e 67 20 72 65 61 73 6f 6e 73 3a 0a 2a  owing reasons:.*
37290 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 69 6e 2d  *.**   *  An in-
372a0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
372b0 63 61 6e 20 6f 6e 6c 79 20 68 61 76 65 20 69 74  can only have it
372c0 73 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 73  s journal_mode s
372d0 65 74 20 74 6f 20 5f 4f 46 46 0a 2a 2a 20 20 20  et to _OFF.**   
372e0 20 20 20 6f 72 20 5f 4d 45 4d 4f 52 59 2e 0a 2a     or _MEMORY..*
372f0 2a 0a 2a 2a 20 20 20 2a 20 20 54 65 6d 70 6f 72  *.**   *  Tempor
37300 61 72 79 20 64 61 74 61 62 61 73 65 73 20 63 61  ary databases ca
37310 6e 6e 6f 74 20 68 61 76 65 20 5f 57 41 4c 20 6a  nnot have _WAL j
37320 6f 75 72 6e 61 6c 6d 6f 64 65 2e 0a 2a 2a 0a 2a  ournalmode..**.*
37330 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 69  * The returned i
37340 6e 64 69 63 61 74 65 20 74 68 65 20 63 75 72 72  ndicate the curr
37350 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70  ent (possibly up
37360 64 61 74 65 64 29 20 6a 6f 75 72 6e 61 6c 2d 6d  dated) journal-m
37370 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
37380 74 65 33 50 61 67 65 72 53 65 74 4a 6f 75 72 6e  te3PagerSetJourn
37390 61 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50  alMode(Pager *pP
373a0 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29  ager, int eMode)
373b0 7b 0a 20 20 75 38 20 65 4f 6c 64 20 3d 20 70 50  {.  u8 eOld = pP
373c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
373d0 65 3b 20 20 20 20 2f 2a 20 50 72 69 6f 72 20 6a  e;    /* Prior j
373e0 6f 75 72 6e 61 6c 6d 6f 64 65 20 2a 2f 0a 0a 20  ournalmode */.. 
373f0 20 2f 2a 20 54 68 65 20 65 4d 6f 64 65 20 70 61   /* The eMode pa
37400 72 61 6d 65 74 65 72 20 69 73 20 61 6c 77 61 79  rameter is alway
37410 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 61 73 73  s valid */.  ass
37420 65 72 74 28 20 20 20 20 20 20 65 4d 6f 64 65 3d  ert(      eMode=
37430 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
37440 44 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20  DE_DELETE.      
37450 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
37460 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
37470 45 5f 54 52 55 4e 43 41 54 45 0a 20 20 20 20 20  E_TRUNCATE.     
37480 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
37490 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
374a0 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20  DE_PERSIST.     
374b0 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
374c0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
374d0 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
374e0 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
374f0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
37500 57 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 20  WAL .           
37510 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
37520 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
37530 4f 52 59 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20  ORY );..  /* Do 
37540 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 6a 6f  not allow the jo
37550 75 72 6e 61 6c 6d 6f 64 65 20 6f 66 20 61 20 54  urnalmode of a T
37560 45 4d 50 20 64 61 74 61 62 61 73 65 20 74 6f 20  EMP database to 
37570 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 57 41  be changed to WA
37580 4c 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  L.  */.  if( pPa
37590 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26  ger->tempFile &&
375a0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
375b0 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b  URNALMODE_WAL ){
375c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 6c  .    assert( eOl
375d0 64 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  d!=PAGER_JOURNAL
375e0 4d 4f 44 45 5f 57 41 4c 20 29 3b 0a 20 20 20 20  MODE_WAL );.    
375f0 65 4d 6f 64 65 20 3d 20 65 4f 6c 64 3b 0a 20 20  eMode = eOld;.  
37600 7d 0a 0a 20 20 2f 2a 20 44 6f 20 61 6c 6c 6f 77  }..  /* Do allow
37610 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65   the journalmode
37620 20 6f 66 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   of an in-memory
37630 20 64 61 74 61 62 61 73 65 20 74 6f 20 62 65 20   database to be 
37640 73 65 74 20 74 6f 0a 20 20 2a 2a 20 61 6e 79 74  set to.  ** anyt
37650 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
37660 4d 45 4d 4f 52 59 20 6f 72 20 4f 46 46 0a 20 20  MEMORY or OFF.  
37670 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  */.  if( MEMDB )
37680 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4f  {.    assert( eO
37690 6c 64 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  ld==PAGER_JOURNA
376a0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20  LMODE_MEMORY || 
376b0 65 4f 6c 64 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  eOld==PAGER_JOUR
376c0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20  NALMODE_OFF );. 
376d0 20 20 20 69 66 28 20 65 4d 6f 64 65 21 3d 50 41     if( eMode!=PA
376e0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
376f0 4d 45 4d 4f 52 59 20 26 26 20 65 4d 6f 64 65 21  MEMORY && eMode!
37700 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
37710 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20  DE_OFF ){.      
37720 65 4d 6f 64 65 20 3d 20 65 4f 6c 64 3b 0a 20 20  eMode = eOld;.  
37730 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65    }.  }..  if( e
37740 4d 6f 64 65 21 3d 65 4f 6c 64 20 29 7b 0a 20 20  Mode!=eOld ){.  
37750 20 20 2f 2a 20 57 68 65 6e 20 63 68 61 6e 67 69    /* When changi
37760 6e 67 20 62 65 74 77 65 65 6e 20 72 6f 6c 6c 62  ng between rollb
37770 61 63 6b 20 6d 6f 64 65 73 2c 20 63 6c 6f 73 65  ack modes, close
37780 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
37790 65 20 70 72 69 6f 72 0a 20 20 20 20 2a 2a 20 74  e prior.    ** t
377a0 6f 20 74 68 65 20 63 68 61 6e 67 65 2e 20 20 42  o the change.  B
377b0 75 74 20 77 68 65 6e 20 63 68 61 6e 67 69 6e 67  ut when changing
377c0 20 66 72 6f 6d 20 61 20 72 6f 6c 6c 62 61 63 6b   from a rollback
377d0 20 6d 6f 64 65 20 74 6f 20 57 41 4c 2c 20 6b 65   mode to WAL, ke
377e0 65 70 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  ep.    ** the jo
377f0 75 72 6e 61 6c 20 6f 70 65 6e 20 73 69 6e 63 65  urnal open since
37800 20 74 68 65 72 65 20 69 73 20 61 20 72 6f 6c 6c   there is a roll
37810 62 61 63 6b 2d 73 74 79 6c 65 20 74 72 61 6e 73  back-style trans
37820 61 63 74 69 6f 6e 20 69 6e 20 70 6c 61 79 0a 20  action in play. 
37830 20 20 20 2a 2a 20 75 73 65 64 20 74 6f 20 63 6f     ** used to co
37840 6e 76 65 72 74 20 74 68 65 20 76 65 72 73 69 6f  nvert the versio
37850 6e 20 6e 75 6d 62 65 72 73 20 69 6e 20 74 68 65  n numbers in the
37860 20 62 74 72 65 65 20 68 65 61 64 65 72 2e 0a 20   btree header.. 
37870 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73     */.    if( is
37880 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
37890 29 20 26 26 20 65 4d 6f 64 65 21 3d 50 41 47 45  ) && eMode!=PAGE
378a0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
378b0 4c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L ){.      sqlit
378c0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
378d0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20  ->jfd);.    }.. 
378e0 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65     /* Change the
378f0 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 2a   journal mode. *
37900 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  /.    pPager->jo
37910 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 28 75 38 29  urnalMode = (u8)
37920 65 4d 6f 64 65 3b 0a 0a 20 20 20 20 2f 2a 20 57  eMode;..    /* W
37930 68 65 6e 20 74 72 61 6e 73 69 73 74 69 6f 6e 69  hen transistioni
37940 6e 67 20 66 72 6f 6d 20 54 52 55 4e 43 41 54 45  ng from TRUNCATE
37950 20 6f 72 20 50 45 52 53 49 53 54 20 74 6f 20 61   or PERSIST to a
37960 6e 79 20 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c  ny other journal
37970 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61 6e  .    ** mode (an
37980 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20  d we are not in 
37990 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43  locking_mode=EXC
379a0 4c 55 53 49 56 45 29 20 74 68 65 6e 20 64 65 6c  LUSIVE) then del
379b0 65 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a  ete the.    ** j
379c0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
379d0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
379e0 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
379f0 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20 35 29  DE_TRUNCATE & 5)
37a00 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
37a10 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
37a20 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 26 20  LMODE_PERSIST & 
37a30 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)==1 );.    ass
37a40 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
37a50 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 26  NALMODE_DELETE &
37a60 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
37a70 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
37a80 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
37a90 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
37aa0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
37ab0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 26 20  URNALMODE_OFF & 
37ac0 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
37ad0 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
37ae0 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 26 20 35 29  NALMODE_WAL & 5)
37af0 21 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 28  !=1 );.    if( (
37b00 65 4f 6c 64 20 26 20 35 29 3d 3d 31 20 26 26 20  eOld & 5)==1 && 
37b10 28 65 4d 6f 64 65 20 26 20 35 29 21 3d 31 20 26  (eMode & 5)!=1 &
37b20 26 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  & !pPager->exclu
37b30 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
37b40 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
37b50 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
37b60 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
37b70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
37b80 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65  .  /* Return the
37b90 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64   new journal mod
37ba0 65 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 69  e */.  return (i
37bb0 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  nt)pPager->journ
37bc0 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  alMode;.}../*.**
37bd0 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
37be0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ent journal mode
37bf0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
37c00 50 61 67 65 72 47 65 74 4a 6f 75 72 6e 61 6c 4d  PagerGetJournalM
37c10 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ode(Pager *pPage
37c20 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 69 6e  r){.  return (in
37c30 74 29 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  t)pPager->journa
37c40 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  lMode;.}../*.** 
37c50 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
37c60 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 61  he pager is in a
37c70 20 73 74 61 74 65 20 77 68 65 72 65 20 69 74 20   state where it 
37c80 69 73 20 4f 4b 20 74 6f 20 63 68 61 6e 67 65 20  is OK to change 
37c90 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 6d 6f  the.** journalmo
37ca0 64 65 2e 20 20 4a 6f 75 72 6e 61 6c 6d 6f 64 65  de.  Journalmode
37cb0 20 63 68 61 6e 67 65 73 20 63 61 6e 20 6f 6e 6c   changes can onl
37cc0 79 20 68 61 70 70 65 6e 20 77 68 65 6e 20 74 68  y happen when th
37cd0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 73  e database.** is
37ce0 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a   unmodified..*/.
37cf0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
37d00 4f 6b 54 6f 43 68 61 6e 67 65 4a 6f 75 72 6e 61  OkToChangeJourna
37d10 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61  lMode(Pager *pPa
37d20 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
37d30 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29  er->dbModified )
37d40 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
37d50 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
37d60 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e  jfd) && pPager->
37d70 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 29 20 72  journalOff>0 ) r
37d80 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
37d90 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 1;.}../*.** Ge
37da0 74 2f 73 65 74 20 74 68 65 20 73 69 7a 65 2d 6c  t/set the size-l
37db0 69 6d 69 74 20 75 73 65 64 20 66 6f 72 20 70 65  imit used for pe
37dc0 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
37dd0 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65   files..**.** Se
37de0 74 74 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6c  tting the size l
37df0 69 6d 69 74 20 74 6f 20 2d 31 20 6d 65 61 6e 73  imit to -1 means
37e00 20 6e 6f 20 6c 69 6d 69 74 20 69 73 20 65 6e 66   no limit is enf
37e10 6f 72 63 65 64 2e 0a 2a 2a 20 41 6e 20 61 74 74  orced..** An att
37e20 65 6d 70 74 20 74 6f 20 73 65 74 20 61 20 6c 69  empt to set a li
37e30 6d 69 74 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  mit smaller than
37e40 20 2d 31 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   -1 is a no-op..
37e50 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 50 61  */.i64 sqlite3Pa
37e60 67 65 72 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  gerJournalSizeLi
37e70 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
37e80 72 2c 20 69 36 34 20 69 4c 69 6d 69 74 29 7b 0a  r, i64 iLimit){.
37e90 20 20 69 66 28 20 69 4c 69 6d 69 74 3e 3d 2d 31    if( iLimit>=-1
37ea0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
37eb0 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
37ec0 20 3d 20 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20   = iLimit;.  }. 
37ed0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
37ee0 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
37ef0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
37f00 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
37f10 68 65 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  he pPager->pBack
37f20 75 70 20 76 61 72 69 61 62 6c 65 2e 20 54 68 65  up variable. The
37f30 20 62 61 63 6b 75 70 20 6d 6f 64 75 6c 65 0a 2a   backup module.*
37f40 2a 20 69 6e 20 62 61 63 6b 75 70 2e 63 20 6d 61  * in backup.c ma
37f50 69 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6e 74  intains the cont
37f60 65 6e 74 20 6f 66 20 74 68 69 73 20 76 61 72 69  ent of this vari
37f70 61 62 6c 65 2e 20 54 68 69 73 20 6d 6f 64 75 6c  able. This modul
37f80 65 0a 2a 2a 20 75 73 65 73 20 69 74 20 6f 70 61  e.** uses it opa
37f90 71 75 65 6c 79 20 61 73 20 61 6e 20 61 72 67 75  quely as an argu
37fa0 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 42  ment to sqlite3B
37fb0 61 63 6b 75 70 52 65 73 74 61 72 74 28 29 20 61  ackupRestart() a
37fc0 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33 42 61 63  nd.** sqlite3Bac
37fd0 6b 75 70 55 70 64 61 74 65 28 29 20 6f 6e 6c 79  kupUpdate() only
37fe0 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 62 61 63  ..*/.sqlite3_bac
37ff0 6b 75 70 20 2a 2a 73 71 6c 69 74 65 33 50 61 67  kup **sqlite3Pag
38000 65 72 42 61 63 6b 75 70 50 74 72 28 50 61 67 65  erBackupPtr(Page
38010 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
38020 74 75 72 6e 20 26 70 50 61 67 65 72 2d 3e 70 42  turn &pPager->pB
38030 61 63 6b 75 70 3b 0a 7d 0a 0a 23 69 66 6e 64 65  ackup;.}..#ifnde
38040 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
38050 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  L./*.** This fun
38060 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
38070 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 69 6e  when the user in
38080 76 6f 6b 65 73 20 22 50 52 41 47 4d 41 20 63 68  vokes "PRAGMA ch
38090 65 63 6b 70 6f 69 6e 74 22 2e 0a 2a 2f 0a 69 6e  eckpoint"..*/.in
380a0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 68  t sqlite3PagerCh
380b0 65 63 6b 70 6f 69 6e 74 28 50 61 67 65 72 20 2a  eckpoint(Pager *
380c0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
380d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
380e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 57 61   if( pPager->pWa
380f0 6c 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a 42 75  l ){.    u8 *zBu
38100 66 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72  f = (u8 *)pPager
38110 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
38120 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
38130 43 68 65 63 6b 70 6f 69 6e 74 28 70 50 61 67 65  Checkpoint(pPage
38140 72 2d 3e 70 57 61 6c 2c 0a 20 20 20 20 20 20 20  r->pWal,.       
38150 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   (pPager->noSync
38160 20 3f 20 30 20 3a 20 70 50 61 67 65 72 2d 3e 73   ? 0 : pPager->s
38170 79 6e 63 5f 66 6c 61 67 73 29 2c 0a 20 20 20 20  ync_flags),.    
38180 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
38190 53 69 7a 65 2c 20 7a 42 75 66 0a 20 20 20 20 29  Size, zBuf.    )
381a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
381b0 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65  c;.}..int sqlite
381c0 33 50 61 67 65 72 57 61 6c 43 61 6c 6c 62 61 63  3PagerWalCallbac
381d0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
381e0 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
381f0 65 33 57 61 6c 43 61 6c 6c 62 61 63 6b 28 70 50  e3WalCallback(pP
38200 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 7d 0a 0a  ager->pWal);.}..
38210 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
38220 65 20 69 66 20 74 68 65 20 75 6e 64 65 72 6c 79  e if the underly
38230 69 6e 67 20 56 46 53 20 66 6f 72 20 74 68 65 20  ing VFS for the 
38240 67 69 76 65 6e 20 70 61 67 65 72 20 73 75 70 70  given pager supp
38250 6f 72 74 73 20 74 68 65 0a 2a 2a 20 70 72 69 6d  orts the.** prim
38260 69 74 69 76 65 73 20 6e 65 63 65 73 73 61 72 79  itives necessary
38270 20 66 6f 72 20 77 72 69 74 65 2d 61 68 65 61 64   for write-ahead
38280 20 6c 6f 67 67 69 6e 67 2e 0a 2a 2f 0a 69 6e 74   logging..*/.int
38290 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 61 6c   sqlite3PagerWal
382a0 53 75 70 70 6f 72 74 65 64 28 50 61 67 65 72 20  Supported(Pager 
382b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 63 6f 6e 73  *pPager){.  cons
382c0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
382d0 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73 20 3d  hods *pMethods =
382e0 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
382f0 74 68 6f 64 73 3b 0a 20 20 72 65 74 75 72 6e 20  thods;.  return 
38300 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69  pMethods->iVersi
38310 6f 6e 3e 3d 32 20 26 26 20 70 4d 65 74 68 6f 64  on>=2 && pMethod
38320 73 2d 3e 78 53 68 6d 4f 70 65 6e 21 3d 30 3b 0a  s->xShmOpen!=0;.
38330 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
38340 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68  connection to th
38350 65 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  e write-ahead lo
38360 67 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  g file for pager
38370 20 70 50 61 67 65 72 2e 20 49 66 0a 2a 2a 20 74   pPager. If.** t
38380 68 65 20 6c 6f 67 20 63 6f 6e 6e 65 63 74 69 6f  he log connectio
38390 6e 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  n is already ope
383a0 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  n, this function
383b0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
383c0 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
383d0 73 74 20 62 65 20 68 6f 6c 64 69 6e 67 20 61 20  st be holding a 
383e0 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
383f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
38400 20 74 6f 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73   to call.** this
38410 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
38420 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
38430 65 6e 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61  enWal(Pager *pPa
38440 67 65 72 2c 20 69 6e 74 20 2a 70 69 73 4f 70 65  ger, int *pisOpe
38450 6e 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  n){.  int rc = S
38460 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
38470 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
38480 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  code */..  asser
38490 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
384a0 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
384b0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
384c0 3e 70 57 61 6c 20 29 7b 0a 20 20 20 20 69 66 28  >pWal ){.    if(
384d0 20 21 73 71 6c 69 74 65 33 50 61 67 65 72 57 61   !sqlite3PagerWa
384e0 6c 53 75 70 70 6f 72 74 65 64 28 70 50 61 67 65  lSupported(pPage
384f0 72 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  r) ) return SQLI
38500 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 0a 20 20  TE_CANTOPEN;..  
38510 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 63 6f    /* Open the co
38520 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nnection to the 
38530 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 74 68 69  log file. If thi
38540 73 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c  s operation fail
38550 73 2c 20 0a 20 20 20 20 2a 2a 20 28 65 2e 67 2e  s, .    ** (e.g.
38560 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 28 29   due to malloc()
38570 20 66 61 69 6c 75 72 65 29 2c 20 75 6e 6c 6f 63   failure), unloc
38580 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
38590 69 6c 65 20 61 6e 64 20 0a 20 20 20 20 2a 2a 20  ile and .    ** 
385a0 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
385b0 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  code..    */.   
385c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
385d0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66  Open(pPager->pVf
385e0 73 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 0a 20  s, pPager->fd,. 
385f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38600 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a         pPager->z
38610 46 69 6c 65 6e 61 6d 65 2c 20 26 70 50 61 67 65  Filename, &pPage
38620 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 69 66  r->pWal);.    if
38630 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
38640 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
38650 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
38660 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
38670 5f 57 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  _WAL;.    }.  }e
38680 6c 73 65 7b 0a 20 20 20 20 2a 70 69 73 4f 70 65  lse{.    *pisOpe
38690 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65  n = 1;.  }..  re
386a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*