/ Hex Artifact Content
Login

Artifact 344eddf3c59eed4b4aca31abbf762d0e301ae44d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 6c 6f 67 2e 68 22 0a 0a 2f 2a 0a 2a 2a 2a 2a  "log.h"../*.****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 20 4e 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45   NOTES ON THE DE
03a0: 53 49 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45  SIGN OF THE PAGE
03b0: 52 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  R **************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
03d0: 20 57 69 74 68 69 6e 20 74 68 69 73 20 63 6f 6d   Within this com
03e0: 6d 65 6e 74 20 62 6c 6f 63 6b 2c 20 61 20 70 61  ment block, a pa
03f0: 67 65 20 69 73 20 64 65 65 6d 65 64 20 74 6f 20  ge is deemed to 
0400: 68 61 76 65 20 62 65 65 6e 20 73 79 6e 63 65 64  have been synced
0410: 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
0420: 79 20 61 73 20 73 6f 6f 6e 20 61 73 20 69 74 20  y as soon as it 
0430: 69 73 20 77 72 69 74 74 65 6e 20 77 68 65 6e 20  is written when 
0440: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
0450: 75 73 3d 4f 46 46 2e 0a 2a 2a 20 4f 74 68 65 72  us=OFF..** Other
0460: 77 69 73 65 2c 20 74 68 65 20 70 61 67 65 20 69  wise, the page i
0470: 73 20 6e 6f 74 20 73 79 6e 63 65 64 20 75 6e 74  s not synced unt
0480: 69 6c 20 74 68 65 20 78 53 79 6e 63 20 6d 65 74  il the xSync met
0490: 68 6f 64 20 6f 66 20 74 68 65 20 56 46 53 0a 2a  hod of the VFS.*
04a0: 2a 20 69 73 20 63 61 6c 6c 65 64 20 73 75 63 63  * is called succ
04b0: 65 73 73 66 75 6c 6c 79 20 6f 6e 20 74 68 65 20  essfully on the 
04c0: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
04d0: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
04e0: 44 65 66 69 6e 69 74 69 6f 6e 3a 20 20 41 20 70  Definition:  A p
04f0: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
0500: 61 73 65 20 66 69 6c 65 20 69 73 20 73 61 69 64  ase file is said
0510: 20 74 6f 20 62 65 20 22 6f 76 65 72 77 72 69 74   to be "overwrit
0520: 65 61 62 6c 65 22 20 69 66 0a 2a 2a 20 6f 6e 65  eable" if.** one
0530: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
0540: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
0550: 75 65 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  ue about the pag
0560: 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 61  e:.** .**     (a
0570: 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  )  The original 
0580: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
0590: 61 67 65 20 61 73 20 69 74 20 77 61 73 20 61 74  age as it was at
05a0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
05b0: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 68  f.**          th
05c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
05d0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69  s been written i
05e0: 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  nto the rollback
05f0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20   journal and.** 
0600: 20 20 20 20 20 20 20 20 20 73 79 6e 63 65 64 2e           synced.
0610: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20  .** .**     (b) 
0620: 20 54 68 65 20 70 61 67 65 20 77 61 73 20 61 20   The page was a 
0630: 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61  freelist leaf pa
0640: 67 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ge at the start 
0650: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0660: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28  on..** .**     (
0670: 63 29 20 20 54 68 65 20 70 61 67 65 20 6e 75 6d  c)  The page num
0680: 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
0690: 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  han the largest 
06a0: 70 61 67 65 20 74 68 61 74 20 65 78 69 73 74 65  page that existe
06b0: 64 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  d in.**         
06c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
06d0: 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  le at the start 
06e0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
06f0: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 31 29 20 41  on..** .** (1) A
0700: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
0710: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 65  abase file is ne
0720: 76 65 72 20 6f 76 65 72 77 72 69 74 74 65 6e 20  ver overwritten 
0730: 75 6e 6c 65 73 73 20 6f 6e 65 20 6f 66 20 74 68  unless one of th
0740: 65 0a 2a 2a 20 20 20 20 20 66 6f 6c 6c 6f 77 69  e.**     followi
0750: 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 20  ng are true:.** 
0760: 0a 2a 2a 20 20 20 20 20 28 61 29 20 54 68 65 20  .**     (a) The 
0770: 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 6f 74 68  page and all oth
0780: 65 72 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  er pages on the 
0790: 73 61 6d 65 20 73 65 63 74 6f 72 20 61 72 65 20  same sector are 
07a0: 6f 76 65 72 77 72 69 74 65 61 62 6c 65 2e 0a 2a  overwriteable..*
07b0: 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20 54 68  * .**     (b) Th
07c0: 65 20 61 74 6f 6d 69 63 20 70 61 67 65 20 77 72  e atomic page wr
07d0: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
07e0: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6e 64   is enabled, and
07f0: 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 20   the entire.**  
0800: 20 20 20 20 20 20 20 74 72 61 6e 73 61 63 74 69         transacti
0810: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  on other than th
0820: 65 20 75 70 64 61 74 65 20 6f 66 20 74 68 65 20  e update of the 
0830: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 71 75  transaction sequ
0840: 65 6e 63 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  ence.**         
0850: 6e 75 6d 62 65 72 20 63 6f 6e 73 69 73 74 73 20  number consists 
0860: 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
0870: 20 63 68 61 6e 67 65 2e 0a 2a 2a 20 0a 2a 2a 20   change..** .** 
0880: 28 32 29 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  (2) The content 
0890: 6f 66 20 61 20 70 61 67 65 20 77 72 69 74 74 65  of a page writte
08a0: 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62  n into the rollb
08b0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 65 78 61 63  ack journal exac
08c0: 74 6c 79 20 6d 61 74 63 68 65 73 0a 2a 2a 20 20  tly matches.**  
08d0: 20 20 20 62 6f 74 68 20 74 68 65 20 63 6f 6e 74     both the cont
08e0: 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
08f0: 61 73 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6c  ase when the rol
0900: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 77 61  lback journal wa
0910: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 20  s written.**    
0920: 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
0930: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
0940: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
0950: 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  g of the current
0960: 0a 2a 2a 20 20 20 20 20 74 72 61 6e 73 61 63 74  .**     transact
0970: 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 33 29 20  ion..** .** (3) 
0980: 57 72 69 74 65 73 20 74 6f 20 74 68 65 20 64 61  Writes to the da
0990: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
09a0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
09b0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  ple of the page 
09c0: 73 69 7a 65 0a 2a 2a 20 20 20 20 20 69 6e 20 6c  size.**     in l
09d0: 65 6e 67 74 68 20 61 6e 64 20 61 72 65 20 61 6c  ength and are al
09e0: 69 67 6e 65 64 20 74 6f 20 61 20 70 61 67 65 20  igned to a page 
09f0: 62 6f 75 6e 64 61 72 79 2e 0a 2a 2a 20 0a 2a 2a  boundary..** .**
0a00: 20 28 34 29 20 52 65 61 64 73 20 66 72 6f 6d 20   (4) Reads from 
0a10: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
0a20: 65 20 61 72 65 20 65 69 74 68 65 72 20 61 6c 69  e are either ali
0a30: 67 6e 65 64 20 6f 6e 20 61 20 70 61 67 65 20 62  gned on a page b
0a40: 6f 75 6e 64 61 72 79 20 61 6e 64 0a 2a 2a 20 20  oundary and.**  
0a50: 20 20 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75     an integer mu
0a60: 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
0a70: 67 65 20 73 69 7a 65 20 69 6e 20 6c 65 6e 67 74  ge size in lengt
0a80: 68 20 6f 72 20 61 72 65 20 74 61 6b 65 6e 20 66  h or are taken f
0a90: 72 6f 6d 20 74 68 65 0a 2a 2a 20 20 20 20 20 66  rom the.**     f
0aa0: 69 72 73 74 20 31 30 30 20 62 79 74 65 73 20 6f  irst 100 bytes o
0ab0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
0ac0: 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 35 29 20  ile..** .** (5) 
0ad0: 41 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74 68  All writes to th
0ae0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0af0: 61 72 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72  are synced prior
0b00: 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   to the rollback
0b10: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
0b20: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2c 20 74  being deleted, t
0b30: 72 75 6e 63 61 74 65 64 2c 20 6f 72 20 7a 65 72  runcated, or zer
0b40: 6f 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 28 36 29 20  oed..** .** (6) 
0b50: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
0b60: 6e 61 6c 20 66 69 6c 65 20 69 73 20 75 73 65 64  nal file is used
0b70: 2c 20 74 68 65 6e 20 61 6c 6c 20 77 72 69 74 65  , then all write
0b80: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
0b90: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 72  e file.**     ar
0ba0: 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74  e synced prior t
0bb0: 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
0bc0: 72 6e 61 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  rnal being delet
0bd0: 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 44 65 66 69 6e  ed..** .** Defin
0be0: 69 74 69 6f 6e 3a 20 54 77 6f 20 64 61 74 61 62  ition: Two datab
0bf0: 61 73 65 73 20 28 6f 72 20 74 68 65 20 73 61 6d  ases (or the sam
0c00: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 77  e database at tw
0c10: 6f 20 70 6f 69 6e 74 73 20 69 74 20 74 69 6d 65  o points it time
0c20: 29 0a 2a 2a 20 61 72 65 20 73 61 69 64 20 74 6f  ).** are said to
0c30: 20 62 65 20 22 6c 6f 67 69 63 61 6c 6c 79 20 65   be "logically e
0c40: 71 75 69 76 61 6c 65 6e 74 22 20 69 66 20 74 68  quivalent" if th
0c50: 65 79 20 67 69 76 65 20 74 68 65 20 73 61 6d 65  ey give the same
0c60: 20 61 6e 73 77 65 72 20 74 6f 0a 2a 2a 20 61 6c   answer to.** al
0c70: 6c 20 71 75 65 72 69 65 73 2e 20 20 4e 6f 74 65  l queries.  Note
0c80: 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74   in particular t
0c90: 68 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  he the content o
0ca0: 66 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66 0a  f freelist leaf.
0cb0: 2a 2a 20 70 61 67 65 73 20 63 61 6e 20 62 65 20  ** pages can be 
0cc0: 63 68 61 6e 67 65 64 20 61 72 62 69 74 61 72 69  changed arbitari
0cd0: 6c 79 20 77 69 74 68 6f 75 74 20 65 66 66 65 63  ly without effec
0ce0: 74 69 6e 67 20 74 68 65 20 6c 6f 67 69 63 61 6c  ting the logical
0cf0: 20 65 71 75 69 76 61 6c 65 6e 63 65 0a 2a 2a 20   equivalence.** 
0d00: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
0d10: 0a 2a 2a 20 0a 2a 2a 20 28 37 29 20 41 74 20 61  .** .** (7) At a
0d20: 6e 79 20 74 69 6d 65 2c 20 69 66 20 61 6e 79 20  ny time, if any 
0d30: 73 75 62 73 65 74 2c 20 69 6e 63 6c 75 64 69 6e  subset, includin
0d40: 67 20 74 68 65 20 65 6d 70 74 79 20 73 65 74 20  g the empty set 
0d50: 61 6e 64 20 74 68 65 20 74 6f 74 61 6c 20 73 65  and the total se
0d60: 74 2c 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 65  t,.**     of the
0d70: 20 75 6e 73 79 6e 63 65 64 20 63 68 61 6e 67 65   unsynced change
0d80: 73 20 74 6f 20 61 20 72 6f 6c 6c 62 61 63 6b 20  s to a rollback 
0d90: 6a 6f 75 72 6e 61 6c 20 61 72 65 20 72 65 6d 6f  journal are remo
0da0: 76 65 64 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ved and the .** 
0db0: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 72      journal is r
0dc0: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0dd0: 72 65 73 75 6c 74 69 6e 67 20 64 61 74 61 62 61  resulting databa
0de0: 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  se file will be 
0df0: 6c 6f 67 69 63 61 6c 0a 2a 2a 20 20 20 20 20 65  logical.**     e
0e00: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
0e10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
0e20: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
0e30: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0e40: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 38 29 20 57  on..** .** (8) W
0e50: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
0e60: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
0e70: 2c 20 74 68 65 20 78 54 72 75 6e 63 61 74 65 20  , the xTruncate 
0e80: 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 56 46  method of the VF
0e90: 53 0a 2a 2a 20 20 20 20 20 69 73 20 63 61 6c 6c  S.**     is call
0ea0: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
0eb0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0ec0: 74 6f 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65  to the same size
0ed0: 20 69 74 20 77 61 73 20 61 74 0a 2a 2a 20 20 20   it was at.**   
0ee0: 20 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20    the beginning 
0ef0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0f00: 6f 6e 2e 20 20 28 49 6e 20 73 6f 6d 65 20 56 46  on.  (In some VF
0f10: 53 65 73 2c 20 74 68 65 20 78 54 72 75 6e 63 61  Ses, the xTrunca
0f20: 74 65 0a 2a 2a 20 20 20 20 20 6d 65 74 68 6f 64  te.**     method
0f30: 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 62 75 74   is a no-op, but
0f40: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 63   that does not c
0f50: 68 61 6e 67 65 20 74 68 65 20 66 61 63 74 20 74  hange the fact t
0f60: 68 65 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 2a  he SQLite will.*
0f70: 2a 20 20 20 20 20 69 6e 76 6f 6b 65 20 69 74 2e  *     invoke it.
0f80: 29 0a 2a 2a 20 0a 2a 2a 20 28 39 29 20 57 68 65  ).** .** (9) Whe
0f90: 6e 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61  never the databa
0fa0: 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 64 69 66  se file is modif
0fb0: 69 65 64 2c 20 61 74 20 6c 65 61 73 74 20 6f 6e  ied, at least on
0fc0: 65 20 62 69 74 20 69 6e 20 74 68 65 20 72 61 6e  e bit in the ran
0fd0: 67 65 0a 2a 2a 20 20 20 20 20 6f 66 20 62 79 74  ge.**     of byt
0fe0: 65 73 20 66 72 6f 6d 20 32 34 20 74 68 72 6f 75  es from 24 throu
0ff0: 67 68 20 33 39 20 69 6e 63 6c 75 73 69 76 65 20  gh 39 inclusive 
1000: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20  will be changed 
1010: 70 72 69 6f 72 20 74 6f 20 72 65 6c 65 61 73 69  prior to releasi
1020: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 45 58  ng.**     the EX
1030: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 0a 2a 2a  CLUSIVE lock..**
1040: 0a 2a 2a 20 28 31 30 29 20 54 68 65 20 70 61 74  .** (10) The pat
1050: 74 65 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20  tern of bits in 
1060: 62 79 74 65 73 20 32 34 20 74 68 72 6f 75 67 68  bytes 24 through
1070: 20 33 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65   39 shall not re
1080: 70 65 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20  peat in less.** 
1090: 20 20 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69       than one bi
10a0: 6c 6c 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f  llion transactio
10b0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41  ns..**.** (11) A
10c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
10d0: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74  s well-formed at
10e0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61   the beginning a
10f0: 6e 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  nd at the conclu
1100: 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20  sion.**      of 
1110: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
1120: 6e 2e 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e  n..**.** (12) An
1130: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1140: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
1150: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
1160: 6e 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20  n writing to.** 
1170: 20 20 20 20 20 74 68 65 20 64 61 74 61 62 61 73       the databas
1180: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31  e file..**.** (1
1190: 33 29 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b  3) A SHARED lock
11a0: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
11b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
11c0: 69 6c 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a  ile reading any.
11d0: 2a 2a 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20  **      content 
11e0: 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
11f0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 0a 2f 2a  ase file..*/../*
1200: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
1210: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
1220: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
1230: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e   off.*/.#if 0.in
1240: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
1250: 61 63 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20  ace=1;  /* True 
1260: 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e  to enable tracin
1270: 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c  g */.#define sql
1280: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
1290: 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50  printf.#define P
12a0: 41 47 45 52 54 52 41 43 45 28 58 29 20 20 20 20  AGERTRACE(X)    
12b0: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
12c0: 72 54 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65  rTrace ){ sqlite
12d0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20  3DebugPrintf X; 
12e0: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
12f0: 50 41 47 45 52 54 52 41 43 45 28 58 29 0a 23 65  PAGERTRACE(X).#e
1300: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1310: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61  following two ma
1320: 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69  cros are used wi
1330: 74 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52  thin the PAGERTR
1340: 41 43 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  ACE() macros abo
1350: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
1360: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
1370: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
1380: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
1390: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
13a0: 20 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61   struct as its a
13b0: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
13c0: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
13d0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
13e0: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
13f0: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
1400: 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20  sqlite3_file.** 
1410: 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72  struct as its ar
1420: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69  gument..*/.#defi
1430: 6e 65 20 50 41 47 45 52 49 44 28 70 29 20 28 28  ne PAGERID(p) ((
1440: 69 6e 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65  int)(p->fd)).#de
1450: 66 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49  fine FILEHANDLEI
1460: 44 28 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a  D(fd) ((int)fd).
1470: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
1480: 63 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65  cache as a whole
1490: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e   is always in on
14a0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
14b0: 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a  ng.** states:.**
14c0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f  .**   PAGER_UNLO
14d0: 43 4b 20 20 20 20 20 20 20 20 54 68 65 20 70 61  CK        The pa
14e0: 67 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ge cache is not 
14f0: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
1500: 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  g or .**        
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
1520: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
1530: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65  ase file.  There
1540: 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20   is no.**       
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1560: 64 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d  data held in mem
1570: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68  ory.  This is th
1580: 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20  e initial.**    
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a0: 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20     state..**.** 
15b0: 20 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20    PAGER_SHARED  
15c0: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
15d0: 61 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20  ache is reading 
15e0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69         Writing i
1610: 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
1620: 20 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a    There can be.*
1630: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1640: 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65          multiple
1650: 20 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69   readers accessi
1660: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
1670: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
1690: 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
16a0: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ime..**.**   PAG
16b0: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 20  ER_RESERVED     
16c0: 20 54 68 69 73 20 70 72 6f 63 65 73 73 20 68 61   This process ha
16d0: 73 20 72 65 73 65 72 76 65 64 20 74 68 65 20 64  s reserved the d
16e0: 61 74 61 62 61 73 65 20 66 6f 72 20 77 72 69 74  atabase for writ
16f0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74               but
1710: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64   has not yet mad
1720: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20  e any changes.  
1730: 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73  Only one process
1740: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1750: 20 20 20 20 20 20 20 20 20 20 61 74 20 61 20 74            at a t
1760: 69 6d 65 20 63 61 6e 20 72 65 73 65 72 76 65 20  ime can reserve 
1770: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
1780: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  he original.**  
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
17b0: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
17c0: 6d 6f 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65  modified so othe
17d0: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
17e0: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65             proce
17f0: 73 73 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62  sses may still b
1800: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e  e reading the on
1810: 2d 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20  -disk.**        
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1830: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1840: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c  .**   PAGER_EXCL
1850: 55 53 49 56 45 20 20 20 20 20 54 68 65 20 70 61  USIVE     The pa
1860: 67 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74  ge cache is writ
1870: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1880: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
1890: 20 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73             Acces
18a0: 73 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  s is exclusive. 
18b0: 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   No other proces
18c0: 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ses or.**       
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 74 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72  threads can be r
18f0: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1900: 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20  g while one.**  
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20       process is 
1930: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  writing..**.**  
1940: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
1950: 20 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d       The pager m
1960: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
1970: 74 65 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58  te from PAGER_EX
1980: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20  CLUSIVE.**      
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a0: 20 61 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79   after all dirty
19b0: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
19c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
19d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
19e0: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
19f0: 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
1a00: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
1a10: 63 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ced to.**       
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a30: 64 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72  disk. All that r
1a40: 65 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20  emains to do is 
1a50: 74 6f 20 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20  to remove or.** 
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 74 72 75 6e 63 61 74 65 20 74        truncate t
1a80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a90: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
1aa0: 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ion .**         
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
1ac0: 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e  ll be committed.
1ad0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
1ae0: 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69  cache comes up i
1af0: 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  n PAGER_UNLOCK. 
1b00: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
1b10: 61 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  a.** sqlite3Page
1b20: 72 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  rGet() occurs, t
1b30: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
1b40: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
1b50: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
1b60: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
1b70: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
1b80: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
1b90: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
1ba0: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
1bb0: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
1bc0: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
1bd0: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
1be0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1bf0: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
1c00: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
1c10: 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
1c20: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
1c30: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
1c40: 72 57 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  rWrite() can onl
1c50: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
1c60: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
1c70: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
1c80: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
1c90: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
1ca0: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
1cb0: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
1cc0: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
1cd0: 56 45 44 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52  VED.).** PAGER_R
1ce0: 45 53 45 52 56 45 44 20 6d 65 61 6e 73 20 74 68  ESERVED means th
1cf0: 61 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f  at there is an o
1d00: 70 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  pen rollback jou
1d10: 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61  rnal..** The tra
1d20: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
1d30: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
1d40: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  s before any cha
1d50: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
1d60: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1d70: 20 66 69 6c 65 2c 20 74 68 6f 75 67 68 20 77 72   file, though wr
1d80: 69 74 65 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c  ites to the roll
1d90: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
1da0: 6f 63 63 75 72 73 20 77 69 74 68 20 6a 75 73 74  occurs with just
1db0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
1dc0: 20 20 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74    After an sqlit
1dd0: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1de0: 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 50  ).** or sqlite3P
1df0: 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
1e00: 77 6f 28 29 2c 20 74 68 65 20 73 74 61 74 65 20  wo(), the state 
1e10: 63 61 6e 20 67 6f 20 62 61 63 6b 20 74 6f 20 50  can go back to P
1e20: 41 47 45 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20  AGER_SHARED,.** 
1e30: 6f 72 20 69 74 20 63 61 6e 20 73 74 61 79 20 61  or it can stay a
1e40: 74 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  t PAGER_EXCLUSIV
1e50: 45 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 65  E if we are in e
1e60: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
1e70: 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  mode..*/.#define
1e80: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
1e90: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
1ea0: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 31  ER_SHARED      1
1eb0: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48     /* same as SH
1ec0: 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  ARED_LOCK */.#de
1ed0: 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52  fine PAGER_RESER
1ee0: 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61  VED    2   /* sa
1ef0: 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c  me as RESERVED_L
1f00: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1f10: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20  AGER_EXCLUSIVE  
1f20: 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   4   /* same as 
1f30: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a  EXCLUSIVE_LOCK *
1f40: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1f50: 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f  SYNCED      5../
1f60: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
1f70: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
1f80: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
1f90: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
1fa0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
1fb0: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
1fc0: 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c  EC1(P,D,N,X,E) \
1fd0: 0a 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64  .    if( P->xCod
1fe0: 65 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28  ec && P->xCodec(
1ff0: 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29  P->pCodec,D,N,X)
2000: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65  ==0 ){ E; }.# de
2010: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
2020: 4e 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69  N,X,E,O) \.    i
2030: 66 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20  f( P->xCodec==0 
2040: 29 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d  ){ O=(char*)D; }
2050: 65 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28  else \.    if( (
2060: 4f 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f  O=(char*)(P->xCo
2070: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c  dec(P->pCodec,D,
2080: 4e 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20  N,X)))==0 ){ E; 
2090: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
20a0: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c   CODEC1(P,D,N,X,
20b0: 45 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  E)   /* NO-OP */
20c0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
20d0: 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d  (P,D,N,X,E,O) O=
20e0: 28 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a  (char*)D.#endif.
20f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
2100: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f  um allowed secto
2110: 72 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49  r size. 64KiB. I
2120: 66 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a  f the xSectorsiz
2130: 65 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72  e() method .** r
2140: 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c  eturns a value l
2150: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c  arger than this,
2160: 20 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52   then MAX_SECTOR
2170: 5f 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e  _SIZE is used in
2180: 73 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63  stead..** This c
2190: 6f 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79  ould conceivably
21a0: 20 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f   cause corruptio
21b0: 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f  n following a po
21c0: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a  wer failure on.*
21d0: 2a 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e  * such a system.
21e0: 20 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74   This is current
21f0: 6c 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74  ly an undocument
2200: 65 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65  ed limit..*/.#de
2210: 66 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f  fine MAX_SECTOR_
2220: 53 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a  SIZE 0x10000../*
2230: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
2240: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2250: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
2260: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
2270: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
2280: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
2290: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
22a0: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
22b0: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
22c0: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
22d0: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
22e0: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
22f0: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
2300: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
2310: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
2320: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
2330: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
2340: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
2350: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
2360: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
2370: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
2380: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
2390: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
23a0: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
23b0: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
23c0: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
23d0: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
23e0: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
23f0: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
2400: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
2410: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
2420: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
2430: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
2440: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
2450: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
2460: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
2470: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
2480: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
2490: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
24a0: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
24b0: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
24c0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
24d0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
24e0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
24f0: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
2500: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
2510: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
2520: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
2530: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
2540: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
2550: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
2560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2570: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
2580: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
2590: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
25a0: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
25b0: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
25c0: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25e0: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
25f0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
2600: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
2610: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
2620: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2630: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
2640: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
2650: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e  };../*.** A open
2660: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61   page cache is a
2670: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
2680: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
2690: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 65 72 72  cture..**.** err
26a0: 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67  Code.**.**   Pag
26b0: 65 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20 62  er.errCode may b
26c0: 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  e set to SQLITE_
26d0: 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f  IOERR, SQLITE_CO
26e0: 52 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 20 20 6f  RRUPT, or.**   o
26f0: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f  r SQLITE_FULL. O
2700: 6e 63 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66  nce one of the f
2710: 69 72 73 74 20 74 68 72 65 65 20 65 72 72 6f 72  irst three error
2720: 73 20 6f 63 63 75 72 73 2c 20 69 74 20 70 65 72  s occurs, it per
2730: 73 69 73 74 73 0a 2a 2a 20 20 20 61 6e 64 20 69  sists.**   and i
2740: 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 74 68  s returned as th
2750: 65 20 72 65 73 75 6c 74 20 6f 66 20 65 76 65 72  e result of ever
2760: 79 20 6d 61 6a 6f 72 20 70 61 67 65 72 20 41 50  y major pager AP
2770: 49 20 63 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20  I call.  The.** 
2780: 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 72 65    SQLITE_FULL re
2790: 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 6c 69  turn code is sli
27a0: 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74 2e  ghtly different.
27b0: 20 49 74 20 70 65 72 73 69 73 74 73 20 6f 6e 6c   It persists onl
27c0: 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 20  y until the.**  
27d0: 20 6e 65 78 74 20 73 75 63 63 65 73 73 66 75 6c   next successful
27e0: 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65 72   rollback is per
27f0: 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 70 61  formed on the pa
2800: 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c  ger cache. Also,
2810: 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 46 55 4c  .**   SQLITE_FUL
2820: 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63  L does not affec
2830: 74 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  t the sqlite3Pag
2840: 65 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69  erGet() and sqli
2850: 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  te3PagerLookup()
2860: 0a 2a 2a 20 20 20 41 50 49 73 2c 20 74 68 65 79  .**   APIs, they
2870: 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73   may still be us
2880: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
2890: 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 56 61 6c  .**.** dbSizeVal
28a0: 69 64 2c 20 64 62 53 69 7a 65 2c 20 64 62 4f 72  id, dbSize, dbOr
28b0: 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53 69  igSize, dbFileSi
28c0: 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 4d 61 6e 61 67  ze.**.**   Manag
28d0: 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ing the size of 
28e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28f0: 65 20 69 6e 20 70 61 67 65 73 20 69 73 20 61 20  e in pages is a 
2900: 6c 69 74 74 6c 65 20 63 6f 6d 70 6c 69 63 61 74  little complicat
2910: 65 64 2e 0a 2a 2a 20 20 20 54 68 65 20 76 61 72  ed..**   The var
2920: 69 61 62 6c 65 20 50 61 67 65 72 2e 64 62 53 69  iable Pager.dbSi
2930: 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ze contains the 
2940: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2950: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
2960: 65 0a 2a 2a 20 20 20 69 6d 61 67 65 20 63 75 72  e.**   image cur
2970: 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 2e  rently contains.
2980: 20 41 73 20 74 68 65 20 64 61 74 61 62 61 73 65   As the database
2990: 20 69 6d 61 67 65 20 67 72 6f 77 73 20 6f 72 20   image grows or 
29a0: 73 68 72 69 6e 6b 73 20 74 68 69 73 0a 2a 2a 20  shrinks this.** 
29b0: 20 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 70    variable is up
29c0: 64 61 74 65 64 2e 20 54 68 65 20 76 61 72 69 61  dated. The varia
29d0: 62 6c 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65  ble Pager.dbFile
29e0: 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Size contains th
29f0: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 6f 66  e number.**   of
2a00: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
2a10: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69  tabase file. Thi
2a20: 73 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65  s may be differe
2a30: 6e 74 20 66 72 6f 6d 20 50 61 67 65 72 2e 64 62  nt from Pager.db
2a40: 53 69 7a 65 0a 2a 2a 20 20 20 69 66 20 73 6f 6d  Size.**   if som
2a50: 65 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  e pages have bee
2a60: 6e 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  n appended to th
2a70: 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
2a80: 20 62 75 74 20 6e 6f 74 20 79 65 74 20 77 72 69   but not yet wri
2a90: 74 74 65 6e 0a 2a 2a 20 20 20 6f 75 74 20 66 72  tten.**   out fr
2aa0: 6f 6d 20 74 68 65 20 63 61 63 68 65 20 74 6f 20  om the cache to 
2ab0: 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20  the actual file 
2ac0: 6f 6e 20 64 69 73 6b 2e 20 4f 72 20 69 66 20 74  on disk. Or if t
2ad0: 68 65 20 69 6d 61 67 65 20 68 61 73 20 62 65 65  he image has bee
2ae0: 6e 0a 2a 2a 20 20 20 74 72 75 6e 63 61 74 65 64  n.**   truncated
2af0: 20 62 79 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   by an increment
2b00: 61 6c 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74  al-vacuum operat
2b10: 69 6f 6e 2e 20 54 68 65 20 50 61 67 65 72 2e 64  ion. The Pager.d
2b20: 62 4f 72 69 67 53 69 7a 65 20 76 61 72 69 61 62  bOrigSize variab
2b30: 6c 65 0a 2a 2a 20 20 20 63 6f 6e 74 61 69 6e 73  le.**   contains
2b40: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
2b50: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
2b60: 62 61 73 65 20 69 6d 61 67 65 20 77 68 65 6e 20  base image when 
2b70: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20  the current.**  
2b80: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
2b90: 20 6f 70 65 6e 65 64 2e 20 54 68 65 20 63 6f 6e   opened. The con
2ba0: 74 65 6e 74 73 20 6f 66 20 61 6c 6c 20 74 68 72  tents of all thr
2bb0: 65 65 20 6f 66 20 74 68 65 73 65 20 76 61 72 69  ee of these vari
2bc0: 61 62 6c 65 73 20 69 73 0a 2a 2a 20 20 20 6f 6e  ables is.**   on
2bd0: 6c 79 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  ly guaranteed to
2be0: 20 62 65 20 63 6f 72 72 65 63 74 20 69 66 20 74   be correct if t
2bf0: 68 65 20 62 6f 6f 6c 65 61 6e 20 50 61 67 65 72  he boolean Pager
2c00: 2e 64 62 53 69 7a 65 56 61 6c 69 64 20 69 73 20  .dbSizeValid is 
2c10: 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 4f  true..**.**   TO
2c20: 44 4f 3a 20 55 6e 64 65 72 20 77 68 61 74 20 63  DO: Under what c
2c30: 6f 6e 64 69 74 69 6f 6e 73 20 69 73 20 64 62 53  onditions is dbS
2c40: 69 7a 65 56 61 6c 69 64 20 73 65 74 3f 20 43 6c  izeValid set? Cl
2c50: 65 61 72 65 64 3f 0a 2a 2a 0a 2a 2a 20 63 68 61  eared?.**.** cha
2c60: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a  ngeCountDone.**.
2c70: 2a 2a 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61  **   This boolea
2c80: 6e 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  n variable is us
2c90: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
2ca0: 74 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d  that the change-
2cb0: 63 6f 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74  counter .**   (t
2cc0: 68 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72  he 4-byte header
2cd0: 20 66 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f   field at byte o
2ce0: 66 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20  ffset 24 of the 
2cf0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 69  database file) i
2d00: 73 20 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61  s .**   not upda
2d10: 74 65 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74  ted more often t
2d20: 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a  han necessary. .
2d30: 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65  **.**   It is se
2d40: 74 20 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74  t to true when t
2d50: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2d60: 72 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  r field is updat
2d70: 65 64 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20  ed, which .**   
2d80: 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
2d90: 69 66 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  if an exclusive 
2da0: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20  lock is held on 
2db0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2dc0: 65 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c  e..**   It is cl
2dd0: 65 61 72 65 64 20 28 73 65 74 20 74 6f 20 66 61  eared (set to fa
2de0: 6c 73 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e  lse) whenever an
2df0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
2e00: 69 73 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75  is .**   relinqu
2e10: 69 73 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74  ished on the dat
2e20: 61 62 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68  abase file. Each
2e30: 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74   time a transact
2e40: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
2e50: 2c 0a 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67  ,.**   The chang
2e60: 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
2e70: 69 73 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66  is inspected. If
2e80: 20 69 74 20 69 73 20 74 72 75 65 2c 20 74 68 65   it is true, the
2e90: 20 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70   work of.**   up
2ea0: 64 61 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67  dating the chang
2eb0: 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69  e-counter is omi
2ec0: 74 74 65 64 20 66 6f 72 20 74 68 65 20 63 75 72  tted for the cur
2ed0: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
2ee0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d  ..**.**   This m
2ef0: 65 63 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74  echanism means t
2f00: 68 61 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67  hat when running
2f10: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
2f20: 64 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  de, a connection
2f30: 20 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79   .**   need only
2f40: 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
2f50: 67 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c  ge-counter once,
2f60: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74   for the first t
2f70: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2f80: 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
2f90: 20 64 62 4d 6f 64 69 66 69 65 64 0a 2a 2a 0a 2a   dbModified.**.*
2fa0: 2a 20 20 20 54 68 65 20 64 62 4d 6f 64 69 66 69  *   The dbModifi
2fb0: 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 77  ed flag is set w
2fc0: 68 65 6e 65 76 65 72 20 61 20 64 61 74 61 62 61  henever a databa
2fd0: 73 65 20 70 61 67 65 20 69 73 20 64 69 72 74 69  se page is dirti
2fe0: 65 64 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63  ed..**   It is c
2ff0: 6c 65 61 72 65 64 20 61 74 20 74 68 65 20 65 6e  leared at the en
3000: 64 20 6f 66 20 65 61 63 68 20 74 72 61 6e 73 61  d of each transa
3010: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49  ction..**.**   I
3020: 74 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 63  t is used when c
3030: 6f 6d 6d 69 74 74 69 6e 67 20 6f 72 20 6f 74 68  ommitting or oth
3040: 65 72 77 69 73 65 20 65 6e 64 69 6e 67 20 61 20  erwise ending a 
3050: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 0a  transaction. If.
3060: 2a 2a 20 20 20 74 68 65 20 64 62 4d 6f 64 69 66  **   the dbModif
3070: 69 65 64 20 66 6c 61 67 20 69 73 20 63 6c 65 61  ied flag is clea
3080: 72 20 74 68 65 6e 20 6c 65 73 73 20 77 6f 72 6b  r then less work
3090: 20 68 61 73 20 74 6f 20 62 65 20 64 6f 6e 65 2e   has to be done.
30a0: 0a 2a 2a 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 53 74  .**.** journalSt
30b0: 61 72 74 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68  arted.**.**   Th
30c0: 69 73 20 66 6c 61 67 20 69 73 20 73 65 74 20 77  is flag is set w
30d0: 68 65 6e 65 76 65 72 20 74 68 65 20 74 68 65 20  henever the the 
30e0: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20  main journal is 
30f0: 6f 70 65 6e 65 64 20 61 6e 64 0a 2a 2a 20 20 20  opened and.**   
3100: 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 0a 2a  initialized.**.*
3110: 2a 20 20 20 54 68 65 20 70 6f 69 6e 74 20 6f 66  *   The point of
3120: 20 74 68 69 73 20 66 6c 61 67 20 69 73 20 74 68   this flag is th
3130: 61 74 20 69 74 20 6d 75 73 74 20 62 65 20 73 65  at it must be se
3140: 74 20 61 66 74 65 72 20 74 68 65 20 0a 2a 2a 20  t after the .** 
3150: 20 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20    first journal 
3160: 68 65 61 64 65 72 20 69 6e 20 61 20 6a 6f 75 72  header in a jour
3170: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65  nal file has bee
3180: 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  n synced to disk
3190: 2e 0a 2a 2a 20 20 20 41 66 74 65 72 20 74 68 69  ..**   After thi
31a0: 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20  s has happened, 
31b0: 6e 65 77 20 70 61 67 65 73 20 61 70 70 65 6e 64  new pages append
31c0: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
31d0: 73 65 20 0a 2a 2a 20 20 20 64 6f 20 6e 6f 74 20  se .**   do not 
31e0: 6e 65 65 64 20 74 68 65 20 50 47 48 44 52 5f 4e  need the PGHDR_N
31f0: 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 73 65  EED_SYNC flag se
3200: 74 2c 20 61 73 20 74 68 65 79 20 64 6f 20 6e 6f  t, as they do no
3210: 74 20 6e 65 65 64 0a 2a 2a 20 20 20 74 6f 20 77  t need.**   to w
3220: 61 69 74 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61  ait for a journa
3230: 6c 20 73 79 6e 63 20 62 65 66 6f 72 65 20 74 68  l sync before th
3240: 65 79 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ey can be writte
3250: 6e 20 6f 75 74 20 74 6f 0a 2a 2a 20 20 20 74 68  n out to.**   th
3260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
3270: 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 20 70 61  (see function pa
3280: 67 65 72 5f 77 72 69 74 65 28 29 29 2e 0a 2a 2a  ger_write())..**
3290: 20 20 20 0a 2a 2a 20 73 65 74 4d 61 73 74 65 72     .** setMaster
32a0: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61  .**.**   This va
32b0: 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
32c0: 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
32d0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
32e0: 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20   file name.**   
32f0: 28 69 66 20 61 6e 79 29 20 69 73 20 6f 6e 6c 79  (if any) is only
3300: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
3310: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
3320: 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65  nce..**.**   Whe
3330: 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
3340: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20  ransaction, the 
3350: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
3360: 69 6c 65 20 6e 61 6d 65 20 28 69 66 20 61 6e 79  ile name (if any
3370: 29 0a 2a 2a 20 20 20 6d 61 79 20 62 65 20 77 72  ).**   may be wr
3380: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
3390: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 69 6c  ournal file whil
33a0: 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 73  e the pager is s
33b0: 74 69 6c 6c 20 69 6e 0a 2a 2a 20 20 20 50 41 47  till in.**   PAG
33c0: 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74  ER_RESERVED stat
33d0: 65 20 28 73 65 65 20 43 6f 6d 6d 69 74 50 68 61  e (see CommitPha
33e0: 73 65 4f 6e 65 28 29 20 66 6f 72 20 74 68 65 20  seOne() for the 
33f0: 61 63 74 69 6f 6e 29 2e 20 49 74 0a 2a 2a 20 20  action). It.**  
3400: 20 74 68 65 6e 20 61 74 74 65 6d 70 74 73 20 74   then attempts t
3410: 6f 20 75 70 67 72 61 64 65 20 74 6f 20 61 6e 20  o upgrade to an 
3420: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20  exclusive lock. 
3430: 49 66 20 74 68 69 73 20 61 74 74 65 6d 70 74 0a  If this attempt.
3440: 2a 2a 20 20 20 66 61 69 6c 73 2c 20 74 68 65 6e  **   fails, then
3450: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6d 61 79   SQLITE_BUSY may
3460: 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20   be returned to 
3470: 74 68 65 20 75 73 65 72 20 61 6e 64 20 74 68 65  the user and the
3480: 20 75 73 65 72 0a 2a 2a 20 20 20 6d 61 79 20 61   user.**   may a
3490: 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d 6d 69 74  ttempt to commit
34a0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
34b0: 20 61 67 61 69 6e 20 6c 61 74 65 72 20 28 63 61   again later (ca
34c0: 6c 6c 69 6e 67 0a 2a 2a 20 20 20 43 6f 6d 6d 69  lling.**   Commi
34d0: 74 50 68 61 73 65 4f 6e 65 28 29 20 61 67 61 69  tPhaseOne() agai
34e0: 6e 29 2e 20 54 68 69 73 20 66 6c 61 67 20 69 73  n). This flag is
34f0: 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
3500: 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 20 20 6d  that the .**   m
3510: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
3520: 6d 65 20 69 73 20 6f 6e 6c 79 20 77 72 69 74 74  me is only writt
3530: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
3540: 6c 20 66 69 6c 65 20 74 68 65 20 66 69 72 73 74  l file the first
3550: 0a 2a 2a 20 20 20 74 69 6d 65 20 43 6f 6d 6d 69  .**   time Commi
3560: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
3570: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e  alled..**.** doN
3580: 6f 74 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 57  otSync.**.**   W
3590: 68 65 6e 20 65 6e 61 62 6c 65 64 2c 20 63 61 63  hen enabled, cac
35a0: 68 65 20 73 70 69 6c 6c 73 20 61 72 65 20 70 72  he spills are pr
35b0: 6f 68 69 62 69 74 65 64 20 61 6e 64 20 74 68 65  ohibited and the
35c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
35d0: 6e 6e 6f 74 0a 2a 2a 20 20 20 62 65 20 73 79 6e  nnot.**   be syn
35e0: 63 65 64 2e 20 20 54 68 69 73 20 76 61 72 69 61  ced.  This varia
35f0: 62 6c 65 20 69 73 20 73 65 74 20 61 6e 64 20 63  ble is set and c
3600: 6c 65 61 72 65 64 20 62 79 20 73 71 6c 69 74 65  leared by sqlite
3610: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 0a 2a  3PagerWrite() .*
3620: 2a 20 20 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  *   in order to 
3630: 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61  prevent a journa
3640: 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61 70 70  l sync from happ
3650: 65 6e 69 6e 67 20 69 6e 20 62 65 74 77 65 65 6e  ening in between
3660: 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61   the.**   journa
3670: 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61 67  lling of two pag
3680: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
3690: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 6e 65 65  ector..**.** nee
36a0: 64 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 54 4f  dSync.**.**   TO
36b0: 44 4f 3a 20 49 74 20 6d 69 67 68 74 20 62 65 20  DO: It might be 
36c0: 65 61 73 69 65 72 20 74 6f 20 73 65 74 20 74 68  easier to set th
36d0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 6e 20 77  is variable in w
36e0: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29  riteJournalHdr()
36f0: 0a 2a 2a 20 20 20 61 6e 64 20 77 72 69 74 65 4d  .**   and writeM
3700: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 6f  asterJournal() o
3710: 6e 6c 79 2e 20 43 68 61 6e 67 65 20 69 74 73 20  nly. Change its 
3720: 6d 65 61 6e 69 6e 67 20 74 6f 20 22 75 6e 73 79  meaning to "unsy
3730: 6e 63 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 68  nced data.**   h
3740: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
3750: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 22 2e  to the journal".
3760: 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e 4d 65 6d  .**.** subjInMem
3770: 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  ory.**.**   This
3780: 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61   is a boolean va
3790: 72 69 61 62 6c 65 2e 20 49 66 20 74 72 75 65 2c  riable. If true,
37a0: 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72   then any requir
37b0: 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  ed sub-journal.*
37c0: 2a 20 20 20 69 73 20 6f 70 65 6e 65 64 20 61 73  *   is opened as
37d0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
37e0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 66  urnal file. If f
37f0: 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 2d 6d 65  alse, then in-me
3800: 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62 2d 6a 6f  mory.**   sub-jo
3810: 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e 6c 79 20  urnals are only 
3820: 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f  used for in-memo
3830: 72 79 20 70 61 67 65 72 20 66 69 6c 65 73 2e 0a  ry pager files..
3840: 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20  */.struct Pager 
3850: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
3860: 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20  *pVfs;          
3870: 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20  /* OS functions 
3880: 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f  to use for IO */
3890: 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d  .  u8 exclusiveM
38a0: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ode;           /
38b0: 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20  * Boolean. True 
38c0: 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  if locking_mode=
38d0: 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20  =EXCLUSIVE */.  
38e0: 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20  u8 journalMode; 
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
3900: 6e 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a  n of the PAGER_J
3910: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76 61 6c  OURNALMODE_* val
3920: 75 65 73 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a  ues */.  u8 useJ
3930: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
3940: 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f       /* Use a ro
3950: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f  llback journal o
3960: 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
3970: 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20   u8 noReadlock; 
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3990: 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f  Do not bother to
39a0: 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b   obtain readlock
39b0: 73 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63  s */.  u8 noSync
39c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
39d0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e     /* Do not syn
39e0: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66  c the journal if
39f0: 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75   true */.  u8 fu
3a00: 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  llSync;         
3a10: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74         /* Do ext
3a20: 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20  ra syncs of the 
3a30: 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75  journal for robu
3a40: 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73  stness */.  u8 s
3a50: 79 6e 63 5f 66 6c 61 67 73 3b 20 20 20 20 20 20  ync_flags;      
3a60: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
3a70: 66 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  f SYNC_NORMAL or
3a80: 20 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20 20   SYNC_FULL */.  
3a90: 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20  u8 tempFile;    
3aa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
3ab0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65  Filename is a te
3ac0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a  mporary file */.
3ad0: 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20    u8 readOnly;  
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3af0: 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64   True for a read
3b00: 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
3b10: 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20  /.  u8 memDb;   
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b30: 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62  /* True to inhib
3b40: 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20  it all file I/O 
3b50: 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  */..  /* The fol
3b60: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e  lowing block con
3b70: 74 61 69 6e 73 20 74 68 6f 73 65 20 63 6c 61 73  tains those clas
3b80: 73 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 61  s members that a
3b90: 72 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20  re dynamically. 
3ba0: 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 64 75 72   ** modified dur
3bb0: 69 6e 67 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61  ing normal opera
3bc0: 74 69 6f 6e 73 2e 20 54 68 65 20 6f 74 68 65 72  tions. The other
3bd0: 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68   variables in th
3be0: 69 73 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  is structure.  *
3bf0: 2a 20 61 72 65 20 65 69 74 68 65 72 20 63 6f 6e  * are either con
3c00: 73 74 61 6e 74 20 74 68 72 6f 75 67 68 6f 75 74  stant throughout
3c10: 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66   the lifetime of
3c20: 20 74 68 65 20 70 61 67 65 72 2c 20 6f 72 20 65   the pager, or e
3c30: 6c 73 65 0a 20 20 2a 2a 20 75 73 65 64 20 74 6f  lse.  ** used to
3c40: 20 73 74 6f 72 65 20 63 6f 6e 66 69 67 75 72 61   store configura
3c50: 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 20  tion parameters 
3c60: 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65 20  that affect the 
3c70: 77 61 79 20 74 68 65 20 70 61 67 65 72 20 0a 20  way the pager . 
3c80: 20 2a 2a 20 6f 70 65 72 61 74 65 73 2e 0a 20 20   ** operates..  
3c90: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 27 73 74 61  **.  ** The 'sta
3ca0: 74 65 27 20 76 61 72 69 61 62 6c 65 20 69 73 20  te' variable is 
3cb0: 64 65 73 63 72 69 62 65 64 20 69 6e 20 6d 6f 72  described in mor
3cc0: 65 20 64 65 74 61 69 6c 20 61 6c 6f 6e 67 20 77  e detail along w
3cd0: 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 64 65 73  ith the.  ** des
3ce0: 63 72 69 70 74 69 6f 6e 73 20 6f 66 20 74 68 65  criptions of the
3cf0: 20 76 61 6c 75 65 73 20 69 74 20 6d 61 79 20 74   values it may t
3d00: 61 6b 65 20 2d 20 50 41 47 45 52 5f 55 4e 4c 4f  ake - PAGER_UNLO
3d10: 43 4b 20 65 74 63 2e 20 4d 61 6e 79 20 6f 66 20  CK etc. Many of 
3d20: 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 76  the.  ** other v
3d30: 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 69 73  ariables in this
3d40: 20 62 6c 6f 63 6b 20 61 72 65 20 64 65 73 63 72   block are descr
3d50: 69 62 65 64 20 69 6e 20 74 68 65 20 63 6f 6d 6d  ibed in the comm
3d60: 65 6e 74 20 64 69 72 65 63 74 6c 79 20 0a 20 20  ent directly .  
3d70: 2a 2a 20 61 62 6f 76 65 20 74 68 69 73 20 63 6c  ** above this cl
3d80: 61 73 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a  ass definition..
3d90: 20 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b    */.  u8 state;
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3db0: 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f     /* PAGER_UNLO
3dc0: 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45  CK, _SHARED, _RE
3dd0: 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a  SERVED, etc. */.
3de0: 20 20 75 38 20 64 62 4d 6f 64 69 66 69 65 64 3b    u8 dbModified;
3df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3e00: 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 61   True if there a
3e10: 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74  re any changes t
3e20: 6f 20 74 68 65 20 44 62 20 2a 2f 0a 20 20 75 38  o the Db */.  u8
3e30: 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20   needSync;      
3e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3e50: 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20  e if an fsync() 
3e60: 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65  is needed on the
3e70: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38   journal */.  u8
3e80: 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b   journalStarted;
3e90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3ea0: 65 20 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a  e if header of j
3eb0: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
3ec0: 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43   */.  u8 changeC
3ed0: 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20  ountDone;       
3ee0: 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69    /* Set after i
3ef0: 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
3f00: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a  change-counter *
3f10: 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72  /.  u8 setMaster
3f20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3f30: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a  /* True if a m-j
3f40: 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77   name has been w
3f50: 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a  ritten to jrnl *
3f60: 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63  /.  u8 doNotSync
3f70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3f80: 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c  /* Boolean. Whil
3f90: 65 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73  e true, do not s
3fa0: 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 2a  pill the cache *
3fb0: 2f 0a 20 20 75 38 20 64 62 53 69 7a 65 56 61 6c  /.  u8 dbSizeVal
3fc0: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
3fd0: 2f 2a 20 53 65 74 20 77 68 65 6e 20 64 62 53 69  /* Set when dbSi
3fe0: 7a 65 20 69 73 20 63 6f 72 72 65 63 74 20 2a 2f  ze is correct */
3ff0: 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f  .  u8 subjInMemo
4000: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ry;            /
4010: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e  * True to use in
4020: 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72  -memory sub-jour
4030: 6e 61 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  nals */.  Pgno d
4040: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
4050: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4060: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
4070: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67  database */.  Pg
4080: 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20  no dbOrigSize;  
4090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53            /* dbS
40a0: 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63  ize before the c
40b0: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
40c0: 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46  on */.  Pgno dbF
40d0: 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ileSize;        
40e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
40f0: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
4100: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
4110: 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20   int errCode;   
4120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4130: 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b  One of several k
4140: 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a  inds of errors *
4150: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
4160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4170: 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c  /* Pages journal
4180: 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20 6a  led since last j
4190: 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20  -header written 
41a0: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e  */.  u32 cksumIn
41b0: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
41c0: 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d   /* Quasi-random
41d0: 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20   value added to 
41e0: 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a  every checksum *
41f0: 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63 3b  /.  u32 nSubRec;
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4210: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  /* Number of rec
4220: 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ords written to 
4230: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  sub-journal */. 
4240: 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72   Bitvec *pInJour
4250: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nal;         /* 
4260: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
4270: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
4280: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
4290: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
42a0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
42b0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
42c0: 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  or database */. 
42d0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a   sqlite3_file *j
42e0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd;          /* 
42f0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
4300: 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  for main journal
4310: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
4320: 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20  le *sjfd;       
4330: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
4340: 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75  ptor for sub-jou
4350: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  rnal */.  i64 jo
4360: 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20  urnalOff;       
4370: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
4380: 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e   write offset in
4390: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
43a0: 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  e */.  i64 journ
43b0: 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20  alHdr;          
43c0: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
43d0: 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f  t to previous jo
43e0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
43f0: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a    i64 journalSiz
4400: 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a  eLimit;       /*
4410: 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20   Size limit for 
4420: 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e  persistent journ
4430: 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 50 61  al files */.  Pa
4440: 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 53  gerSavepoint *aS
4450: 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72  avepoint; /* Arr
4460: 61 79 20 6f 66 20 61 63 74 69 76 65 20 73 61 76  ay of active sav
4470: 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  epoints */.  int
4480: 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20   nSavepoint;    
4490: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
44a0: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
44b0: 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a  n aSavepoint[] *
44c0: 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65 56  /.  char dbFileV
44d0: 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20 20  ers[16];        
44e0: 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65  /* Changes whene
44f0: 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  ver database fil
4500: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75  e changes */.  u
4510: 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20  32 sectorSize;  
4520: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
4530: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
4540: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
4550: 6b 20 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78 74  k */..  u16 nExt
4560: 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ra;             
4570: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
4580: 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61  many bytes to ea
4590: 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
45a0: 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73 65  e */.  i16 nRese
45b0: 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
45c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
45d0: 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74 20  unused bytes at 
45e0: 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67 65  end of each page
45f0: 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c 61   */.  u32 vfsFla
4600: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
4610: 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 73    /* Flags for s
4620: 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
4630: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  () */.  int page
4640: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
4650: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4660: 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65   bytes in a page
4670: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e   */.  Pgno mxPgn
4680: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
4690: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c    /* Maximum all
46a0: 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65  owed size of the
46b0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
46c0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
46d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
46e0: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
46f0: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  se file */.  cha
4700: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
4710: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
4720: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
4730: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  file */.  int (*
4740: 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f  xBusyHandler)(vo
4750: 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f  id*); /* Functio
4760: 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20 62  n to call when b
4770: 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  usy */.  void *p
4780: 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 20  BusyHandlerArg; 
4790: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
47a0: 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78 42 75  argument for xBu
47b0: 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 23 69 66  syHandler */.#if
47c0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
47d0: 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73    int nHit, nMis
47e0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
47f0: 20 43 61 63 68 65 20 68 69 74 73 20 61 6e 64 20   Cache hits and 
4800: 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  missing */.  int
4810: 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b 20   nRead, nWrite; 
4820: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
4830: 62 61 73 65 20 70 61 67 65 73 20 72 65 61 64 2f  base pages read/
4840: 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69  written */.#endi
4850: 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  f.  void (*xRein
4860: 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20  iter)(DbPage*); 
4870: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
4880: 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64  tine when reload
4890: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66  ing pages */.#if
48a0: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
48b0: 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ODEC.  void *(*x
48c0: 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
48d0: 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a  d*,Pgno,int); /*
48e0: 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f   Routine for en/
48f0: 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f  decoding data */
4900: 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
4910: 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c  SizeChng)(void*,
4920: 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74  int,int); /* Not
4930: 69 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65  ify of page size
4940: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f   changes */.  vo
4950: 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29  id (*xCodecFree)
4960: 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20  (void*);        
4970: 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74       /* Destruct
4980: 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63  or for the codec
4990: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64   */.  void *pCod
49a0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
49b0: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
49c0: 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e  ent to xCodec...
49d0: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64   methods */.#end
49e0: 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53  if.  char *pTmpS
49f0: 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
4a00: 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   /* Pager.pageSi
4a10: 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
4a20: 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f  e for tmp use */
4a30: 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63  .  PCache *pPCac
4a40: 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  he;            /
4a50: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
4a60: 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a  e cache object *
4a70: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  /.  sqlite3_back
4a80: 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20  up *pBackup;    
4a90: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69  /* Pointer to li
4aa0: 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61  st of ongoing ba
4ab0: 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a  ckup processes *
4ac0: 2f 0a 20 20 4c 6f 67 20 2a 70 4c 6f 67 3b 20 20  /.  Log *pLog;  
4ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ae0: 2f 2a 20 4c 6f 67 20 75 73 65 64 20 62 79 20 22  /* Log used by "
4af0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
4b00: 22 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  " */.};../*.** T
4b10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
4b20: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f  bal variables ho
4b30: 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  ld counters used
4b40: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
4b50: 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20  purposes only.  
4b60: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
4b70: 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a  do not exist in.
4b80: 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67  ** a non-testing
4b90: 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76   build.  These v
4ba0: 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74  ariables are not
4bb0: 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f   thread-safe..*/
4bc0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
4bd0: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
4be0: 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
4bf0: 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  nt = 0;    /* Nu
4c00: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67  mber of full pag
4c10: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20  es read from DB 
4c20: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
4c30: 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
4c40: 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  nt = 0;   /* Num
4c50: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
4c60: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20  s written to DB 
4c70: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
4c80: 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
4c90: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
4ca0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69  ber of pages wri
4cb0: 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  tten to journal 
4cc0: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45  */.# define PAGE
4cd0: 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23  R_INCR(v)  v++.#
4ce0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41  else.# define PA
4cf0: 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64  GER_INCR(v).#end
4d00: 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72  if..../*.** Jour
4d10: 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20  nal files begin 
4d20: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
4d30: 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e  ng magic string.
4d40: 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61    The data.** wa
4d50: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
4d60: 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74  /dev/random.  It
4d70: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73   is used only as
4d80: 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e   a sanity check.
4d90: 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72  .**.** Since ver
4da0: 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20  sion 2.8.0, the 
4db0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
4dc0: 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e  ontains addition
4dd0: 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65  al sanity.** che
4de0: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
4df0: 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72  n.  If the power
4e00: 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65   fails while the
4e10: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
4e20: 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65  g.** written, se
4e30: 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67  mi-random garbag
4e40: 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70  e data might app
4e50: 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ear in the journ
4e60: 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72  al.** file after
4e70: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
4e80: 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d  ed.  If an attem
4e90: 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a  pt is then made.
4ea0: 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a  ** to roll the j
4eb0: 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65  ournal back, the
4ec0: 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20   database could 
4ed0: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54  be corrupted.  T
4ee0: 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  he additional.**
4ef0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
4f00: 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65   data is an atte
4f10: 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20  mpt to discover 
4f20: 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74  the garbage in t
4f30: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  he.** journal an
4f40: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a  d ignore it..**.
4f50: 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68  ** The sanity ch
4f60: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
4f70: 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a  on for the new j
4f80: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
4f90: 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33  nsists.** of a 3
4fa0: 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f  2-bit checksum o
4fb0: 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64  n each page of d
4fc0: 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73  ata.  The checks
4fd0: 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a  um covers both.*
4fe0: 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
4ff0: 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72  r and the pPager
5000: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
5010: 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65   of data for the
5020: 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63   page..** This c
5030: 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  ksum is initiali
5040: 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20  zed to a 32-bit 
5050: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61  random value tha
5060: 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  t appears in the
5070: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
5080: 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
5090: 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61   header.  The ra
50a0: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72  ndom initializer
50b0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a   is important,.*
50c0: 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67  * because garbag
50d0: 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65  e data that appe
50e0: 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ars at the end o
50f0: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  f a journal is l
5100: 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68  ikely.** data th
5110: 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f  at was once in o
5120: 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20  ther files that 
5130: 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65  have now been de
5140: 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a  leted.  If the.*
5150: 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63  * garbage data c
5160: 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f  ame from an obso
5170: 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  lete journal fil
5180: 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  e, the checksums
5190: 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72   might.** be cor
51a0: 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e  rect.  But by in
51b0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63  itializing the c
51c0: 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f  hecksum to rando
51d0: 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a  m value which.**
51e0: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f   is different fo
51f0: 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c  r every journal,
5200: 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61   we minimize tha
5210: 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t risk..*/.stati
5220: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
5230: 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61   char aJournalMa
5240: 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39  gic[] = {.  0xd9
5250: 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78  , 0xd5, 0x05, 0x
5260: 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20  f9, 0x20, 0xa1, 
5270: 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a  0x63, 0xd7,.};..
5280: 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  /*.** The size o
5290: 66 20 74 68 65 20 6f 66 20 65 61 63 68 20 70 61  f the of each pa
52a0: 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  ge record in the
52b0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65   journal is give
52c0: 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c  n by.** the foll
52d0: 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  owing macro..*/.
52e0: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
52f0: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28  PG_SZ(pPager)  (
5300: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
5310: 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54  e) + 8)../*.** T
5320: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
5330: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
5340: 70 61 67 65 72 2e 20 54 68 69 73 20 69 73 20 75  pager. This is u
5350: 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20  sually the same 
5360: 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69  .** size as a si
5370: 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
5380: 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65  . See also setSe
5390: 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23  ctorSize()..*/.#
53a0: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48  define JOURNAL_H
53b0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70  DR_SZ(pPager) (p
53c0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
53d0: 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  e)../*.** The ma
53e0: 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75  cro MEMDB is tru
53f0: 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c  e if we are deal
5400: 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d  ing with an in-m
5410: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
5420: 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73  ** We do this as
5430: 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74   a macro so that
5440: 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f   if the SQLITE_O
5450: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63  MIT_MEMORYDB mac
5460: 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68  ro is set,.** th
5470: 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42  e value of MEMDB
5480: 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74   will be a const
5490: 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70  ant and the comp
54a0: 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69  iler will optimi
54b0: 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74  ze.** out code t
54c0: 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20  hat would never 
54d0: 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64  execute..*/.#ifd
54e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
54f0: 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65  EMORYDB.# define
5500: 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23   MEMDB 0.#else.#
5510: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50   define MEMDB pP
5520: 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64  ager->memDb.#end
5530: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  if../*.** The ma
5540: 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65  ximum legal page
5550: 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31   number is (2^31
5560: 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e   - 1)..*/.#defin
5570: 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  e PAGER_MAX_PGNO
5580: 20 32 31 34 37 34 38 33 36 34 37 0a 0a 23 69 66   2147483647..#if
5590: 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a  ndef NDEBUG ./*.
55a0: 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20  ** Usage:.**.** 
55b0: 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
55c0: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
55d0: 67 65 72 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69  ger) );.*/.stati
55e0: 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67  c int assert_pag
55f0: 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a  er_state(Pager *
5600: 70 50 61 67 65 72 29 7b 0a 0a 20 20 2f 2a 20 41  pPager){..  /* A
5610: 20 74 65 6d 70 2d 66 69 6c 65 20 69 73 20 61 6c   temp-file is al
5620: 77 61 79 73 20 69 6e 20 50 41 47 45 52 5f 45 58  ways in PAGER_EX
5630: 43 4c 55 53 49 56 45 20 6f 72 20 50 41 47 45 52  CLUSIVE or PAGER
5640: 5f 53 59 4e 43 45 44 20 73 74 61 74 65 2e 20 2a  _SYNCED state. *
5650: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
5660: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20  er->tempFile==0 
5670: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
5680: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
5690: 45 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 63  E );..  /* The c
56a0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
56b0: 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20 73 65  lag is always se
56c0: 74 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73  t for temp-files
56d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
56e0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  ager->tempFile==
56f0: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61  0 || pPager->cha
5700: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a  ngeCountDone );.
5710: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
5720: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  endif.../*.** Re
5730: 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20  turn true if it 
5740: 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
5750: 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20  write page *pPg 
5760: 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  into the sub-jou
5770: 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20  rnal..** A page 
5780: 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74  needs to be writ
5790: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62  ten into the sub
57a0: 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72  -journal if ther
57b0: 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20  e exists one.** 
57c0: 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76  or more open sav
57d0: 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63  epoints for whic
57e0: 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  h:.**.**   * The
57f0: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
5800: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
5810: 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70  al to PagerSavep
5820: 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a  oint.nOrig, and.
5830: 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63  **   * The bit c
5840: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
5850: 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  the page-number 
5860: 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a  is not set in.**
5870: 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
5880: 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
5890: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
58a0: 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
58b0: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
58c0: 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d  Pgno pgno = pPg-
58d0: 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a  >pgno;.  Pager *
58e0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
58f0: 61 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ager;.  int i;. 
5900: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
5910: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
5920: 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53  i++){.    PagerS
5930: 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70  avepoint *p = &p
5940: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
5950: 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d  t[i];.    if( p-
5960: 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20  >nOrig>=pgno && 
5970: 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63  0==sqlite3Bitvec
5980: 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76 65 70  Test(p->pInSavep
5990: 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20  oint, pgno) ){. 
59a0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
59b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
59c0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
59d0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
59e0: 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
59f0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
5a00: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
5a10: 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61  int pageInJourna
5a20: 6c 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  l(PgHdr *pPg){. 
5a30: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
5a40: 69 74 76 65 63 54 65 73 74 28 70 50 67 2d 3e 70  itvecTest(pPg->p
5a50: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
5a60: 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d  l, pPg->pgno);.}
5a70: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33  ../*.** Read a 3
5a80: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72  2-bit integer fr
5a90: 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  om the given fil
5aa0: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53  e descriptor.  S
5ab0: 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72  tore the integer
5ac0: 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64  .** that is read
5ad0: 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75   in *pRes.  Retu
5ae0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
5af0: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65  everything worke
5b00: 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f  d, or an.** erro
5b10: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
5b20: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
5b30: 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73  **.** All values
5b40: 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64   are stored on d
5b50: 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61  isk as big-endia
5b60: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
5b70: 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69   read32bits(sqli
5b80: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
5b90: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70  4 offset, u32 *p
5ba0: 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Res){.  unsigned
5bb0: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69   char ac[4];.  i
5bc0: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  nt rc = sqlite3O
5bd0: 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69  sRead(fd, ac, si
5be0: 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74  zeof(ac), offset
5bf0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
5c00: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
5c10: 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Res = sqlite3Get
5c20: 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20  4byte(ac);.  }. 
5c30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
5c40: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
5c50: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
5c60: 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72   a string buffer
5c70: 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62   in big-endian b
5c80: 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64  yte order..*/.#d
5c90: 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28  efine put32bits(
5ca0: 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74  A,B)  sqlite3Put
5cb0: 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a  4byte((u8*)A,B).
5cc0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
5cd0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
5ce0: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
5cf0: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
5d00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
5d10: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  ** on success or
5d20: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
5d30: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
5d40: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
5d50: 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74  c int write32bit
5d60: 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
5d70: 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  fd, i64 offset, 
5d80: 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72  u32 val){.  char
5d90: 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62   ac[4];.  put32b
5da0: 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20  its(ac, val);.  
5db0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
5dc0: 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c  Write(fd, ac, 4,
5dd0: 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a   offset);.}../*.
5de0: 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
5df0: 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73  to this macro is
5e00: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
5e10: 6f 72 20 28 74 79 70 65 20 73 71 6c 69 74 65 33  or (type sqlite3
5e20: 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75  _file*)..** Retu
5e30: 72 6e 20 30 20 69 66 20 69 74 20 69 73 20 6e 6f  rn 0 if it is no
5e40: 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a  t open, or non-z
5e50: 65 72 6f 20 28 62 75 74 20 6e 6f 74 20 31 29 20  ero (but not 1) 
5e60: 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  if it is..**.** 
5e70: 54 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20  This is so that 
5e80: 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e 20  expressions can 
5e90: 62 65 20 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a  be written as:.*
5ea0: 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f 70 65  *.**   if( isOpe
5eb0: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
5ec0: 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74  { ....**.** inst
5ed0: 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69  ead of.**.**   i
5ee0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e  f( pPager->jfd->
5ef0: 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a  pMethods ){ ....
5f00: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f 70 65  */.#define isOpe
5f10: 6e 28 70 46 64 29 20 28 28 70 46 64 29 2d 3e 70  n(pFd) ((pFd)->p
5f20: 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20  Methods)../*.** 
5f30: 49 66 20 66 69 6c 65 20 70 46 64 20 69 73 20 6f  If file pFd is o
5f40: 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65  pen, call sqlite
5f50: 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69  3OsUnlock() on i
5f60: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
5f70: 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65   osUnlock(sqlite
5f80: 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69 6e 74  3_file *pFd, int
5f90: 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20 21   eLock){.  if( !
5fa0: 69 73 4f 70 65 6e 28 70 46 64 29 20 29 7b 0a 20  isOpen(pFd) ){. 
5fb0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5fc0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  _OK;.  }.  retur
5fd0: 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  n sqlite3OsUnloc
5fe0: 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d  k(pFd, eLock);.}
5ff0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
6000: 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73  ction determines
6010: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
6020: 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
6030: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a   optimization.**
6040: 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74   can be used wit
6050: 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68  h this pager. Th
6060: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
6070: 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a  an be used if:.*
6080: 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61  *.**  (a) the va
6090: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
60a0: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
60b0: 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61  ristics() indica
60c0: 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  tes that.**     
60d0: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
60e0: 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20   may be written 
60f0: 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a  atomically, and.
6100: 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75  **  (b) the valu
6110: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
6120: 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20  SectorSize() is 
6130: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
6140: 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68  al.**      to th
6150: 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a  e page size..**.
6160: 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74  ** The optimizat
6170: 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77 61  ion is also alwa
6180: 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74  ys enabled for t
6190: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
61a0: 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f  It is.** an erro
61b0: 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66  r to call this f
61c0: 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61 67 65  unction if pPage
61d0: 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r is opened on a
61e0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64  n in-memory.** d
61f0: 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
6200: 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
6210: 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  on cannot be use
6220: 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  d, 0 is returned
6230: 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65 20 75  . If it can be u
6240: 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  sed,.** then the
6250: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
6260: 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
6270: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
6280: 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61  when it.** conta
6290: 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74  ins rollback dat
62a0: 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e  a for exactly on
62b0: 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65  e page..*/.#ifde
62c0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
62d0: 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61  ATOMIC_WRITE.sta
62e0: 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66  tic int jrnlBuff
62f0: 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  erSize(Pager *pP
6300: 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  ager){.  assert(
6310: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28   !MEMDB );.  if(
6320: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
6330: 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 63  le ){.    int dc
6340: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
6360: 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
6370: 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74  stics */.    int
6380: 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20   nSector;       
6390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
63a0: 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f  * Sector size */
63b0: 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 3b  .    int szPage;
63c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63d0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73         /* Page s
63e0: 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ize */..    asse
63f0: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
6400: 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20 64 63  r->fd) );.    dc
6410: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
6420: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
6430: 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
6440: 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61     nSector = pPa
6450: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
6460: 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50  .    szPage = pP
6470: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
6480: 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49  .    assert(SQLI
6490: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
64a0: 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
64b0: 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
64c0: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b  _IOCAP_ATOMIC64K
64d0: 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20  ==(65536>>8));. 
64e0: 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53     if( 0==(dc&(S
64f0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
6500: 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20  IC|(szPage>>8)) 
6510: 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67  || nSector>szPag
6520: 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  e) ){.      retu
6530: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
6540: 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41  .  return JOURNA
6550: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
6560: 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   + JOURNAL_PG_SZ
6570: 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e 64  (pPager);.}.#end
6580: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  if../*.** If SQL
6590: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
65a0: 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
65b0: 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74  we do some sanit
65c0: 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e  y checking.** on
65d0: 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e 67   the cache using
65e0: 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e   a hash function
65f0: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
6600: 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61  for testing.** a
6610: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
6620: 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  y..*/.#ifdef SQL
6630: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
6640: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33  /*.** Return a 3
6650: 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68  2-bit hash of th
6660: 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20  e page data for 
6670: 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pPage..*/.static
6680: 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61 68   u32 pager_datah
6690: 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75  ash(int nByte, u
66a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
66b0: 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68  ata){.  u32 hash
66c0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
66d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74   for(i=0; i<nByt
66e0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73  e; i++){.    has
66f0: 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20  h = (hash*1039) 
6700: 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a  + pData[i];.  }.
6710: 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d    return hash;.}
6720: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
6730: 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72  r_pagehash(PgHdr
6740: 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75   *pPage){.  retu
6750: 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  rn pager_datahas
6760: 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d  h(pPage->pPager-
6770: 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69  >pageSize, (unsi
6780: 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61 67  gned char *)pPag
6790: 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61  e->pData);.}.sta
67a0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73  tic void pager_s
67b0: 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  et_pagehash(PgHd
67c0: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61  r *pPage){.  pPa
67d0: 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  ge->pageHash = p
67e0: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
67f0: 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  age);.}../*.** T
6800: 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61  he CHECK_PAGE ma
6810: 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64  cro takes a PgHd
6820: 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  r* as an argumen
6830: 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  t. If SQLITE_CHE
6840: 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64  CK_PAGES.** is d
6850: 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42  efined, and NDEB
6860: 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  UG is not define
6870: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  d, an assert() s
6880: 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a  tatement checks.
6890: 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
68a0: 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79   is either dirty
68b0: 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65   or still matche
68c0: 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64  s the calculated
68d0: 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23   page-hash..*/.#
68e0: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
68f0: 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78  E(x) checkPage(x
6900: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  ).static void ch
6910: 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  eckPage(PgHdr *p
6920: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
6930: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
6940: 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  er;.  assert( !p
6950: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c 20  Pg->pageHash || 
6960: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 0a  pPager->errCode.
6970: 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66        || (pPg->f
6980: 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
6990: 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61  ) || pPg->pageHa
69a0: 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61  sh==pager_pageha
69b0: 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65  sh(pPg) );.}..#e
69c0: 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65  lse.#define page
69d0: 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20  r_datahash(X,Y) 
69e0: 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72   0.#define pager
69f0: 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a  _pagehash(X)  0.
6a00: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
6a10: 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a  GE(x).#endif  /*
6a20: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
6a30: 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68  GES */../*.** Wh
6a40: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
6a50: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
6a60: 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
6a70: 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ger must be open
6a80: 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  ..** This functi
6a90: 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  on attempts to r
6aa0: 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ead a master jou
6ab0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66  rnal file name f
6ac0: 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20  rom the .** end 
6ad0: 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 2c  of the file and,
6ae0: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
6af0: 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f 20 6d  copies it into m
6b00: 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64 20 0a  emory supplied .
6b10: 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ** by the caller
6b20: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61  . See comments a
6b30: 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74 65 72  bove writeMaster
6b40: 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 74 68  Journal() for th
6b50: 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64  e format.** used
6b60: 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61 73 74   to store a mast
6b70: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
6b80: 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e 64 20  name at the end 
6b90: 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  of a journal fil
6ba0: 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72  e..**.** zMaster
6bb0: 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
6bc0: 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65   buffer of at le
6bd0: 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65  ast nMaster byte
6be0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a  s allocated by.*
6bf0: 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68  * the caller. Th
6c00: 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c  is should be sql
6c10: 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e  ite3_vfs.mxPathn
6c20: 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65  ame+1 (to ensure
6c30: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f   there is.** eno
6c40: 75 67 68 20 73 70 61 63 65 20 74 6f 20 77 72 69  ugh space to wri
6c50: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
6c60: 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20  urnal name). If 
6c70: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
6c80: 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68  al.** name in th
6c90: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e  e journal is lon
6ca0: 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72  ger than nMaster
6cb0: 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e   bytes (includin
6cc0: 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  g a.** nul-termi
6cd0: 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69  nator), then thi
6ce0: 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20  s is handled as 
6cf0: 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  if no master jou
6d00: 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72  rnal name.** wer
6d10: 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  e present in the
6d20: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
6d30: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
6d40: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
6d50: 20 70 72 65 73 65 6e 74 20 61 74 20 74 68 65 20   present at the 
6d60: 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  end of the journ
6d70: 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e  al.** file, then
6d80: 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e   it is copied in
6d90: 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  to the buffer po
6da0: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73  inted to by zMas
6db0: 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65  ter. A.** nul-te
6dc0: 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73  rminator byte is
6dd0: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
6de0: 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e   buffer followin
6df0: 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20  g the master.** 
6e00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
6e10: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69  e..**.** If it i
6e20: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61  s determined tha
6e30: 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  t no master jour
6e40: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
6e50: 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61   present .** zMa
6e60: 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74  ster[0] is set t
6e70: 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  o 0 and SQLITE_O
6e80: 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  K returned..**.*
6e90: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
6ea0: 63 75 72 73 20 77 68 69 6c 65 20 72 65 61 64 69  curs while readi
6eb0: 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ng from the jour
6ec0: 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c  nal file, an SQL
6ed0: 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  ite.** error cod
6ee0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
6ef0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
6f00: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73  dMasterJournal(s
6f10: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72  qlite3_file *pJr
6f20: 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nl, char *zMaste
6f30: 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72 29 7b  r, u32 nMaster){
6f40: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
6f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6f60: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
6f70: 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20 20 20    u32 len;      
6f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6f90: 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20  Length in bytes 
6fa0: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
6fb0: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20  l name */.  i64 
6fc0: 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
6fd0: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
6fe0: 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
6ff0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a   journal file pJ
7000: 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  rnl */.  u32 cks
7010: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
7020: 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73      /* MJ checks
7030: 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  um value read fr
7040: 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  om journal */.  
7050: 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20  u32 u;          
7060: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
7070: 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
7080: 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ter */.  unsigne
7090: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
70a0: 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20  ;   /* A buffer 
70b0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69  to hold the magi
70c0: 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d  c header */.  zM
70d0: 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b  aster[0] = '\0';
70e0: 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ..  if( SQLITE_O
70f0: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
7100: 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c  OsFileSize(pJrnl
7110: 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73  , &szJ)).   || s
7120: 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49  zJ<16.   || SQLI
7130: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
7140: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
7150: 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20  zJ-16, &len)).  
7160: 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72   || len>=nMaster
7170: 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f   .   || SQLITE_O
7180: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
7190: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
71a0: 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c  2, &cksum)).   |
71b0: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
71c0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
71d0: 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20  (pJrnl, aMagic, 
71e0: 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c  8, szJ-8)).   ||
71f0: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
7200: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
7210: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
7220: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
7230: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d  OsRead(pJrnl, zM
7240: 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d  aster, len, szJ-
7250: 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20  16-len)).  ){.  
7260: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
7270: 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68  ..  /* See if th
7280: 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68  e checksum match
7290: 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  es the master jo
72a0: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
72b0: 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20  for(u=0; u<len; 
72c0: 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  u++){.    cksum 
72d0: 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20  -= zMaster[u];. 
72e0: 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29   }.  if( cksum )
72f0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
7300: 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74  checksum doesn't
7310: 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e   add up, then on
7320: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
7330: 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20   disk sectors.  
7340: 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20    ** containing 
7350: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
7360: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63  al filename is c
7370: 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d  orrupted. This m
7380: 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69  eans.    ** defi
7390: 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b  nitely roll back
73a0: 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e  , so just return
73b0: 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72   SQLITE_OK and r
73c0: 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20  eport a (nul).  
73d0: 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
73e0: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20  nal filename..  
73f0: 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30    */.    len = 0
7400: 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b  ;.  }.  zMaster[
7410: 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  len] = '\0';.   
7420: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7430: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
7440: 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20  turn the offset 
7450: 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f  of the sector bo
7460: 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d  undary at or imm
7470: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c  ediately .** fol
7480: 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65  lowing the value
7490: 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   in pPager->jour
74a0: 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67  nalOff, assuming
74b0: 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69   a sector .** si
74c0: 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65  ze of pPager->se
74d0: 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a  ctorSize bytes..
74e0: 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20  **.** i.e for a 
74f0: 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35  sector size of 5
7500: 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65  12:.**.**   Page
7510: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20  r.journalOff    
7520: 20 20 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c        Return val
7530: 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ue.**   --------
7540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
7560: 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20  **   0          
7570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7580: 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20 20  .**   512       
7590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75a0: 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20  512.**   100    
75b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75c0: 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30     512.**   2000
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75e0: 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a        2048.** .*
75f0: 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75  /.static i64 jou
7600: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61  rnalHdrOffset(Pa
7610: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
7620: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
7630: 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72    i64 c = pPager
7640: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
7650: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66  if( c ){.    off
7660: 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55  set = ((c-1)/JOU
7670: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
7680: 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e  er) + 1) * JOURN
7690: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
76a0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
76b0: 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f   offset%JOURNAL_
76c0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
76d0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  0 );.  assert( o
76e0: 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73  ffset>=c );.  as
76f0: 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29  sert( (offset-c)
7700: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
7710: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
7720: 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f  urn offset;.}../
7730: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
7740: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
7750: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  en when this fun
7760: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
7770: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
7780: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
7790: 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  if the journal f
77a0: 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ile has not been
77b0: 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77   written to.** w
77c0: 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ithin the curren
77d0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  t transaction (i
77e0: 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75  .e. if Pager.jou
77f0: 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a  rnalOff==0)..**.
7800: 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65  ** If doTruncate
7810: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20   is non-zero or 
7820: 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  the Pager.journa
7830: 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61  lSizeLimit varia
7840: 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  ble is.** set to
7850: 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74   0, then truncat
7860: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
7870: 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  le to zero bytes
7880: 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77   in size. Otherw
7890: 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65  ise,.** zero the
78a0: 20 32 38 2d 62 79 74 65 20 68 65 61 64 65 72 20   28-byte header 
78b0: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
78c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
78d0: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
78e0: 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67  , .** if the pag
78f0: 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d  er is not in no-
7900: 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20  sync mode, sync 
7910: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
7920: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
7930: 20 61 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f   after writing o
7940: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e  r truncating it.
7950: 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e  .**.** If Pager.
7960: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
7970: 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73   is set to a pos
7980: 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20  itive, non-zero 
7990: 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f  value, and.** fo
79a0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e  llowing the trun
79b0: 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e  cation or zeroin
79c0: 67 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  g described abov
79d0: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
79e0: 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  e .** journal fi
79f0: 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c  le in bytes is l
7a00: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20  arger than this 
7a10: 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e  value, then trun
7a20: 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  cate the.** jour
7a30: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65  nal file to Page
7a40: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
7a50: 69 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f  it bytes. The jo
7a60: 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a  urnal file does.
7a70: 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  ** not need to b
7a80: 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69  e synced followi
7a90: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
7aa0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  n..**.** If an I
7ab0: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
7ac0: 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69  abandon processi
7ad0: 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ng and return th
7ae0: 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e  e IO error code.
7af0: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72  .** Otherwise, r
7b00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
7b10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a  .*/.static int z
7b20: 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  eroJournalHdr(Pa
7b30: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
7b40: 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20   doTruncate){.  
7b50: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
7b60: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b80: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
7b90: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
7ba0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
7bb0: 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
7bc0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
7bd0: 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20 69  .    const i64 i
7be0: 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e  Limit = pPager->
7bf0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
7c00: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
7c10: 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20  che of jsl */.. 
7c20: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45     IOTRACE(("JZE
7c30: 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61  ROHDR %p\n", pPa
7c40: 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f  ger)).    if( do
7c50: 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d  Truncate || iLim
7c60: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  it==0 ){.      r
7c70: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
7c80: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
7c90: 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  d, 0);.    }else
7ca0: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
7cb0: 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64  onst char zeroHd
7cc0: 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20  r[28] = {0};.   
7cd0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
7ce0: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
7cf0: 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a  fd, zeroHdr, siz
7d00: 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29  eof(zeroHdr), 0)
7d10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7d20: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
7d30: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
7d40: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
7d50: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
7d60: 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
7d70: 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70  _SYNC_DATAONLY|p
7d80: 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
7d90: 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  s);.    }..    /
7da0: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
7db0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
7dc0: 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74  is committed but
7dd0: 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
7de0: 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c  .    ** is still
7df0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c   held on the fil
7e00: 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
7e10: 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66   size limit conf
7e20: 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20  igured for .    
7e30: 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ** the persisten
7e40: 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  t journal and th
7e50: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
7e60: 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65  urrently consume
7e70: 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70  s more.    ** sp
7e80: 61 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69  ace than that li
7e90: 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20  mit allows for, 
7ea0: 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e  truncate it now.
7eb0: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
7ec0: 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63  d.    ** to sync
7ed0: 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77   the file follow
7ee0: 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69  ing this operati
7ef0: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
7f00: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7f10: 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a   && iLimit>0 ){.
7f20: 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20        i64 sz;.  
7f30: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7f40: 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
7f50: 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20  r->jfd, &sz);.  
7f60: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
7f70: 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d  TE_OK && sz>iLim
7f80: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  it ){.        rc
7f90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
7fa0: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
7fb0: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
7fc0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
7fd0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
7fe0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
7ff0: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
8000: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
8010: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  ne is called. A 
8020: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65  journal.** heade
8030: 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  r (JOURNAL_HDR_S
8040: 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74  Z bytes) is writ
8050: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
8060: 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65  rnal file at the
8070: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  .** current loca
8080: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
8090: 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a  format for the j
80a0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
80b0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
80c0: 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63  - 8 bytes: Magic
80d0: 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75   identifying jou
80e0: 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20  rnal format..** 
80f0: 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65  - 4 bytes: Numbe
8100: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
8110: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e  journal, or -1 n
8120: 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f  o-sync mode is o
8130: 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  n..** - 4 bytes:
8140: 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75   Random number u
8150: 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73  sed for page has
8160: 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  h..** - 4 bytes:
8170: 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   Initial databas
8180: 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a  e page count..**
8190: 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74   - 4 bytes: Sect
81a0: 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  or size used by 
81b0: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
81c0: 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72   wrote this jour
81d0: 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  nal..** - 4 byte
81e0: 73 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65  s: Database page
81f0: 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f   size..** .** Fo
8200: 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e  llowed by (JOURN
8210: 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20  AL_HDR_SZ - 28) 
8220: 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20  bytes of unused 
8230: 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  space..*/.static
8240: 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61   int writeJourna
8250: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
8260: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
8270: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
8280: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
8290: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63  turn code */.  c
82a0: 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70  har *zHeader = p
82b0: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
82c0: 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20  ;  /* Temporary 
82d0: 73 70 61 63 65 20 75 73 65 64 20 74 6f 20 62 75  space used to bu
82e0: 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  ild header */.  
82f0: 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20 70 50  u32 nHeader = pP
8300: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
8310: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
8320: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
8330: 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20   by zHeader */. 
8340: 20 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20   u32 nWrite;    
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8360: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
8370: 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 20 77   header sector w
8380: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  ritten */.  int 
8390: 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83b0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
83c0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73  */..  assert( is
83d0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
83e0: 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75  ) );      /* Jou
83f0: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
8400: 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66  e open. */..  if
8410: 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41  ( nHeader>JOURNA
8420: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
8430: 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
8440: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
8450: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
8460: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
8470: 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
8480: 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68  ts and any of th
8490: 65 6d 20 77 65 72 65 20 63 72 65 61 74 65 64 20  em were created 
84a0: 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20  .  ** since the 
84b0: 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72  most recent jour
84c0: 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73 20 77  nal header was w
84d0: 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74  ritten, update t
84e0: 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61  he .  ** PagerSa
84f0: 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
8500: 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20  et fields now.. 
8510: 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   */.  for(ii=0; 
8520: 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
8530: 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
8540: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53    if( pPager->aS
8550: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64  avepoint[ii].iHd
8560: 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20  rOffset==0 ){.  
8570: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76      pPager->aSav
8580: 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f  epoint[ii].iHdrO
8590: 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
85a0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
85b0: 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  }.  }..  pPager-
85c0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
85d0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
85e0: 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
85f0: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  set(pPager);..  
8600: 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74  /* .  ** Write t
8610: 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20  he nRec Field - 
8620: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
8630: 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  ge records that 
8640: 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a  follow this.  **
8650: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
8660: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20   Normally, zero 
8670: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
8680: 69 73 20 76 61 6c 75 65 20 61 74 20 74 68 69 73  is value at this
8690: 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65   time..  ** Afte
86a0: 72 20 74 68 65 20 72 65 63 6f 72 64 73 20 61 72  r the records ar
86b0: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a  e added to the j
86c0: 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20  ournal (and the 
86d0: 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20  journal synced, 
86e0: 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c  .  ** if in full
86f0: 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65  -sync mode), the
8700: 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69   zero is overwri
8710: 74 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72  tten with the tr
8720: 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f  ue number.  ** o
8730: 66 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73  f records (see s
8740: 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20  yncJournal()).. 
8750: 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65   **.  ** A faste
8760: 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73  r alternative is
8770: 20 74 6f 20 77 72 69 74 65 20 30 78 46 46 46 46   to write 0xFFFF
8780: 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63  FFFF to the nRec
8790: 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a   field. When.  *
87a0: 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f  * reading the jo
87b0: 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65  urnal this value
87c0: 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f   tells SQLite to
87d0: 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
87e0: 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68  .  ** rest of th
87f0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
8800: 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61  ontains valid pa
8810: 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73  ge records. This
8820: 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a   assumption.  **
8830: 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61   is dangerous, a
8840: 73 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  s if a failure o
8850: 63 63 75 72 72 65 64 20 77 68 69 6c 73 74 20 77  ccurred whilst w
8860: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
8870: 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
8880: 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73  it may contain s
8890: 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61  ome garbage data
88a0: 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20  . There are two 
88b0: 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77  scenarios.  ** w
88c0: 68 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63  here this risk c
88d0: 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20  an be ignored:. 
88e0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
88f0: 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  n the pager is i
8900: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
8910: 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66  Corruption can f
8920: 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20  ollow a.  **    
8930: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69   power failure i
8940: 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77  n this case anyw
8950: 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ay..  **.  **   
8960: 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54  * When the SQLIT
8970: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
8980: 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e  END flag is set.
8990: 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73   This guarantees
89a0: 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67  .  **     that g
89b0: 61 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e  arbage data is n
89c0: 65 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f  ever appended to
89d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
89e0: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
89f0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
8a00: 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
8a10: 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20  noSync );.  if( 
8a20: 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29  (pPager->noSync)
8a30: 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75   || (pPager->jou
8a40: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
8a50: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
8a60: 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74  RY).   || (sqlit
8a70: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
8a80: 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
8a90: 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43  ->fd)&SQLITE_IOC
8aa0: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
8ab0: 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  .  ){.    memcpy
8ac0: 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e  (zHeader, aJourn
8ad0: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
8ae0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
8af0: 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26  .    put32bits(&
8b00: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
8b10: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
8b20: 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d  0xffffffff);.  }
8b30: 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74  else{.    memset
8b40: 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73 69 7a  (zHeader, 0, siz
8b50: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
8b60: 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  c)+4);.  }..  /*
8b70: 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63   The random chec
8b80: 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73  k-hash initialis
8b90: 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33  er */ .  sqlite3
8ba0: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
8bb0: 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of(pPager->cksum
8bc0: 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e  Init), &pPager->
8bd0: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75  cksumInit);.  pu
8be0: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
8bf0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
8c00: 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65  Magic)+4], pPage
8c10: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
8c20: 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20   /* The initial 
8c30: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f  database size */
8c40: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
8c50: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
8c60: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20  urnalMagic)+8], 
8c70: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
8c80: 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73  ze);.  /* The as
8c90: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
8ca0: 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
8cb0: 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ss */.  put32bit
8cc0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
8cd0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
8ce0: 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65  +12], pPager->se
8cf0: 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a  ctorSize);..  /*
8d00: 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a   The page size *
8d10: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
8d20: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
8d30: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d  ournalMagic)+16]
8d40: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
8d50: 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  ze);..  /* Initi
8d60: 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61 69 6c  alizing the tail
8d70: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69   of the buffer i
8d80: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
8d90: 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20 20 2a    Everything.  *
8da0: 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69 66 20  * works find if 
8db0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65  the following me
8dc0: 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74 74 65  mset() is omitte
8dd0: 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61 6c 69  d.  But initiali
8de0: 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65  zing.  ** the me
8df0: 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20 76 61  mory prevents va
8e00: 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70  lgrind from comp
8e10: 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61  laining, so we a
8e20: 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20  re willing to.  
8e30: 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65 72 66  ** take the perf
8e40: 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a  ormance hit..  *
8e50: 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48 65 61  /.  memset(&zHea
8e60: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
8e70: 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30  nalMagic)+20], 0
8e80: 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65 61 64  ,.         nHead
8e90: 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72  er-(sizeof(aJour
8ea0: 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a  nalMagic)+20));.
8eb0: 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c  .  /* In theory,
8ec0: 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65   it is only nece
8ed0: 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74  ssary to write t
8ee0: 68 65 20 32 38 20 62 79 74 65 73 20 74 68 61 74  he 28 bytes that
8ef0: 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e   the .  ** journ
8f00: 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73 75 6d  al header consum
8f10: 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  es to the journa
8f20: 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54 68 65  l file here. The
8f30: 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  n increment the 
8f40: 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72  .  ** Pager.jour
8f50: 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c 65 20  nalOff variable 
8f60: 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  by JOURNAL_HDR_S
8f70: 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  Z so that the ne
8f80: 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20  xt .  ** record 
8f90: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
8fa0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74  e following sect
8fb0: 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20 67 61  or (leaving a ga
8fc0: 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 20 20  p in the file.  
8fd0: 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ** that will be 
8fe0: 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65  implicitly fille
8ff0: 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53 29 2e  d in by the OS).
9000: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76  .  **.  ** Howev
9010: 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 64  er it has been d
9020: 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 6f  iscovered that o
9030: 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 74  n some systems t
9040: 68 69 73 20 70 61 74 74 65 72 6e 20 63 61 6e 20  his pattern can 
9050: 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69 66 69  .  ** be signifi
9060: 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74 68  cantly slower th
9070: 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20  an contiguously 
9080: 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20  writing data to 
9090: 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65  the file,.  ** e
90a0: 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e  ven if that mean
90b0: 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77 72 69  s explicitly wri
90c0: 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65  ting data to the
90d0: 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20   block of .  ** 
90e0: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
90f0: 2d 20 32 38 29 20 62 79 74 65 73 20 74 68 61 74  - 28) bytes that
9100: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65   will not be use
9110: 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20 77 68  d. So that is wh
9120: 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e  at.  ** is done.
9130: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20   .  **.  ** The 
9140: 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72 65 64  loop is required
9150: 20 68 65 72 65 20 69 6e 20 63 61 73 65 20 74 68   here in case th
9160: 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73  e sector-size is
9170: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
9180: 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20   .  ** database 
9190: 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e 63 65  page size. Since
91a0: 20 74 68 65 20 7a 48 65 61 64 65 72 20 62 75 66   the zHeader buf
91b0: 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61 67 65  fer is only Page
91c0: 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20  r.pageSize.  ** 
91d0: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d  bytes in size, m
91e0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c  ore than one cal
91f0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 57 72  l to sqlite3OsWr
9200: 69 74 65 28 29 20 6d 61 79 20 62 65 20 72 65 71  ite() may be req
9210: 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f  uired.  ** to po
9220: 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74 69 72  pulate the entir
9230: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
9240: 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20   sector..  */ . 
9250: 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72   for(nWrite=0; r
9260: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57  c==SQLITE_OK&&nW
9270: 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  rite<JOURNAL_HDR
9280: 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72  _SZ(pPager); nWr
9290: 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20  ite+=nHeader){. 
92a0: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
92b0: 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  R %p %lld %d\n",
92c0: 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
92d0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65  >journalHdr, nHe
92e0: 61 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20  ader)).    rc = 
92f0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
9300: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61  Pager->jfd, zHea
9310: 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50  der, nHeader, pP
9320: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9330: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
9340: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
9350: 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  r <= pPager->jou
9360: 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70  rnalOff );.    p
9370: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
9380: 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20  f += nHeader;.  
9390: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
93a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
93b0: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
93c0: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
93d0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
93e0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
93f0: 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  e.** (JOURNAL_HD
9400: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72  R_SZ bytes) is r
9410: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72  ead from the cur
9420: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
9430: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
9440: 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72 65 6e  file. The curren
9450: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
9460: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
9470: 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50  s given by.** pP
9480: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9490: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61  . See comments a
94a0: 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72  bove function wr
94b0: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  iteJournalHdr() 
94c0: 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72 69 70  for.** a descrip
94d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72  tion of the jour
94e0: 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61  nal header forma
94f0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
9500: 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73  header is read s
9510: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e  uccessfully, *pN
9520: 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  Rec is set to th
9530: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70  e number of.** p
9540: 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c  age records foll
9550: 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65  owing this heade
9560: 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65 20 69  r and *pDbSize i
9570: 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a  s set to the siz
9580: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
9590: 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20  base before the 
95a0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61  transaction bega
95b0: 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73  n, in pages. Als
95c0: 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  o, pPager->cksum
95d0: 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74  Init.** is set t
95e0: 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  o the value read
95f0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
9600: 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45  l header. SQLITE
9610: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
9620: 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
9630: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
9640: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
9650: 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
9660: 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54  corrupted, SQLIT
9670: 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74  E_DONE is.** ret
9680: 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65 63  urned and *pNRec
9690: 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20 61 72   and *PDbSize ar
96a0: 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20 49 66  e undefined.  If
96b0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20   JOURNAL_HDR_SZ 
96c0: 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20  bytes.** cannot 
96d0: 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
96e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
96f0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
9700: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
9710: 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e  ic int readJourn
9720: 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a  alHdr(.  Pager *
9730: 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
9740: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
9750: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69  bject */.  int i
9760: 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72  sHot,.  i64 jour
9770: 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20 20 20  nalSize,        
9780: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
9790: 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c  the open journal
97a0: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
97b0: 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20  /.  u32 *pNRec, 
97c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97d0: 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 72   /* OUT: Value r
97e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e 52 65  ead from the nRe
97f0: 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32  c field */.  u32
9800: 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20 20 20   *pDbSize       
9810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
9820: 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69 67 69  : Value of origi
9830: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a  nal database siz
9840: 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20  e field */.){.  
9850: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
9860: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9870: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
9880: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
9890: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a  Magic[8];     /*
98a0: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
98b0: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
98c0: 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  er */.  i64 iHdr
98d0: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
98e0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
98f0: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
9900: 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a   being read */..
9910: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
9920: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
9930: 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c        /* Journal
9940: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
9950: 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76  en. */..  /* Adv
9960: 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e  ance Pager.journ
9970: 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73 74 61  alOff to the sta
9980: 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 73  rt of the next s
9990: 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a 20 20  ector. If the.  
99a0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
99b0: 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72  is too small for
99c0: 20 74 68 65 72 65 20 74 6f 20 62 65 20 61 20 68   there to be a h
99d0: 65 61 64 65 72 20 73 74 6f 72 65 64 20 61 74 20  eader stored at 
99e0: 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c  this.  ** point,
99f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
9a00: 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ONE..  */.  pPag
9a10: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
9a20: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
9a30: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
9a40: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9a50: 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Off+JOURNAL_HDR_
9a60: 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75  SZ(pPager) > jou
9a70: 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  rnalSize ){.    
9a80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
9a90: 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  NE;.  }.  iHdrOf
9aa0: 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
9ab0: 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65  nalOff;..  /* Re
9ac0: 61 64 20 69 6e 20 74 68 65 20 66 69 72 73 74 20  ad in the first 
9ad0: 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a  8 bytes of the j
9ae0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 49  ournal header. I
9af0: 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61  f they do not ma
9b00: 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61  tch.  ** the  ma
9b10: 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75 6e 64  gic string found
9b20: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
9b30: 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65   each journal he
9b40: 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a  ader, return.  *
9b50: 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49  * SQLITE_DONE. I
9b60: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
9b70: 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20  curs, return an 
9b80: 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65  error code. Othe
9b90: 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63  rwise,.  ** proc
9ba0: 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eed..  */.  if( 
9bb0: 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66  isHot || iHdrOff
9bc0: 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  !=pPager->journa
9bd0: 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  lHdr ){.    rc =
9be0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
9bf0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
9c00: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
9c10: 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20 20  c), iHdrOff);.  
9c20: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
9c30: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
9c40: 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d   }.    if( memcm
9c50: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
9c60: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
9c70: 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20  aMagic))!=0 ){. 
9c80: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
9c90: 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
9ca0: 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
9cb0: 65 20 66 69 72 73 74 20 74 68 72 65 65 20 33 32  e first three 32
9cc0: 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66 20 74  -bit fields of t
9cd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
9ce0: 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a  r: The nRec.  **
9cf0: 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68 65 63   field, the chec
9d00: 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72  ksum-initializer
9d10: 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
9d20: 65 20 73 69 7a 65 20 61 74 20 74 68 65 20 73 74  e size at the st
9d30: 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  art.  ** of the 
9d40: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74  transaction. Ret
9d50: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
9d60: 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
9d70: 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20  es wrong..  */. 
9d80: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
9d90: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
9da0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
9db0: 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29 29  drOff+8, pNRec))
9dc0: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
9dd0: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
9de0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
9df0: 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70 50 61  iHdrOff+12, &pPa
9e00: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29  ger->cksumInit))
9e10: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
9e20: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
9e30: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
9e40: 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44 62 53  iHdrOff+16, pDbS
9e50: 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  ize)).  ){.    r
9e60: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
9e70: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
9e80: 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  rnalOff==0 ){.  
9e90: 20 20 75 33 32 20 69 50 61 67 65 53 69 7a 65 3b    u32 iPageSize;
9ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9eb0: 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69 65 6c  * Page-size fiel
9ec0: 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d of journal hea
9ed0: 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 69  der */.    u32 i
9ee0: 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20  SectorSize;     
9ef0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f          /* Secto
9f00: 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  r-size field of 
9f10: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
9f20: 2f 0a 20 20 20 20 75 31 36 20 69 50 61 67 65 53  /.    u16 iPageS
9f30: 69 7a 65 31 36 3b 20 20 20 20 20 20 20 20 20 20  ize16;          
9f40: 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 69 50     /* Copy of iP
9f50: 61 67 65 53 69 7a 65 20 69 6e 20 31 36 2d 62 69  ageSize in 16-bi
9f60: 74 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20  t variable */.. 
9f70: 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70     /* Read the p
9f80: 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
9f90: 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c  tor-size journal
9fa0: 20 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e 20   header fields. 
9fb0: 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  */.    if( SQLIT
9fc0: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
9fd0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
9fe0: 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c 20  fd, iHdrOff+20, 
9ff0: 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29 0a 20  &iSectorSize)). 
a000: 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b      || SQLITE_OK
a010: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
a020: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
a030: 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69 50 61  iHdrOff+24, &iPa
a040: 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a  geSize)).    ){.
a050: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
a060: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
a070: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61  heck that the va
a080: 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74  lues read from t
a090: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
a0a0: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65   sector-size fie
a0b0: 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77  lds.    ** are w
a0c0: 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20  ithin range. To 
a0d0: 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62  be 'in range', b
a0e0: 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20  oth values need 
a0f0: 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20  to be a power.  
a100: 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61    ** of two grea
a110: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
a120: 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20  l to 512 or 32, 
a130: 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20  and not greater 
a140: 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20  than their .    
a150: 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20 63 6f  ** respective co
a160: 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d  mpile time maxim
a170: 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a  um limits..    *
a180: 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
a190: 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20 20  ize<512         
a1a0: 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63           || iSec
a1b0: 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20  torSize<32.     
a1c0: 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c  || iPageSize>SQL
a1d0: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
a1e0: 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65  E || iSectorSize
a1f0: 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
a200: 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65  .     || ((iPage
a210: 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a  Size-1)&iPageSiz
a220: 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65  e)!=0   || ((iSe
a230: 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63  ctorSize-1)&iSec
a240: 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20  torSize)!=0 .   
a250: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
a260: 74 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70  the either the p
a270: 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74  age-size or sect
a280: 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a  or-size in the j
a290: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73  ournal-header is
a2a0: 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c   .      ** inval
a2b0: 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f  id, then the pro
a2c0: 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
a2d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  the journal-head
a2e0: 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20  er must have .  
a2f0: 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62      ** crashed b
a300: 65 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72  efore the header
a310: 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20   was synced. In 
a320: 74 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72  this case stop r
a330: 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a  eading .      **
a340: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
a350: 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f  e here..      */
a360: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
a370: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
a380: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
a390: 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f  the page-size to
a3a0: 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
a3b0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
a3c0: 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20  ournal. .    ** 
a3d0: 55 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29  Use a testcase()
a3e0: 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73   macro to make s
a3f0: 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20  ure that malloc 
a400: 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a  failure within .
a410: 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50      ** PagerSetP
a420: 61 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73  agesize() is tes
a430: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
a440: 69 50 61 67 65 53 69 7a 65 31 36 20 3d 20 28 75  iPageSize16 = (u
a450: 31 36 29 69 50 61 67 65 53 69 7a 65 3b 0a 20 20  16)iPageSize;.  
a460: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
a470: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
a480: 50 61 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a  Pager, &iPageSiz
a490: 65 31 36 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65  e16, -1);.    te
a4a0: 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
a4b0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 61 73 73  TE_OK );.    ass
a4c0: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
a4d0: 4f 4b 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 31  OK || iPageSize1
a4e0: 36 3d 3d 28 75 31 36 29 69 50 61 67 65 53 69 7a  6==(u16)iPageSiz
a4f0: 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64  e );..    /* Upd
a500: 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20  ate the assumed 
a510: 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d  sector-size to m
a520: 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75  atch the value u
a530: 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74  sed by .    ** t
a540: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
a550: 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75  created this jou
a560: 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f  rnal. If this jo
a570: 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a  urnal was.    **
a580: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
a590: 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
a5a0: 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
a5b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20  this routine.   
a5c0: 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c   ** is being cal
a5d0: 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
a5e0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
a5f0: 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  . The local valu
a600: 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65  e.    ** of Page
a610: 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  r.sectorSize is 
a620: 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  restored at the 
a630: 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74  end of that rout
a640: 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ine..    */.    
a650: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
a660: 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65  ze = iSectorSize
a670: 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  ;.  }..  pPager-
a680: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a  >journalOff += J
a690: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
a6a0: 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
a6b0: 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  rc;.}.../*.** Wr
a6c0: 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  ite the supplied
a6d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a6e0: 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
a6f0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
a700: 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61  ager.** pPager a
a710: 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
a720: 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74  cation. The mast
a730: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
a740: 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
a750: 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65  .** thing writte
a760: 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n to a journal f
a770: 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
a780: 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  r is in full-syn
a790: 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a  c mode, the.** j
a7a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
a7b0: 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63  riptor is advanc
a7c0: 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
a7d0: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62  ector boundary b
a7e0: 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e  efore.** anythin
a7f0: 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68  g is written. Th
a800: 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  e format is:.**.
a810: 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
a820: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a  PAGER_MJ_PGNO..*
a830: 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d  *   + N bytes: M
a840: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
a850: 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e  lename in utf-8.
a860: 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a  .**   + 4 bytes:
a870: 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61   N (length of ma
a880: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
a890: 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e  e in bytes, no n
a8a0: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a  ul-terminator)..
a8b0: 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
a8c0: 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  Master journal n
a8d0: 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ame checksum..**
a8e0: 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a     + 8 bytes: aJ
a8f0: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
a900: 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
a910: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65  journal page che
a920: 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d  cksum is the sum
a930: 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e   of the bytes in
a940: 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
a950: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65  ournal name, whe
a960: 72 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20  re each byte is 
a970: 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
a980: 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e   signed 8-bit in
a990: 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  teger..**.** If 
a9a0: 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c  zMaster is a NUL
a9b0: 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72  L pointer (occur
a9c0: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64  s for a single d
a9d0: 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
a9e0: 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63  ion), .** this c
a9f0: 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
aa00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
aa10: 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
aa20: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
aa30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
aa40: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ter){.  int rc; 
aa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa60: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
aa70: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
aa80: 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20   nMaster;       
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aaa0: 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e   Length of strin
aab0: 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69  g zMaster */.  i
aac0: 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aae0: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61  /* Offset of hea
aaf0: 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  der in journal f
ab00: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e  ile */.  i64 jrn
ab10: 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  lSize;          
ab20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
ab30: 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e of journal fil
ab40: 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75  e on disk */.  u
ab50: 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20  32 cksum = 0;   
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab70: 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73  /* Checksum of s
ab80: 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
ab90: 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72  ..  if( !zMaster
aba0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d   || pPager->setM
abb0: 61 73 74 65 72 0a 20 20 20 7c 7c 20 70 50 61 67  aster.   || pPag
abc0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
abd0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
abe0: 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c  DE_MEMORY .   ||
abf0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ac00: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
ac10: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29  NALMODE_OFF .  )
ac20: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
ac30: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50  ITE_OK;.  }.  pP
ac40: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
ac50: 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 1;.  assert( i
ac60: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
ac70: 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d) );.  assert( 
ac80: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
ac90: 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  dr <= pPager->jo
aca0: 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f  urnalOff );..  /
acb0: 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20  * Calculate the 
acc0: 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20  length in bytes 
acd0: 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d  and the checksum
ace0: 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20   of zMaster */. 
acf0: 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20   for(nMaster=0; 
ad00: 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d  zMaster[nMaster]
ad10: 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20  ; nMaster++){.  
ad20: 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74    cksum += zMast
ad30: 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d  er[nMaster];.  }
ad40: 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c  ..  /* If in ful
ad50: 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76  l-sync mode, adv
ad60: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
ad70: 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66   disk sector bef
ad80: 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a  ore writing.  **
ad90: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
ada0: 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69  nal name. This i
adb0: 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72  s in case the pr
adc0: 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74  evious page writ
add0: 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ten to.  ** the 
ade0: 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65  journal has alre
adf0: 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  ady been synced.
ae00: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
ae10: 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
ae20: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
ae30: 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c  nalOff = journal
ae40: 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
ae50: 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66  );.  }.  iHdrOff
ae60: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
ae70: 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69  alOff;..  /* Wri
ae80: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
ae90: 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74 68  urnal data to th
aea0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
aeb0: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20  rnal file. If.  
aec0: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ** an error occu
aed0: 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65  rs, return the e
aee0: 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65  rror code to the
aef0: 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20   caller..  */.  
af00: 69 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d 20  if( (0 != (rc = 
af10: 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
af20: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
af30: 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  , PAGER_MJ_PGNO(
af40: 70 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c 7c  pPager)))).   ||
af50: 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
af60: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
af70: 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
af80: 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72 4f  , nMaster, iHdrO
af90: 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28 30  ff+4))).   || (0
afa0: 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33   != (rc = write3
afb0: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
afc0: 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  d, iHdrOff+4+nMa
afd0: 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29 29  ster, nMaster)))
afe0: 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
aff0: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
b000: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
b010: 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c  Off+4+nMaster+4,
b020: 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20   cksum))).   || 
b030: 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69  (0 != (rc = sqli
b040: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
b050: 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c  r->jfd, aJournal
b060: 4d 61 67 69 63 2c 20 38 2c 20 69 48 64 72 4f 66  Magic, 8, iHdrOf
b070: 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29  f+4+nMaster+8)))
b080: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
b090: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65   rc;.  }.  pPage
b0a0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
b0b0: 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a 20   (nMaster+20);. 
b0c0: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
b0d0: 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  c = !pPager->noS
b0e0: 79 6e 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ync;..  /* If th
b0f0: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 70 65  e pager is in pe
b100: 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20  ristent-journal 
b110: 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70  mode, then the p
b120: 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f  hysical .  ** jo
b130: 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65  urnal-file may e
b140: 78 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 65  xtend past the e
b150: 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  nd of the master
b160: 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20  -journal name.  
b170: 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f  ** and 8 bytes o
b180: 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73  f magic data jus
b190: 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  t written to the
b1a0: 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a   file. This is .
b1b0: 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62    ** dangerous b
b1c0: 65 63 61 75 73 65 20 74 68 65 20 63 6f 64 65 20  ecause the code 
b1d0: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f  to rollback a ho
b1e0: 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  t-journal file. 
b1f0: 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   ** will not be 
b200: 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65  able to find the
b210: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
b220: 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  name to determin
b230: 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20  e .  ** whether 
b240: 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e  or not the journ
b250: 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a  al is hot. .  **
b260: 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68  .  ** Easiest th
b270: 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69  ing to do in thi
b280: 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f  s scenario is to
b290: 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f   truncate the jo
b2a0: 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65  urnal .  ** file
b2b0: 20 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64   to the required
b2c0: 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69   size..  */ .  i
b2d0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  f( SQLITE_OK==(r
b2e0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
b2f0: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
b300: 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20  d, &jrnlSize)). 
b310: 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50    && jrnlSize>pP
b320: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
b330: 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  .  ){.    rc = s
b340: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
b350: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
b360: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
b370: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
b380: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  rc;.}../*.** Fin
b390: 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
b3a0: 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e  hash table given
b3b0: 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72   its page number
b3c0: 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f  . Return.** a po
b3d0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
b3e0: 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65  e or NULL if the
b3f0: 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
b400: 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61  is not .** alrea
b410: 64 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  dy in memory..*/
b420: 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70  .static PgHdr *p
b430: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65  ager_lookup(Page
b440: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
b450: 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
b460: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
b470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
b480: 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20  turn value */.. 
b490: 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f   /* It is not po
b4a0: 73 73 69 62 6c 65 20 66 6f 72 20 61 20 63 61 6c  ssible for a cal
b4b0: 6c 20 74 6f 20 50 63 61 63 68 65 46 65 74 63 68  l to PcacheFetch
b4c0: 28 29 20 77 69 74 68 20 63 72 65 61 74 65 46 6c  () with createFl
b4d0: 61 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61  ag==0 to.  ** fa
b4e0: 69 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61 74 74  il, since no att
b4f0: 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  empt to allocate
b500: 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20   dynamic memory 
b510: 77 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20  will be made..  
b520: 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74  */.  (void)sqlit
b530: 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
b540: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
b550: 67 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72  gno, 0, &p);.  r
b560: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
b570: 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67  * Unless the pag
b580: 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72 2d 73  er is in error-s
b590: 74 61 74 65 2c 20 64 69 73 63 61 72 64 20 61 6c  tate, discard al
b5a0: 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  l in-memory page
b5b0: 73 2e 20 49 66 0a 2a 2a 20 74 68 65 20 70 61 67  s. If.** the pag
b5c0: 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72 2d 73  er is in error-s
b5d0: 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73 20  tate, then this 
b5e0: 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
b5f0: 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 57 68 79  .**.** TODO: Why
b600: 20 63 61 6e 20 77 65 20 6e 6f 74 20 72 65 73 65   can we not rese
b610: 74 20 74 68 65 20 70 61 67 65 72 20 77 68 69 6c  t the pager whil
b620: 65 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65  e in error state
b630: 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ?.*/.static void
b640: 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
b650: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
b660: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 70 50  f( SQLITE_OK==pP
b670: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
b680: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b  .    sqlite3Back
b690: 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
b6a0: 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20  ->pBackup);.    
b6b0: 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
b6c0: 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ar(pPager->pPCac
b6d0: 68 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  he);.    pPager-
b6e0: 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30  >dbSizeValid = 0
b6f0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
b700: 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72  ree all structur
b710: 65 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  es in the Pager.
b720: 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72  aSavepoint[] arr
b730: 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a  ay and set both.
b740: 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  ** Pager.aSavepo
b750: 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53  int and Pager.nS
b760: 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f  avepoint to zero
b770: 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d  . Close the sub-
b780: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74  journal.** if it
b790: 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
b7a0: 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
b7b0: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
b7c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b7d0: 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f  releaseAllSavepo
b7e0: 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67  ints(Pager *pPag
b7f0: 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20  er){.  int ii;  
b800: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b810: 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f  Iterator for loo
b820: 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67  ping through Pag
b830: 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f  er.aSavepoint */
b840: 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
b850: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
b860: 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73  nt; ii++){.    s
b870: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
b880: 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76  roy(pPager->aSav
b890: 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61  epoint[ii].pInSa
b8a0: 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20  vepoint);.  }.  
b8b0: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
b8c0: 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71  lusiveMode || sq
b8d0: 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61  lite3IsMemJourna
b8e0: 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  l(pPager->sjfd) 
b8f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
b900: 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 6a  Close(pPager->sj
b910: 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  fd);.  }.  sqlit
b920: 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e  e3_free(pPager->
b930: 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70  aSavepoint);.  p
b940: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
b950: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
b960: 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b  >nSavepoint = 0;
b970: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  .  pPager->nSubR
b980: 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ec = 0;.}../*.**
b990: 20 53 65 74 20 74 68 65 20 62 69 74 20 6e 75 6d   Set the bit num
b9a0: 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65 20  ber pgno in the 
b9b0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
b9c0: 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20  InSavepoint .** 
b9d0: 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f  bitvecs of all o
b9e0: 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
b9f0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
ba00: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 2a   if successful.*
ba10: 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  * or SQLITE_NOME
ba20: 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61  M if a malloc fa
ba30: 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f  ilure occurs..*/
ba40: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 54  .static int addT
ba50: 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
ba60: 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  s(Pager *pPager,
ba70: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
ba80: 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
ba90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
baa0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
bab0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
bac0: 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
bad0: 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72  t code */..  for
bae0: 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
baf0: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
bb00: 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61  ++){.    PagerSa
bb10: 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50  vepoint *p = &pP
bb20: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
bb30: 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67  [ii];.    if( pg
bb40: 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a  no<=p->nOrig ){.
bb50: 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69        rc |= sqli
bb60: 74 65 33 42 69 74 76 65 63 53 65 74 28 70 2d 3e  te3BitvecSet(p->
bb70: 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67  pInSavepoint, pg
bb80: 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  no);.      testc
bb90: 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
bba0: 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 61  NOMEM );.      a
bbb0: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
bbc0: 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
bbd0: 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
bbe0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
bbf0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
bc00: 72 6e 20 74 72 75 65 20 69 66 20 74 68 69 73 20  rn true if this 
bc10: 70 61 67 65 72 20 75 73 65 73 20 61 20 77 72 69  pager uses a wri
bc20: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 69 6e 73  te-ahead log ins
bc30: 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61  tead of the usua
bc40: 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  l.** rollback jo
bc50: 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77 69 73 65  urnal. Otherwise
bc60: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69   false..*/.stati
bc70: 63 20 69 6e 74 20 70 61 67 65 72 55 73 65 4c 6f  c int pagerUseLo
bc80: 67 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  g(Pager *pPager)
bc90: 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67  {.  return (pPag
bca0: 65 72 2d 3e 70 4c 6f 67 21 3d 30 29 3b 0a 7d 0a  er->pLog!=0);.}.
bcb0: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
bcc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
bcd0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
bce0: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
bcf0: 20 70 61 67 65 72 0a 2a 2a 20 69 73 20 69 6e 20   pager.** is in 
bd00: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
bd10: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
bd20: 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
bd30: 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  in error state, 
bd40: 64 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74  discard the cont
bd50: 65 6e 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65 20  ents of .** the 
bd60: 63 61 63 68 65 20 61 6e 64 20 72 65 73 65 74 20  cache and reset 
bd70: 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
bd80: 75 72 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  ure internal sta
bd90: 74 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 0a  te. If there is.
bda0: 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e  ** an open journ
bdb0: 61 6c 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  al-file, then th
bdc0: 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20 73 68  e next time a sh
bdd0: 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74  ared-lock is obt
bde0: 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20  ained.** on the 
bdf0: 70 61 67 65 72 20 66 69 6c 65 20 28 62 79 20 74  pager file (by t
be00: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
be10: 20 70 72 6f 63 65 73 73 29 2c 20 69 74 20 77 69   process), it wi
be20: 6c 6c 20 62 65 0a 2a 2a 20 74 72 65 61 74 65 64  ll be.** treated
be30: 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   as a hot-journa
be40: 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63  l and rolled bac
be50: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
be60: 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50  d pager_unlock(P
be70: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
be80: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
be90: 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
bea0: 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
beb0: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
bec0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
bed0: 2f 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  /..    /* Always
bee0: 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e   close the journ
bef0: 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f  al file when dro
bf00: 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  pping the databa
bf10: 73 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2a 20  se lock..    ** 
bf20: 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 6f 74 68  Otherwise, anoth
bf30: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  er connection wi
bf40: 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  th journal_mode=
bf50: 64 65 6c 65 74 65 20 6d 69 67 68 74 0a 20 20 20  delete might.   
bf60: 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 66   ** delete the f
bf70: 69 6c 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ile out from und
bf80: 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  er us..    */.  
bf90: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
bfa0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
bfb0: 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
bfc0: 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
bfd0: 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
bfe0: 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
bff0: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c  nal = 0;.    rel
c000: 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
c010: 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  s(pPager);..    
c020: 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
c030: 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 73 6f 6d 65  s unlocked, some
c040: 62 6f 64 79 20 65 6c 73 65 20 6d 69 67 68 74 20  body else might 
c050: 63 68 61 6e 67 65 20 69 74 2e 20 54 68 65 0a 20  change it. The. 
c060: 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 73 74 6f     ** values sto
c070: 72 65 64 20 69 6e 20 50 61 67 65 72 2e 64 62 53  red in Pager.dbS
c080: 69 7a 65 20 65 74 63 2e 20 6d 69 67 68 74 20 62  ize etc. might b
c090: 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 20 69 66  ecome invalid if
c0a0: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 68 61 70  .    ** this hap
c0b0: 70 65 6e 73 2e 20 20 4f 6e 65 20 63 61 6e 20 61  pens.  One can a
c0c0: 72 67 75 65 20 74 68 61 74 20 74 68 69 73 20 64  rgue that this d
c0d0: 6f 65 73 6e 27 74 20 6e 65 65 64 20 74 6f 20 62  oesn't need to b
c0e0: 65 20 63 6c 65 61 72 65 64 0a 20 20 20 20 2a 2a  e cleared.    **
c0f0: 20 75 6e 74 69 6c 20 74 68 65 20 63 68 61 6e 67   until the chang
c100: 65 2d 63 6f 75 6e 74 65 72 20 63 68 65 63 6b 20  e-counter check 
c110: 66 61 69 6c 73 20 69 6e 20 50 61 67 65 72 53 68  fails in PagerSh
c120: 61 72 65 64 4c 6f 63 6b 28 29 2e 0a 20 20 20 20  aredLock()..    
c130: 2a 2a 20 43 6c 65 61 72 69 6e 67 20 74 68 65 20  ** Clearing the 
c140: 70 61 67 65 20 73 69 7a 65 20 63 61 63 68 65 20  page size cache 
c150: 68 65 72 65 20 69 73 20 62 65 69 6e 67 20 63 6f  here is being co
c160: 6e 73 65 72 76 61 74 69 76 65 2e 0a 20 20 20 20  nservative..    
c170: 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  */.    pPager->d
c180: 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a  bSizeValid = 0;.
c190: 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
c1a0: 65 4c 6f 67 28 70 50 61 67 65 72 29 20 29 7b 0a  eLog(pPager) ){.
c1b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67        sqlite3Log
c1c0: 43 6c 6f 73 65 53 6e 61 70 73 68 6f 74 28 70 50  CloseSnapshot(pP
c1d0: 61 67 65 72 2d 3e 70 4c 6f 67 29 3b 0a 20 20 20  ager->pLog);.   
c1e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
c1f0: 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67   = osUnlock(pPag
c200: 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
c210: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
c220: 72 63 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  rc ){.      pPag
c230: 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
c240: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52  ;.    }.    IOTR
c250: 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c  ACE(("UNLOCK %p\
c260: 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20  n", pPager))..  
c270: 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72    /* If Pager.er
c280: 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68  rCode is set, th
c290: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
c2a0: 65 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61  e pager cache ca
c2b0: 6e 6e 6f 74 20 62 65 0a 20 20 20 20 2a 2a 20 74  nnot be.    ** t
c2c0: 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74  rusted. Now that
c2d0: 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20   the pager file 
c2e0: 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65  is unlocked, the
c2f0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
c300: 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 20 63 61  .    ** cache ca
c310: 6e 20 62 65 20 64 69 73 63 61 72 64 65 64 20 61  n be discarded a
c320: 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  nd the error cod
c330: 65 20 73 61 66 65 6c 79 20 63 6c 65 61 72 65 64  e safely cleared
c340: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
c350: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
c360: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63   ){.      if( rc
c370: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
c380: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
c390: 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  rrCode = SQLITE_
c3a0: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
c3b0: 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
c3c0: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ager);.    }..  
c3d0: 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
c3e0: 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20  CountDone = 0;. 
c3f0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
c400: 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
c410: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d  .    pPager->dbM
c420: 6f 64 69 66 69 65 64 20 3d 20 30 3b 0a 20 20 7d  odified = 0;.  }
c430: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
c440: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  unction should b
c450: 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  e called when an
c460: 20 49 4f 45 52 52 2c 20 43 4f 52 52 55 50 54 20   IOERR, CORRUPT 
c470: 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 0a 2a 2a  or FULL error.**
c480: 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72 72   may have occurr
c490: 65 64 2e 20 54 68 65 20 66 69 72 73 74 20 61 72  ed. The first ar
c4a0: 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
c4b0: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 72  ter to the pager
c4c0: 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20   .** structure, 
c4d0: 74 68 65 20 73 65 63 6f 6e 64 20 74 68 65 20 65  the second the e
c4e0: 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20  rror-code about 
c4f0: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
c500: 79 20 61 20 70 61 67 65 72 20 0a 2a 2a 20 41 50  y a pager .** AP
c510: 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20  I function. The 
c520: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
c530: 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
c540: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
c550: 0a 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63  .** to this func
c560: 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  tion. .**.** If 
c570: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
c580: 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f  ent is SQLITE_IO
c590: 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52  ERR, SQLITE_CORR
c5a0: 55 50 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46  UPT, or SQLITE_F
c5b0: 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  ULL.** the error
c5c0: 20 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73 74   becomes persist
c5d0: 65 6e 74 2e 20 55 6e 74 69 6c 20 74 68 65 20 70  ent. Until the p
c5e0: 65 72 73 69 73 74 65 6e 20 65 72 72 6f 72 20 69  ersisten error i
c5f0: 73 20 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75  s cleared,.** su
c600: 62 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c  bsequent API cal
c610: 6c 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72  ls on this Pager
c620: 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c   will immediatel
c630: 79 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d  y return the sam
c640: 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  e .** error code
c650: 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73  ..**.** A persis
c660: 74 65 6e 74 20 65 72 72 6f 72 20 69 6e 64 69 63  tent error indic
c670: 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f  ates that the co
c680: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
c690: 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61  ger-cache .** ca
c6a0: 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e  nnot be trusted.
c6b0: 20 54 68 69 73 20 73 74 61 74 65 20 63 61 6e 20   This state can 
c6c0: 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f  be cleared by co
c6d0: 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64  mpletely discard
c6e0: 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ing .** the cont
c6f0: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
c700: 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74 72  r-cache. If a tr
c710: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63  ansaction was ac
c720: 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tive when.** the
c730: 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f   persistent erro
c740: 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e  r occurred, then
c750: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
c760: 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a  urnal may need.*
c770: 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64  * to be replayed
c780: 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
c790: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
c7a0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61  database file (a
c7b0: 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65 20  s if.** it were 
c7c0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a  a hot-journal)..
c7d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
c7e0: 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20  ger_error(Pager 
c7f0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29  *pPager, int rc)
c800: 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63  {.  int rc2 = rc
c810: 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72   & 0xff;.  asser
c820: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
c830: 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   || !MEMDB );.  
c840: 61 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 70  assert(.       p
c850: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
c860: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20  SQLITE_FULL ||. 
c870: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
c880: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
c890: 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67   ||.       (pPag
c8a0: 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78  er->errCode & 0x
c8b0: 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  ff)==SQLITE_IOER
c8c0: 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 32  R.  );.  if( rc2
c8d0: 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
c8e0: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   rc2==SQLITE_IOE
c8f0: 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  RR ){.    pPager
c900: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
c910: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
c920: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  .}../*.** Execut
c930: 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20  e a rollback if 
c940: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
c950: 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f   active and unlo
c960: 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  ck the .** datab
c970: 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  ase file. .**.**
c980: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61   If the pager ha
c990: 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  s already entere
c9a0: 64 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  d the error stat
c9b0: 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70  e, do not attemp
c9c0: 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  t .** the rollba
c9d0: 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ck at this time.
c9e0: 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72 5f   Instead, pager_
c9f0: 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c  unlock() is call
ca00: 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20  ed. The.** call 
ca10: 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  to pager_unlock(
ca20: 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20 61  ) will discard a
ca30: 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ll in-memory pag
ca40: 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68  es, unlock.** th
ca50: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
ca60: 61 6e 64 20 63 6c 65 61 72 20 74 68 65 20 65 72  and clear the er
ca70: 72 6f 72 20 73 74 61 74 65 2e 20 49 66 20 74 68  ror state. If th
ca80: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  is means that.**
ca90: 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d   there is a hot-
caa0: 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20  journal left in 
cab0: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
cac0: 20 74 68 65 20 6e 65 78 74 20 63 6f 6e 6e 65 63   the next connec
cad0: 74 69 6f 6e 0a 2a 2a 20 74 6f 20 6f 62 74 61 69  tion.** to obtai
cae0: 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  n a shared lock 
caf0: 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68  on the pager (wh
cb00: 69 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20  ich may be this 
cb10: 6f 6e 65 29 20 77 69 6c 6c 0a 2a 2a 20 72 6f 6c  one) will.** rol
cb20: 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  l it back..**.**
cb30: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61   If the pager ha
cb40: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 6e  s not already en
cb50: 74 65 72 65 64 20 74 68 65 20 65 72 72 6f 72 20  tered the error 
cb60: 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49 4f  state, but an IO
cb70: 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72   or.** malloc er
cb80: 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
cb90: 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  g a rollback, th
cba0: 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74 73  en this will its
cbb0: 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74 68  elf cause .** th
cbc0: 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
cbd0: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
cbe0: 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65 20  . Which will be 
cbf0: 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a 2a  cleared by the.*
cc00: 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  * call to pager_
cc10: 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65 73  unlock(), as des
cc20: 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f  cribed above..*/
cc30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
cc40: 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
cc50: 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
cc60: 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
cc70: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
cc80: 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
cc90: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
cca0: 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c  ERVED ){.    sql
ccb0: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
ccc0: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c  alloc();.    sql
ccd0: 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
cce0: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 73  k(pPager);.    s
ccf0: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
cd00: 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 70  alloc();.  }.  p
cd10: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
cd20: 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  er);.}../*.** Th
cd30: 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20  is routine ends 
cd40: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  a transaction. A
cd50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
cd60: 75 73 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79  usually ended by
cd70: 20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f   .** either a CO
cd80: 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41  MMIT or a ROLLBA
cd90: 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68  CK operation. Th
cda0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62  is routine may b
cdb0: 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74  e called .** aft
cdc0: 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61  er rollback of a
cdd0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72   hot-journal, or
cde0: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
cdf0: 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e  urs while openin
ce00: 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g.** the journal
ce10: 20 66 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67   file or writing
ce20: 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74 20   the very first 
ce30: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f  journal-header o
ce40: 66 20 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  f a.** database 
ce50: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
ce60: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
ce70: 20 69 73 20 69 6e 20 50 41 47 45 52 5f 53 48 41   is in PAGER_SHA
ce80: 52 45 44 20 6f 72 20 50 41 47 45 52 5f 55 4e 4c  RED or PAGER_UNL
ce90: 4f 43 4b 20 73 74 61 74 65 20 77 68 65 6e 20 74  OCK state when t
cea0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
ceb0: 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
cec0: 61 20 6e 6f 2d 6f 70 20 28 72 65 74 75 72 6e 73  a no-op (returns
ced0: 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a   SQLITE_OK)..**.
cee0: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  ** Otherwise, an
cef0: 79 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  y active savepoi
cf00: 6e 74 73 20 61 72 65 20 72 65 6c 65 61 73 65 64  nts are released
cf10: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
cf20: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
cf30: 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20  pen, then it is 
cf40: 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63  "finalized". Onc
cf50: 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  e a journal .** 
cf60: 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69  file has been fi
cf70: 6e 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f  nalized it is no
cf80: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  t possible to us
cf90: 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63  e it to roll bac
cfa0: 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  k a .** transact
cfb0: 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74  ion. Nor will it
cfc0: 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74   be considered t
cfd0: 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  o be a hot-journ
cfe0: 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72  al by this.** or
cff0: 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62   any other datab
d000: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ase connection. 
d010: 45 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f  Exactly how a jo
d020: 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a  urnal is finaliz
d030: 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e  ed.** depends on
d040: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
d050: 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
d060: 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
d070: 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68  e mode and.** th
d080: 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61  e current journa
d090: 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f  l-mode (Pager.jo
d0a0: 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29  urnalMode value)
d0b0: 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  , as follows:.**
d0c0: 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
d0d0: 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20  e==MEMORY.**    
d0e0: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   Journal file de
d0f0: 73 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70  scriptor is simp
d100: 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20  ly closed. This 
d110: 64 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20  destroys an .** 
d120: 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f      in-memory jo
d130: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a  urnal..**.**   j
d140: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e  ournalMode==TRUN
d150: 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  CATE.**     Jour
d160: 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e  nal file is trun
d170: 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79  cated to zero by
d180: 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  tes in size..**.
d190: 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
d1a0: 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20  ==PERSIST.**    
d1b0: 20 54 68 65 20 66 69 72 73 74 20 32 38 20 62 79   The first 28 by
d1c0: 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
d1d0: 61 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f  al file are zero
d1e0: 65 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64  ed. This invalid
d1f0: 61 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20  ates.**     the 
d200: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
d210: 61 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65  ader in the file
d220: 2c 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20  , and hence the 
d230: 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a  entire journal.*
d240: 2a 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69  *     file. An i
d250: 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66  nvalid journal f
d260: 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f  ile cannot be ro
d270: 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
d280: 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
d290: 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68  DELETE.**     Th
d2a0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
d2b0: 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c  s closed and del
d2c0: 65 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  eted using sqlit
d2d0: 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a  e3OsDelete()..**
d2e0: 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70  .**     If the p
d2f0: 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
d300: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
d310: 65 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f  e, this method o
d320: 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20  f finalizing.** 
d330: 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20      the journal 
d340: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73  file is never us
d350: 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20  ed. Instead, if 
d360: 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  the journalMode 
d370: 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45  is.**     DELETE
d380: 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
d390: 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
d3a0: 6f 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20  ode, the method 
d3b0: 64 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a  described under.
d3c0: 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  **     journalMo
d3d0: 64 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75  de==PERSIST is u
d3e0: 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  sed instead..**.
d3f0: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  ** After the jou
d400: 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65  rnal is finalize
d410: 64 2c 20 69 66 20 72 75 6e 6e 69 6e 67 20 69 6e  d, if running in
d420: 20 6e 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 6d   non-exclusive m
d430: 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 70 61 67 65  ode, the.** page
d440: 72 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52  r moves to PAGER
d450: 5f 53 48 41 52 45 44 20 73 74 61 74 65 20 28 61  _SHARED state (a
d460: 6e 64 20 64 6f 77 6e 67 72 61 64 65 73 20 74 68  nd downgrades th
d470: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 2a 2a  e lock on the.**
d480: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
d490: 63 63 6f 72 64 69 6e 67 6c 79 29 2e 0a 2a 2a 0a  ccordingly)..**.
d4a0: 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
d4b0: 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
d4c0: 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64  clusive mode and
d4d0: 20 69 73 20 69 6e 20 50 41 47 45 52 5f 53 59 4e   is in PAGER_SYN
d4e0: 43 45 44 20 73 74 61 74 65 2c 0a 2a 2a 20 69 74  CED state,.** it
d4f0: 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f   moves to PAGER_
d500: 45 58 43 4c 55 53 49 56 45 2e 20 4e 6f 20 6c 6f  EXCLUSIVE. No lo
d510: 63 6b 73 20 61 72 65 20 64 6f 77 6e 67 72 61 64  cks are downgrad
d520: 65 64 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20  ed when running 
d530: 69 6e 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65 20  in.** exclusive 
d540: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  mode..**.** SQLI
d550: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
d560: 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  d if no error oc
d570: 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f  curs. If an erro
d580: 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a  r occurs during.
d590: 2a 2a 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f  ** any of the IO
d5a0: 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66   operations to f
d5b0: 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
d5c0: 6e 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f  nal file or unlo
d5d0: 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  ck the.** databa
d5e0: 73 65 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  se then the IO e
d5f0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
d600: 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65  urned to the use
d610: 72 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70  r. If the .** op
d620: 65 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c  eration to final
d630: 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
d640: 66 69 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e  file fails, then
d650: 20 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a   the code still.
d660: 2a 2a 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f  ** tries to unlo
d670: 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ck the database 
d680: 66 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65  file if not in e
d690: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49  xclusive mode. I
d6a0: 66 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20  f the.** unlock 
d6b0: 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20  operation fails 
d6c0: 61 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68  as well, then th
d6d0: 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f  e first error co
d6e0: 64 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f  de related.** to
d6f0: 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72   the first error
d700: 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68   encountered (th
d710: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69  e journal finali
d720: 7a 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a  zation one) is.*
d730: 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  * returned..*/.s
d740: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
d750: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
d760: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
d770: 6e 74 20 68 61 73 4d 61 73 74 65 72 29 7b 0a 20  nt hasMaster){. 
d780: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
d790: 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72 72  _OK;      /* Err
d7a0: 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f 75  or code from jou
d7b0: 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
d7c0: 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  n operation */. 
d7d0: 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54   int rc2 = SQLIT
d7e0: 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72 72  E_OK;     /* Err
d7f0: 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64 62 20  or code from db 
d800: 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65 72  file unlock oper
d810: 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20  ation */..  if( 
d820: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
d830: 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
d840: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d850: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 6c 65  E_OK;.  }.  rele
d860: 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
d870: 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 61 73 73  (pPager);..  ass
d880: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
d890: 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67  er->jfd) || pPag
d8a0: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
d8b0: 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  0 );.  if( isOpe
d8c0: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
d8d0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
d8e0: 61 67 65 72 55 73 65 4c 6f 67 28 70 50 61 67 65  agerUseLog(pPage
d8f0: 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  r) );..    /* Fi
d900: 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
d910: 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
d920: 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d  if( sqlite3IsMem
d930: 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
d940: 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73  jfd) ){.      as
d950: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
d960: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
d970: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
d980: 4f 52 59 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ORY );.      sql
d990: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
d9a0: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65  er->jfd);.    }e
d9b0: 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
d9c0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
d9d0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
d9e0: 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20  RUNCATE ){.     
d9f0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
da00: 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  rnalOff==0 ){.  
da10: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
da20: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  E_OK;.      }els
da30: 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
da40: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
da50: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
da60: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
da70: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
da80: 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Off = 0;.      p
da90: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
daa0: 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d  arted = 0;.    }
dab0: 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
dac0: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
dad0: 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
dae0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
daf0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
db00: 45 52 53 49 53 54 0a 20 20 20 20 29 7b 0a 20 20  ERSIST.    ){.  
db10: 20 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75      rc = zeroJou
db20: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
db30: 68 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  hasMaster);.    
db40: 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
db50: 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
db60: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
db70: 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Off = 0;.      p
db80: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
db90: 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d  arted = 0;.    }
dba0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54  else{.      /* T
dbb0: 68 69 73 20 62 72 61 6e 63 68 20 6d 61 79 20 62  his branch may b
dbc0: 65 20 65 78 65 63 75 74 65 64 20 77 69 74 68 20  e executed with 
dbd0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64  Pager.journalMod
dbe0: 65 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20  e==MEMORY if.   
dbf0: 20 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72     ** a hot-jour
dc00: 6e 61 6c 20 77 61 73 20 6a 75 73 74 20 72 6f 6c  nal was just rol
dc10: 6c 65 64 20 62 61 63 6b 2e 20 49 6e 20 74 68 69  led back. In thi
dc20: 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
dc30: 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  al.      ** file
dc40: 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65   should be close
dc50: 64 20 61 6e 64 20 64 65 6c 65 74 65 64 2e 20 49  d and deleted. I
dc60: 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  f this connectio
dc70: 6e 20 77 72 69 74 65 73 20 74 6f 0a 20 20 20 20  n writes to.    
dc80: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
dc90: 65 20 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20  e file, it will 
dca0: 64 6f 20 73 6f 20 75 73 69 6e 67 20 61 6e 20 69  do so using an i
dcb0: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
dcc0: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  .  */.      asse
dcd0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
dce0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
dcf0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
dd00: 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  E .           ||
dd10: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
dd20: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
dd30: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
dd40: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73        );.      s
dd50: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
dd60: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
dd70: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
dd80: 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
dd90: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
dda0: 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
ddb0: 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
ddc0: 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
ddd0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65    }.    }..#ifde
dde0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
ddf0: 41 47 45 53 0a 20 20 20 20 73 71 6c 69 74 65 33  AGES.    sqlite3
de00: 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72  PcacheIterateDir
de10: 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ty(pPager->pPCac
de20: 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61  he, pager_set_pa
de30: 67 65 68 61 73 68 29 3b 0a 23 65 6e 64 69 66 0a  gehash);.#endif.
de40: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 69 74    }.  sqlite3Bit
de50: 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
de60: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
de70: 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
de80: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  rnal = 0;.  pPag
de90: 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
dea0: 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
deb0: 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50  anAll(pPager->pP
dec0: 43 61 63 68 65 29 3b 0a 0a 20 20 69 66 28 20 70  Cache);..  if( p
ded0: 61 67 65 72 55 73 65 4c 6f 67 28 70 50 61 67 65  agerUseLog(pPage
dee0: 72 29 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20  r) ){.    rc2 = 
def0: 73 71 6c 69 74 65 33 4c 6f 67 57 72 69 74 65 4c  sqlite3LogWriteL
df00: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 70 4c 6f 67  ock(pPager->pLog
df10: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 67 65 72  , 0);.    pPager
df20: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
df30: 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20  SHARED;.  }else 
df40: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
df50: 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
df60: 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b    rc2 = osUnlock
df70: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  (pPager->fd, SHA
df80: 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70  RED_LOCK);.    p
df90: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
dfa0: 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
dfb0: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
dfc0: 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
dfd0: 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
dfe0: 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
dff0: 59 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61  YNCED ){.    pPa
e000: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
e010: 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
e020: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  }.  pPager->setM
e030: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61  aster = 0;.  pPa
e040: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
e050: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d  0;.  pPager->dbM
e060: 6f 64 69 66 69 65 64 20 3d 20 30 3b 0a 0a 20 20  odified = 0;..  
e070: 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 74 68 69 73  /* TODO: Is this
e080: 20 6f 70 74 69 6d 61 6c 3f 20 57 68 79 20 69 73   optimal? Why is
e090: 20 74 68 65 20 64 62 20 73 69 7a 65 20 69 6e 76   the db size inv
e0a0: 61 6c 69 64 61 74 65 64 20 68 65 72 65 20 0a 20  alidated here . 
e0b0: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 64 61 74   ** when the dat
e0c0: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f  abase file is no
e0d0: 74 20 75 6e 6c 6f 63 6b 65 64 3f 20 2a 2f 0a 20  t unlocked? */. 
e0e0: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
e0f0: 69 7a 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ize = 0;.  sqlit
e100: 65 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65  e3PcacheTruncate
e110: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
e120: 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
e130: 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20  );.  if( !MEMDB 
e140: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
e150: 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a  bSizeValid = 0;.
e160: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72    }..  return (r
e170: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32  c==SQLITE_OK?rc2
e180: 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  :rc);.}../*.** P
e190: 61 72 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d  arameter aData m
e1a0: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
e1b0: 75 66 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d  uffer of pPager-
e1c0: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a  >pageSize bytes.
e1d0: 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70  ** of data. Comp
e1e0: 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ute and return a
e1f0: 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20   checksum based 
e200: 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ont the contents
e210: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   of the .** page
e220: 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74 68 65   of data and the
e230: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
e240: 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f pPager->cksumI
e250: 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nit..**.** This 
e260: 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68  is not a real ch
e270: 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65  ecksum. It is re
e280: 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75  ally just the su
e290: 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e  m of the .** ran
e2a0: 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  dom initial valu
e2b0: 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  e (pPager->cksum
e2c0: 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79 20  Init) and every 
e2d0: 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66  200th byte.** of
e2e0: 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2c 20   the page data, 
e2f0: 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 62 79  starting with by
e300: 74 65 20 6f 66 66 73 65 74 20 28 70 50 61 67 65  te offset (pPage
e310: 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29  r->pageSize%200)
e320: 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69  ..** Each byte i
e330: 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
e340: 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e   an 8-bit unsign
e350: 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a  ed integer..**.*
e360: 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66  * Changing the f
e370: 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63  ormula used to c
e380: 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68 65 63  ompute this chec
e390: 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20  ksum results in 
e3a0: 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62  an.** incompatib
e3b0: 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  le journal file 
e3c0: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
e3d0: 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74   journal corrupt
e3e0: 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74  ion occurs due t
e3f0: 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  o a power failur
e400: 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e, the most like
e410: 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20  ly .** scenario 
e420: 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20  is that one end 
e430: 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
e440: 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  the record will 
e450: 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20  be changed. .** 
e460: 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20  It is much less 
e470: 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20  likely that the 
e480: 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20  two ends of the 
e490: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
e4a0: 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63  ill be.** correc
e4b0: 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65  t and the middle
e4c0: 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68   be corrupt.  Th
e4d0: 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73  us, this "checks
e4e0: 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74  um" scheme,.** t
e4f0: 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73  hough fast and s
e500: 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74  imple, catches t
e510: 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79  he mostly likely
e520: 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74   kind of corrupt
e530: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ion..*/.static u
e540: 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50  32 pager_cksum(P
e550: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
e560: 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a  nst u8 *aData){.
e570: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50    u32 cksum = pP
e580: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b  ager->cksumInit;
e590: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
e5a0: 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65  ksum value to re
e5b0: 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20  turn */.  int i 
e5c0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
e5d0: 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20  ze-200;         
e5e0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
e5f0: 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30   */.  while( i>0
e600: 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d   ){.    cksum +=
e610: 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69   aData[i];.    i
e620: 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72   -= 200;.  }.  r
e630: 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a  eturn cksum;.}..
e640: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
e650: 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69  gle page from ei
e660: 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ther the journal
e670: 20 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e   file (if isMain
e680: 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66  Jrnl==1) or.** f
e690: 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
e6a0: 6e 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72  nal (if isMainJr
e6b0: 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62  nl==0) and playb
e6c0: 61 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a  ack that page..*
e6d0: 2a 20 54 68 65 20 70 61 67 65 20 62 65 67 69 6e  * The page begin
e6e0: 73 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66  s at offset *pOf
e6f0: 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69  fset into the fi
e700: 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74  le. The *pOffset
e710: 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63  .** value is inc
e720: 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 73 74  reased to the st
e730: 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20  art of the next 
e740: 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  page in the jour
e750: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  nal..**.** The i
e760: 73 4d 61 69 6e 4a 72 6e 6c 20 66 6c 61 67 20 69  sMainJrnl flag i
e770: 73 20 74 72 75 65 20 69 66 20 74 68 69 73 20 69  s true if this i
e780: 73 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  s the main rollb
e790: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a  ack journal and.
e7a0: 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 74 68 65  ** false for the
e7b0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
e7c0: 61 6c 2e 20 20 54 68 65 20 6d 61 69 6e 20 72 6f  al.  The main ro
e7d0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75  llback journal u
e7e0: 73 65 73 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 73  ses.** checksums
e7f0: 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74   - the statement
e800: 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f   journal does no
e810: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
e820: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
e830: 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 72  he page record r
e840: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
e850: 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  b-)journal file.
e860: 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
e870: 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  an the current v
e880: 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
e890: 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62  Size, then playb
e8a0: 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65  ack is.** skippe
e8b0: 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
e8c0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
e8d0: 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e  ** If pDone is n
e8e0: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  ot NULL, then it
e8f0: 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20   is a record of 
e900: 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20  pages that have 
e910: 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20  already.** been 
e920: 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66  played back.  If
e930: 20 74 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f   the page at *pO
e940: 66 66 73 65 74 20 68 61 73 20 61 6c 72 65 61 64  ffset has alread
e950: 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61  y been played ba
e960: 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f  ck.** (if the co
e970: 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e  rresponding pDon
e980: 65 20 62 69 74 20 69 73 20 73 65 74 29 20 74 68  e bit is set) th
e990: 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79  en skip the play
e9a0: 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75  back..** Make su
e9b0: 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74  re the pDone bit
e9c0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
e9d0: 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70  o the *pOffset p
e9e0: 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72  age is set.** pr
e9f0: 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67  ior to returning
ea00: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
ea10: 61 67 65 20 72 65 63 6f 72 64 20 69 73 20 73 75  age record is su
ea20: 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20  ccessfully read 
ea30: 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
ea40: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61  ournal file.** a
ea50: 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20  nd played back, 
ea60: 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  then SQLITE_OK i
ea70: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
ea80: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
ea90: 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69  s.** while readi
eaa0: 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 66 72  ng the record fr
eab0: 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
eac0: 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69  rnal file or whi
ead0: 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f  le writing.** to
eae0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
eaf0: 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  le, then the IO 
eb00: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
eb10: 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a  turned. If data.
eb20: 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ** is successful
eb30: 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ly read from the
eb40: 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
eb50: 69 6c 65 20 62 75 74 20 61 70 70 65 61 72 73 20  ile but appears 
eb60: 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74  to be.** corrupt
eb70: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
eb80: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74  is returned. Dat
eb90: 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  a is considered 
eba0: 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20  corrupted in.** 
ebb0: 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65  two circumstance
ebc0: 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66  s:.** .**   * If
ebd0: 20 74 68 65 20 72 65 63 6f 72 64 20 70 61 67 65   the record page
ebe0: 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67  -number is illeg
ebf0: 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d  al (0 or PAGER_M
ec00: 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20  J_PGNO), or.**  
ec10: 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64   * If the record
ec20: 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
ec30: 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d   back from the m
ec40: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
ec50: 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20  .**     and the 
ec60: 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64  checksum field d
ec70: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
ec80: 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74  e record content
ec90: 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20  ..**.** Neither 
eca0: 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73 63 65  of these two sce
ecb0: 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69  narios are possi
ecc0: 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61 76  ble during a sav
ecd0: 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e  epoint rollback.
ece0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69  .**.** If this i
ecf0: 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  s a savepoint ro
ed00: 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d  llback, then mem
ed10: 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20  ory may have to 
ed20: 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a  be dynamically.*
ed30: 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  * allocated by t
ed40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66  his function. If
ed50: 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
ed60: 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74  e and an allocat
ed70: 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51  ion fails,.** SQ
ed80: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
ed90: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
eda0: 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
edb0: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20  back_one_page(. 
edc0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
edd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ede0: 2a 20 54 68 65 20 70 61 67 65 72 20 62 65 69 6e  * The pager bein
edf0: 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f  g played back */
ee00: 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c  .  i64 *pOffset,
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee20: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65   /* Offset of re
ee30: 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b  cord to playback
ee40: 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44   */.  Bitvec *pD
ee50: 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  one,            
ee60: 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66      /* Bitvec of
ee70: 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 70   pages already p
ee80: 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20  layed back */.  
ee90: 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20  int isMainJrnl, 
eea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
eeb0: 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e   1 -> main journ
eec0: 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75  al. 0 -> sub-jou
eed0: 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69  rnal. */.  int i
eee0: 73 53 61 76 65 70 6e 74 20 20 20 20 20 20 20 20  sSavepnt        
eef0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
ef00: 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74   for a savepoint
ef10: 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a   rollback */.){.
ef20: 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
ef30: 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20  r *pPg;         
ef40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
ef50: 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e  existing page in
ef60: 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20   the cache */.  
ef70: 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20  Pgno pgno;      
ef80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ef90: 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
efa0: 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f   of a page in jo
efb0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63  urnal */.  u32 c
efc0: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
efd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
efe0: 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61  ksum used for sa
eff0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f  nity checking */
f000: 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20  .  char *aData; 
f010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f020: 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74   /* Temporary st
f030: 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20 70 61  orage for the pa
f040: 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ge */.  sqlite3_
f050: 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20  file *jfd;      
f060: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
f070: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
f080: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
f090: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e  e */.  int isSyn
f0a0: 63 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ced;            
f0b0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
f0c0: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20  journal page is 
f0d0: 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73  synced */..  ass
f0e0: 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c  ert( (isMainJrnl
f0f0: 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
f100: 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73  /* isMainJrnl is
f110: 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
f120: 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26  ert( (isSavepnt&
f130: 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  ~1)==0 );       
f140: 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20  /* isSavepnt is 
f150: 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
f160: 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c  rt( isMainJrnl |
f170: 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f  | pDone );     /
f180: 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75  * pDone always u
f190: 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e  sed on sub-journ
f1a0: 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  als */.  assert(
f1b0: 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44   isSavepnt || pD
f1c0: 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70  one==0 );   /* p
f1d0: 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20  Done never used 
f1e0: 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74  on non-savepoint
f1f0: 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70   */..  aData = p
f200: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
f210: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74  ;.  assert( aDat
f220: 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  a );         /* 
f230: 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73  Temp storage mus
f240: 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
f250: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  een allocated */
f260: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
f270: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
f280: 70 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74  page data from t
f290: 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75  he journal or su
f2a0: 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  b-journal.  ** f
f2b0: 69 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65  ile. Return an e
f2c0: 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65  rror code to the
f2d0: 20 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f   caller if an IO
f2e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20   error occurs.. 
f2f0: 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61   */.  jfd = isMa
f300: 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d  inJrnl ? pPager-
f310: 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73  >jfd : pPager->s
f320: 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  jfd;.  rc = read
f330: 33 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66  32bits(jfd, *pOf
f340: 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  fset, &pgno);.  
f350: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f360: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
f370: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
f380: 65 61 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44  ead(jfd, (u8*)aD
f390: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
f3a0: 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74  eSize, (*pOffset
f3b0: 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  )+4);.  if( rc!=
f3c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
f3d0: 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65  rn rc;.  *pOffse
f3e0: 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  t += pPager->pag
f3f0: 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61  eSize + 4 + isMa
f400: 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20  inJrnl*4;..  /* 
f410: 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
f420: 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68  on the page.  Th
f430: 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72  is is more impor
f440: 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67  tant that I orig
f450: 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75  inally.  ** thou
f460: 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72  ght.  If a power
f470: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
f480: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
f490: 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  l is being writt
f4a0: 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c  en,.  ** it coul
f4b0: 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20  d cause invalid 
f4c0: 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74  data to be writt
f4d0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
f4e0: 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  nal.  We need to
f4f0: 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69  .  ** detect thi
f500: 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28  s invalid data (
f510: 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62  with high probab
f520: 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72  ility) and ignor
f530: 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  e it..  */.  if(
f540: 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
f550: 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
f560: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61  pPager) ){.    a
f570: 73 73 65 72 74 28 20 21 69 73 53 61 76 65 70 6e  ssert( !isSavepn
f580: 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  t );.    return 
f590: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
f5a0: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e  .  if( pgno>(Pgn
f5b0: 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  o)pPager->dbSize
f5c0: 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65   || sqlite3Bitve
f5d0: 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e  cTest(pDone, pgn
f5e0: 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  o) ){.    return
f5f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
f600: 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
f610: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61   ){.    rc = rea
f620: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70  d32bits(jfd, (*p
f630: 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75  Offset)-4, &cksu
f640: 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  m);.    if( rc )
f650: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
f660: 69 66 28 20 21 69 73 53 61 76 65 70 6e 74 20 26  if( !isSavepnt &
f670: 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  & pager_cksum(pP
f680: 61 67 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61  ager, (u8*)aData
f690: 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  )!=cksum ){.    
f6a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f6b0: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
f6c0: 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20  .  if( pDone && 
f6d0: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74  (rc = sqlite3Bit
f6e0: 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67  vecSet(pDone, pg
f6f0: 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  no))!=SQLITE_OK 
f700: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
f710: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
f720: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
f730: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c  PAGER_RESERVED |
f740: 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  | pPager->state>
f750: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
f760: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
f770: 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53   pager is in RES
f780: 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65  ERVED state, the
f790: 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
f7a0: 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20  a copy of this. 
f7b0: 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
f7c0: 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20  pager cache. In 
f7d0: 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75  this case just u
f7e0: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
f7f0: 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20  cache,.  ** not 
f800: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
f810: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c  e. The page is l
f820: 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79  eft marked dirty
f830: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
f840: 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65   **.  ** An exce
f850: 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f  ption to the abo
f860: 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20  ve rule: If the 
f870: 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e  database is in n
f880: 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a  o-sync mode.  **
f890: 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d   and a page is m
f8a0: 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69  oved during an i
f8b0: 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
f8c0: 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  m then the page 
f8d0: 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20  may.  ** not be 
f8e0: 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
f8f0: 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20  he. Later: if a 
f900: 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65  malloc() or IO e
f910: 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a  rror occurs.  **
f920: 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61   during a Movepa
f930: 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20  ge() call, then 
f940: 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74  the page may not
f950: 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65   be in the cache
f960: 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f  .  ** either. So
f970: 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64   the condition d
f980: 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20  escribed in the 
f990: 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20  above paragraph 
f9a0: 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65  is not.  ** asse
f9b0: 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20  rt()able..  **. 
f9c0: 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53   ** If in EXCLUS
f9d0: 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20  IVE state, then 
f9e0: 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61  we update the pa
f9f0: 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20  ger cache if it 
fa00: 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20  exists.  ** and 
fa10: 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54  the main file. T
fa20: 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20  he page is then 
fa30: 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79  marked not dirty
fa40: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b  ..  **.  ** Tick
fa50: 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73  et #1171:  The s
fa60: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
fa70: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70   might contain p
fa80: 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74  age content that
fa90: 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65   is.  ** differe
faa0: 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
fab0: 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20   content at the 
fac0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
fad0: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nsaction..  ** T
fae0: 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20  his occurs when 
faf0: 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65  a page is change
fb00: 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  d prior to the s
fb10: 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d  tart of a statem
fb20: 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68  ent.  ** then ch
fb30: 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68  anged again with
fb40: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
fb50: 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  .  When rolling 
fb60: 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a  back such a.  **
fb70: 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75   statement we mu
fb80: 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  st not write to 
fb90: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
fba0: 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20  abase unless we 
fbb0: 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65  know.  ** for ce
fbc0: 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69  rtain that origi
fbd0: 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
fbe0: 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74  s are synced int
fbf0: 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  o the main rollb
fc00: 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ack.  ** journal
fc10: 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  .  Otherwise, a 
fc20: 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74  power loss might
fc30: 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20   leave modified 
fc40: 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a  data in the.  **
fc50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
fc60: 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20  ithout an entry 
fc70: 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
fc80: 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e  journal that can
fc90: 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68  .  ** restore th
fca0: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
fcb0: 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e  s original form.
fcc0: 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73    Two conditions
fcd0: 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65   must be.  ** me
fce0: 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  t before writing
fcf0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
fd00: 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20   files. (1) the 
fd10: 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
fd20: 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28  .  ** locked.  (
fd30: 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  2) we know that 
fd40: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
fd50: 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c  e content is ful
fd60: 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69  ly synced.  ** i
fd70: 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  n the main journ
fd80: 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  al either becaus
fd90: 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  e the page is no
fda0: 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c  t in cache or el
fdb0: 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  se.  ** the page
fdc0: 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65   is marked as ne
fdd0: 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a  edSync==0..  **.
fde0: 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a    ** 2008-04-14:
fdf0: 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e    When attemptin
fe00: 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f  g to vacuum a co
fe10: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
fe20: 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20  ile, it.  ** is 
fe30: 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c  possible to fail
fe40: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20   a statement on 
fe50: 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  a database that 
fe60: 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69  does not yet exi
fe70: 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20  st..  ** Do not 
fe80: 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
fe90: 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c   if database fil
fea0: 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e  e has never been
feb0: 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20   opened..  */.  
fec0: 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
fed0: 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
fee0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 20  ;.  assert( pPg 
fef0: 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 50  || !MEMDB );.  P
ff00: 41 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59  AGERTRACE(("PLAY
ff10: 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20  BACK %d page %d 
ff20: 68 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22  hash(%08x) %s\n"
ff30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50 41 47  ,.           PAG
ff40: 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
ff50: 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61  no, pager_dataha
ff60: 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  sh(pPager->pageS
ff70: 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29  ize, (u8*)aData)
ff80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 69 73  ,.           (is
ff90: 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a  MainJrnl?"main-j
ffa0: 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75  ournal":"sub-jou
ffb0: 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69  rnal").  ));.  i
ffc0: 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b  f( isMainJrnl ){
ffd0: 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20  .    isSynced = 
ffe0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c  pPager->noSync |
fff0: 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70  | (*pOffset <= p
10000 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
10010 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
10020 20 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67   isSynced = (pPg
10030 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e  ==0 || 0==(pPg->
10040 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45  flags & PGHDR_NE
10050 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20  ED_SYNC));.  }. 
10060 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74   if( (pPager->st
10070 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
10080 53 49 56 45 29 0a 20 20 20 26 26 20 69 73 4f 70  SIVE).   && isOp
10090 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20  en(pPager->fd). 
100a0 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a 20 20    && isSynced.  
100b0 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20  ){.    i64 ofst 
100c0 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
100d0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
100e0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
100f0 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 50  !isSavepnt && pP
10100 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e 66 6c  g!=0 && (pPg->fl
10110 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
10120 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20 20 72  YNC)!=0 );.    r
10130 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
10140 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  te(pPager->fd, (
10150 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
10160 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73  r->pageSize, ofs
10170 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f  t);.    if( pgno
10180 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
10190 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ize ){.      pPa
101a0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
101b0 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  = pgno;.    }.  
101c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42    if( pPager->pB
101d0 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 43  ackup ){.      C
101e0 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44  ODEC1(pPager, aD
101f0 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63  ata, pgno, 3, rc
10200 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a  =SQLITE_NOMEM);.
10210 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
10220 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
10230 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c  ->pBackup, pgno,
10240 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20   (u8*)aData);.  
10250 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
10260 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20  r, aData, pgno, 
10270 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  7, rc=SQLITE_NOM
10280 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20  EM, aData);.    
10290 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69  }.  }else if( !i
102a0 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67  sMainJrnl && pPg
102b0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
102c0 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62   this is a rollb
102d0 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69  ack of a savepoi
102e0 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73 20  nt and data was 
102f0 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  not written to. 
10300 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
10310 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  se and the page 
10320 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79  is not in-memory
10330 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 74  , there is a pot
10340 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72  ential.    ** pr
10350 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20  oblem. When the 
10360 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65 74  page is next fet
10370 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74 72  ched by the b-tr
10380 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20  ee layer, it .  
10390 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61    ** will be rea
103a0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
103b0 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
103c0 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
103d0 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  e .    ** curren
103e0 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  t. .    **.    *
103f0 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63 6f  * There are a co
10400 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e  uple of differen
10410 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e 20  t ways this can 
10420 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20  happen. All are 
10430 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73  quite.    ** obs
10440 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69  cure. When runni
10450 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75  ng in synchronou
10460 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e  s mode, this can
10470 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20   only happen .  
10480 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65    ** if the page
10490 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d   is on the free-
104a0 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61 72  list at the star
104b0 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
104c0 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  tion, then.    *
104d0 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65  * populated, the
104e0 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71  n moved using sq
104f0 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
10500 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ge()..    **.   
10510 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e   ** The solution
10520 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e   is to add an in
10530 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20  -memory page to 
10540 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69  the cache contai
10550 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ning.    ** the 
10560 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20 66  data just read f
10570 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
10580 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61  nal. Mark the pa
10590 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20 20  ge as dirty .   
105a0 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70   ** and if the p
105b0 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61 20  ager requires a 
105c0 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68  journal-sync, th
105d0 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  en mark the page
105e0 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75   as .    ** requ
105f0 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d  iring a journal-
10600 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69  sync before it i
10610 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a  s written..    *
10620 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  /.    assert( is
10630 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 69  Savepnt );.    i
10640 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  f( (rc = sqlite3
10650 50 61 67 65 72 41 63 71 75 69 72 65 28 70 50 61  PagerAcquire(pPa
10660 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c  ger, pgno, &pPg,
10670 20 31 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   1))!=SQLITE_OK 
10680 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
10690 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  rc;.    }.    pP
106a0 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48  g->flags &= ~PGH
106b0 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20  DR_NEED_READ;.  
106c0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
106d0 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
106e0 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a   }.  if( pPg ){.
106f0 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73      /* No page s
10700 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65 78  hould ever be ex
10710 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20  plicitly rolled 
10720 62 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20  back that is in 
10730 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20  use, except.    
10740 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77 68  ** for page 1 wh
10750 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75  ich is held in u
10760 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b  se in order to k
10770 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  eep the lock on 
10780 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
10790 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65  ase active. Howe
107a0 76 65 72 20 73 75 63 68 20 61 20 70 61 67 65 20  ver such a page 
107b0 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  may be rolled ba
107c0 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20  ck as a result. 
107d0 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65     ** of an inte
107e0 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c  rnal error resul
107f0 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d  ting in an autom
10800 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20  atic call to.   
10810 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
10820 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20  Rollback()..    
10830 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61  */.    void *pDa
10840 74 61 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20  ta;.    pData = 
10850 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20  pPg->pData;.    
10860 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 28 75  memcpy(pData, (u
10870 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72  8*)aData, pPager
10880 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
10890 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
108a0 65 72 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28  er(pPg);.    if(
108b0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28   isMainJrnl && (
108c0 21 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70  !isSavepnt || *p
108d0 4f 66 66 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e  Offset<=pPager->
108e0 6a 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20  journalHdr) ){. 
108f0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
10900 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20  ontents of this 
10910 70 61 67 65 20 77 65 72 65 20 6a 75 73 74 20 72  page were just r
10920 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65  estored from the
10930 20 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20   main .      ** 
10940 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
10950 65 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d  en its content m
10960 75 73 74 20 62 65 20 61 73 20 74 68 65 79 20 77  ust be as they w
10970 65 72 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20  ere when the .  
10980 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
10990 6f 6e 20 77 61 73 20 66 69 72 73 74 20 6f 70 65  on was first ope
109a0 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
109b0 65 20 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68  e we can mark th
109c0 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  e page.      ** 
109d0 61 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20  as clean, since 
109e0 74 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f  there will be no
109f0 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 69   need to write i
10a00 74 20 6f 75 74 20 74 6f 20 74 68 65 0a 20 20 20  t out to the.   
10a10 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a     ** database..
10a20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
10a30 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 65  * There is one e
10a40 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 69 73  xception to this
10a50 20 72 75 6c 65 2e 20 49 66 20 74 68 65 20 70 61   rule. If the pa
10a60 67 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  ge is being roll
10a70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  ed.      ** back
10a80 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 73 61   as part of a sa
10a90 76 65 70 6f 69 6e 74 20 28 6f 72 20 73 74 61 74  vepoint (or stat
10aa0 65 6d 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20  ement) rollback 
10ab0 66 72 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a  from an .      *
10ac0 2a 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69  * unsynced porti
10ad0 6f 6e 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  on of the main j
10ae0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
10af0 6e 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65  n it is not safe
10b00 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72  .      ** to mar
10b10 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  k the page as cl
10b20 65 61 6e 2e 20 54 68 69 73 20 69 73 20 62 65 63  ean. This is bec
10b30 61 75 73 65 20 6d 61 72 6b 69 6e 67 20 74 68 65  ause marking the
10b40 20 70 61 67 65 20 61 73 0a 20 20 20 20 20 20 2a   page as.      *
10b50 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65  * clean will cle
10b60 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ar the PGHDR_NEE
10b70 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e  D_SYNC flag. Sin
10b80 63 65 20 74 68 65 20 70 61 67 65 20 69 73 0a 20  ce the page is. 
10b90 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20       ** already 
10ba0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
10bb0 69 6c 65 20 28 72 65 63 6f 72 64 65 64 20 69 6e  ile (recorded in
10bc0 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
10bd0 6c 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  l) and.      ** 
10be0 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
10bf0 59 4e 43 20 66 6c 61 67 20 69 73 20 63 6c 65 61  YNC flag is clea
10c00 72 65 64 2c 20 69 66 20 74 68 65 20 70 61 67 65  red, if the page
10c10 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 20   is written to. 
10c20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69       ** again wi
10c30 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  thin this transa
10c40 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62  ction, it will b
10c50 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  e marked as dirt
10c60 79 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 74  y but.      ** t
10c70 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
10c80 4e 43 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74  NC flag will not
10c90 20 62 65 20 73 65 74 2e 20 49 74 20 63 6f 75 6c   be set. It coul
10ca0 64 20 74 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c  d then potential
10cb0 6c 79 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 77  ly.      ** be w
10cc0 72 69 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20  ritten out into 
10cd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
10ce0 65 20 62 65 66 6f 72 65 20 69 74 73 20 6a 6f 75  e before its jou
10cf0 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20  rnal file.      
10d00 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 73 79  ** segment is sy
10d10 6e 63 65 64 2e 20 49 66 20 61 20 63 72 61 73 68  nced. If a crash
10d20 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6f   occurs during o
10d30 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  r following this
10d40 2c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  ,.      ** datab
10d50 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d  ase corruption m
10d60 61 79 20 65 6e 73 75 65 2e 0a 20 20 20 20 20 20  ay ensue..      
10d70 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
10d80 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
10d90 70 50 67 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  pPg);.    }.#ifd
10da0 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
10db0 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70  PAGES.    pPg->p
10dc0 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
10dd0 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
10de0 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20  endif.    /* If 
10df0 74 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c  this was page 1,
10e00 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68   then restore th
10e10 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  e value of Pager
10e20 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20  .dbFileVers..   
10e30 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f   ** Do this befo
10e40 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e  re any decoding.
10e50 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
10e60 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==1 ){.      mem
10e70 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
10e80 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29  ileVers, &((u8*)
10e90 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f  pData)[24],sizeo
10ea0 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
10eb0 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  Vers));.    }.. 
10ec0 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65     /* Decode the
10ed0 20 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20   page just read 
10ee0 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20  from disk */.   
10ef0 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
10f00 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
10f10 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
10f20 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74  OMEM);.    sqlit
10f30 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28  e3PcacheRelease(
10f40 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pPg);.  }.  retu
10f50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10f60 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65  Parameter zMaste
10f70 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  r is the name of
10f80 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
10f90 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65  l file. A single
10fa0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
10fb0 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74   that referred t
10fc0 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
10fd0 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75  rnal file has ju
10fe0 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  st been rolled b
10ff0 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ack..** This rou
11000 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69  tine checks if i
11010 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
11020 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
11030 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  er journal file,
11040 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20  .** and does so 
11050 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  if it is..**.** 
11060 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72  Argument zMaster
11070 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61   may point to Pa
11080 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53  ger.pTmpSpace. S
11090 6f 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73  o that buffer is
110a0 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62   not .** availab
110b0 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69  le for use withi
110c0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  n this function.
110d0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61  .**.** When a ma
110e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
110f0 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 69 74  e is created, it
11100 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
11110 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a  th the names .**
11120 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63   of all of its c
11130 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f  hild journals, o
11140 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72  ne after another
11150 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75  , formatted as u
11160 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64  tf-8 .** encoded
11170 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f   text. The end o
11180 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75  f each child jou
11190 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72  rnal file is mar
111a0 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e  ked with a .** n
111b0 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79  ul-terminator by
111c0 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20  te (0x00). i.e. 
111d0 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
111e0 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20  nts of a master 
111f0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
11200 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
11210 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20  n involving two 
11220 64 61 74 61 62 61 73 65 73 20 6d 69 67 68 74 20  databases might 
11230 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f  be:.**.**   "/ho
11240 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75  me/bill/a.db-jou
11250 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69  rnal\x00/home/bi
11260 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c  ll/b.db-journal\
11270 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73  x00".**.** A mas
11280 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11290 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c   may only be del
112a0 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66  eted once all of
112b0 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a   its child .** j
112c0 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65  ournals have bee
112d0 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
112e0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
112f0 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e  on reads the con
11300 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73  tents of the mas
11310 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
11320 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79   into .** memory
11330 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75   and loops throu
11340 67 68 20 65 61 63 68 20 6f 66 20 74 68 65 20 63  gh each of the c
11350 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  hild journal nam
11360 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20  es. For.** each 
11370 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69  child journal, i
11380 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a  t checks if:.**.
11390 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68  **   * if the ch
113a0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ild journal exis
113b0 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a  ts, and if so.**
113c0 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c     * if the chil
113d0 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69  d journal contai
113e0 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ns a reference t
113f0 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
11400 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d   .**     file zM
11410 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61  aster.**.** If a
11420 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
11430 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74  an be found that
11440 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66   matches both of
11450 20 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a   the criteria.**
11460 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e   above, this fun
11470 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
11480 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
11490 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c  hing. Otherwise,
114a0 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63   if.** no such c
114b0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  hild journal can
114c0 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20   be found, file 
114d0 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65 74  zMaster is delet
114e0 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66  ed from.** the f
114f0 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67  ile-system using
11500 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
11510 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ()..**.** If an 
11520 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20  IO error within 
11530 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
11540 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
11550 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a  returned. This.*
11560 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  * function alloc
11570 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63  ates memory by c
11580 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61  alling sqlite3Ma
11590 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c  lloc(). If an al
115a0 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c  location.** fail
115b0 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
115c0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
115d0 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f  erwise, if no IO
115e0 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72   or malloc error
115f0 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c  s .** occur, SQL
11600 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
11610 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20  ed..**.** TODO: 
11620 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
11630 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65  locates a single
11640 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79   block of memory
11650 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20   to load.** the 
11660 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
11670 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
11680 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
11690 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63   could be.** a c
116a0 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74  ouple of kilobyt
116b0 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e  es or so - poten
116c0 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68  tially larger th
116d0 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20  an the page .** 
116e0 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
116f0 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  int pager_delmas
11700 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
11710 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
11720 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74  Master){.  sqlit
11730 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
11740 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
11750 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
11760 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
11770 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn code */.  sql
11780 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74  ite3_file *pMast
11790 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  er;    /* Malloc
117a0 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  'd master-journa
117b0 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
117c0 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  r */.  sqlite3_f
117d0 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20  ile *pJournal;  
117e0 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69   /* Malloc'd chi
117f0 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ld-journal file 
11800 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
11810 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75  char *zMasterJou
11820 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e  rnal = 0; /* Con
11830 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20  tents of master 
11840 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
11850 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75    i64 nMasterJou
11860 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53  rnal;       /* S
11870 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ize of master jo
11880 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20  urnal file */.. 
11890 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
118a0 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20  ce for both the 
118b0 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61  pJournal and pMa
118c0 73 74 65 72 20 66 69 6c 65 20 64 65 73 63 72 69  ster file descri
118d0 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73  ptors..  ** If s
118e0 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20  uccessful, open 
118f0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
11900 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  al file for read
11910 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73  ing..  */.  pMas
11920 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  ter = (sqlite3_f
11930 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  ile *)sqlite3Mal
11940 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a  locZero(pVfs->sz
11950 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70  OsFile * 2);.  p
11960 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74  Journal = (sqlit
11970 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20  e3_file *)(((u8 
11980 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66  *)pMaster) + pVf
11990 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20  s->szOsFile);.  
119a0 69 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a  if( !pMaster ){.
119b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
119c0 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
119d0 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c      const int fl
119e0 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
119f0 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
11a00 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
11a10 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20  OURNAL);.    rc 
11a20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
11a30 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70  pVfs, zMaster, p
11a40 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30  Master, flags, 0
11a50 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
11a60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
11a70 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
11a80 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
11a90 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74  OsFileSize(pMast
11aa0 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72  er, &nMasterJour
11ab0 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  nal);.  if( rc!=
11ac0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
11ad0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
11ae0 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f  .  if( nMasterJo
11af0 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63  urnal>0 ){.    c
11b00 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20  har *zJournal;. 
11b10 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
11b20 50 74 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Ptr = 0;.    int
11b30 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56   nMasterPtr = pV
11b40 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
11b50 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74  ;..    /* Load t
11b60 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
11b70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
11b80 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
11b90 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71  d from.    ** sq
11ba0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61  lite3_malloc() a
11bb0 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  nd pointed to by
11bc0 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e   zMasterJournal.
11bd0 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61   .    */.    zMa
11be0 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  sterJournal = sq
11bf0 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74  lite3Malloc((int
11c00 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  )nMasterJournal 
11c10 2b 20 6e 4d 61 73 74 65 72 50 74 72 20 2b 20 31  + nMasterPtr + 1
11c20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73  );.    if( !zMas
11c30 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
11c40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11c50 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
11c60 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
11c70 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74  .    }.    zMast
11c80 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72  erPtr = &zMaster
11c90 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
11ca0 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 20 20 72  ournal+1];.    r
11cb0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
11cc0 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74  d(pMaster, zMast
11cd0 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29  erJournal, (int)
11ce0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  nMasterJournal, 
11cf0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
11d00 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
11d10 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
11d20 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e      zMasterJourn
11d30 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al[nMasterJourna
11d40 6c 5d 20 3d 20 30 3b 0a 0a 20 20 20 20 7a 4a 6f  l] = 0;..    zJo
11d50 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a  urnal = zMasterJ
11d60 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c  ournal;.    whil
11d70 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61  e( (zJournal-zMa
11d80 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61  sterJournal)<nMa
11d90 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
11da0 20 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b       int exists;
11db0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
11dc0 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
11dd0 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  , zJournal, SQLI
11de0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
11df0 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20  , &exists);.    
11e00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11e10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
11e20 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
11e30 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
11e40 20 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20   if( exists ){. 
11e50 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
11e60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
11e70 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
11e80 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
11e90 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  xists..        *
11ea0 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68  * Open it and ch
11eb0 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73  eck if it points
11ec0 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a   at the master j
11ed0 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20  ournal. If.     
11ee0 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
11ef0 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
11f00 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
11f10 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
11f20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
11f30 74 20 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  t c;.        int
11f40 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45   flags = (SQLITE
11f50 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
11f60 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
11f70 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20  JOURNAL);.      
11f80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11f90 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72  Open(pVfs, zJour
11fa0 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66  nal, pJournal, f
11fb0 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20  lags, 0);.      
11fc0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11fd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
11fe0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
11ff0 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
12000 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61          rc = rea
12010 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
12020 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72  Journal, zMaster
12030 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29  Ptr, nMasterPtr)
12040 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12050 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61  3OsClose(pJourna
12060 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
12070 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12080 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
12090 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
120a0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
120b0 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72    c = zMasterPtr
120c0 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70  [0]!=0 && strcmp
120d0 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61  (zMasterPtr, zMa
120e0 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20  ster)==0;.      
120f0 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20    if( c ){.     
12100 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20       /* We have 
12110 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20  a match. Do not 
12120 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
12130 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
12140 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  */.          got
12150 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
12160 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12170 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61   }.      zJourna
12180 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72  l += (sqlite3Str
12190 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b  len30(zJournal)+
121a0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
121b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
121c0 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
121d0 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d  aster, 0);..delm
121e0 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28  aster_out:.  if(
121f0 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
12200 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
12210 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ree(zMasterJourn
12220 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28  al);.  }  .  if(
12230 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20   pMaster ){.    
12240 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
12250 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73  Master);.    ass
12260 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f  ert( !isOpen(pJo
12270 75 72 6e 61 6c 29 20 29 3b 0a 20 20 7d 0a 20 20  urnal) );.  }.  
12280 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61  sqlite3_free(pMa
12290 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ster);.  return 
122a0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
122b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
122c0 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68  sed to change th
122d0 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  e actual size of
122e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
122f0 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  * file in the fi
12300 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20  le-system. This 
12310 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
12320 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
12330 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f  ransaction,.** o
12340 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
12350 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e   transaction (in
12360 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20  cluding rolling 
12370 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
12380 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
12390 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
123a0 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e  file is not open
123b0 2c 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76  , or an exclusiv
123c0 65 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a 2a 2a  e lock is not.**
123d0 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63   held, this func
123e0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
123f0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
12400 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
12410 20 69 73 0a 2a 2a 20 63 68 61 6e 67 65 64 20 74   is.** changed t
12420 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e  o nPage pages (n
12430 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67  Page*pPager->pag
12440 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20 49 66  eSize bytes). If
12450 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 6f 6e 20   the file.** on 
12460 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  disk is currentl
12470 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50  y larger than nP
12480 61 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20  age pages, then 
12490 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78  use the VFS.** x
124a0 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f  Truncate() metho
124b0 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74  d to truncate it
124c0 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d  ..**.** Or, it m
124d0 69 67 68 74 20 6d 69 67 68 74 20 62 65 20 74 68  ight might be th
124e0 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  e case that the 
124f0 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
12500 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a  smaller than .**
12510 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f   nPage pages. So
12520 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  me operating sys
12530 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tem implementati
12540 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66  ons can get conf
12550 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20  used if .** you 
12560 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20  try to truncate 
12570 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73  a file to some s
12580 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67  ize that is larg
12590 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63  er than it .** c
125a0 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20  urrently is, so 
125b0 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65  detect this case
125c0 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e   and write a sin
125d0 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f  gle zero byte to
125e0 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20   .** the end of 
125f0 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73  the new file ins
12600 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  tead..**.** If s
12610 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
12620 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  n SQLITE_OK. If 
12630 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
12640 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69  rs while modifyi
12650 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  ng.** the databa
12660 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20  se file, return 
12670 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
12680 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
12690 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
126a0 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
126b0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
126c0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
126d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
126e0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
126f0 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
12700 45 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  E && isOpen(pPag
12710 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 69  er->fd) ){.    i
12720 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20  64 currentSize, 
12730 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 2f 2a 20  newSize;.    /* 
12740 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65  TODO: Is it safe
12750 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62   to use Pager.db
12760 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a  FileSize here? *
12770 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
12780 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
12790 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e  ger->fd, &curren
127a0 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53  tSize);.    newS
127b0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
127c0 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67  geSize*(i64)nPag
127d0 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  e;.    if( rc==S
127e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72  QLITE_OK && curr
127f0 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65  entSize!=newSize
12800 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75   ){.      if( cu
12810 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a  rrentSize>newSiz
12820 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
12830 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
12840 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ate(pPager->fd, 
12850 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  newSize);.      
12860 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
12870 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
12880 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 22  te(pPager->fd, "
12890 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29  ", 1, newSize-1)
128a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
128b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
128c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
128d0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
128e0 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  = nPage;.      }
128f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
12900 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
12910 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Set the value o
12920 66 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74  f the Pager.sect
12930 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
12940 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
12950 20 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20   pager based on 
12960 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
12970 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
12980 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20  rSize method.** 
12990 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  of the open data
129a0 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73  base file. The s
129b0 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20  ector size will 
129c0 62 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a  be used used .**
129d0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
129e0 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e  e size and align
129f0 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ment of journal 
12a00 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d  header and .** m
12a10 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
12a20 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72  inters within cr
12a30 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69  eated journal fi
12a40 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
12a50 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74  emporary files t
12a60 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
12a70 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61  tor size is alwa
12a80 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a  ys 512 bytes..**
12a90 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66  .** Otherwise, f
12aa0 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79  or non-temporary
12ab0 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65   files, the effe
12ac0 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
12ad0 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75  e is.** the valu
12ae0 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
12af0 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20  e xSectorSize() 
12b00 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75  method rounded u
12b10 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74  p to 32 if.** it
12b20 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32   is less than 32
12b30 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77  , or rounded dow
12b40 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f  n to MAX_SECTOR_
12b50 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73  SIZE if it.** is
12b60 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41   greater than MA
12b70 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a  X_SECTOR_SIZE..*
12b80 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
12b90 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65  tSectorSize(Page
12ba0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
12bb0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
12bc0 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
12bd0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
12be0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
12bf0 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
12c00 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64  /* Sector size d
12c10 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f  oesn't matter fo
12c20 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
12c30 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c  s. Also, the fil
12c40 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74  e.    ** may not
12c50 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
12c60 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20  d yet, in which 
12c70 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f  case the OsSecto
12c80 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63  rSize().    ** c
12c90 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c  all will segfaul
12ca0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  t..    */.    pP
12cb0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
12cc0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74   = sqlite3OsSect
12cd0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  orSize(pPager->f
12ce0 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  d);.  }.  if( pP
12cf0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
12d00 3c 33 32 20 29 7b 0a 20 20 20 20 70 50 61 67 65  <32 ){.    pPage
12d10 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
12d20 35 31 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  512;.  }.  if( p
12d30 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
12d40 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  e>MAX_SECTOR_SIZ
12d50 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  E ){.    assert(
12d60 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
12d70 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 70 50 61  >=512 );.    pPa
12d80 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
12d90 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  = MAX_SECTOR_SIZ
12da0 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  E;.  }.}../*.** 
12db0 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75  Playback the jou
12dc0 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65  rnal and thus re
12dd0 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
12de0 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68  se file to.** th
12df0 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
12e00 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72  n before we star
12e10 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  ted making chang
12e20 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es.  .**.** The 
12e30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
12e40 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  mat is as follow
12e50 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20  s: .**.**  (1)  
12e60 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20  8 byte prefix.  
12e70 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e  A copy of aJourn
12e80 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28  alMagic[]..**  (
12e90 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  2)  4 byte big-e
12ea0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
12eb0 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
12ec0 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20  r of valid page 
12ed0 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20  records.**      
12ee0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
12ef0 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
12f00 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
12f10 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  hen compute the.
12f20 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20  **       number 
12f30 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
12f40 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
12f50 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20   size..**  (3)  
12f60 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
12f70 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
12f80 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
12f90 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  alue for the .**
12fa0 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68         sanity ch
12fb0 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20  ecksum..**  (4) 
12fc0 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
12fd0 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
12fe0 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
12ff0 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
13000 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74        database t
13010 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  o during a rollb
13020 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20  ack..**  (5)  4 
13030 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
13040 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
13050 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
13060 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a  .  The header.**
13070 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d         is this m
13080 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a  any bytes in siz
13090 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79  e..**  (6)  4 by
130a0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
130b0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
130c0 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
130d0 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64    (7)  zero padd
130e0 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e  ing out to the n
130f0 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  ext sector size.
13100 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f  .**  (8)  Zero o
13110 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73  r more pages ins
13120 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20  tances, each as 
13130 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20  follows:.**     
13140 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67     +  4 byte pag
13150 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20  e number..**    
13160 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70      +  pPager->p
13170 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
13180 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20   data..**       
13190 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b   +  4 byte check
131a0 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77  sum.**.** When w
131b0 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a  e speak of the j
131c0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77  ournal header, w
131d0 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74  e mean the first
131e0 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a   7 items above..
131f0 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e  ** Each entry in
13200 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
13210 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
13220 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a  he 8th item..**.
13230 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75  ** Call the valu
13240 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  e from the secon
13250 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e  d bullet "nRec".
13260 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75    nRec is the nu
13270 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64  mber of.** valid
13280 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e   page entries in
13290 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
132a0 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f  n most cases, yo
132b0 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  u can compute th
132c0 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52  e.** value of nR
132d0 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ec from the size
132e0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
132f0 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20  file.  But if a 
13300 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
13310 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
13320 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
13330 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69  being written, i
13340 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a  t could be the.*
13350 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  * case that the 
13360 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
13370 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72  nal file had alr
13380 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61  eady been increa
13390 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65  sed but.** the e
133a0 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64  xtra entries had
133b0 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74   not yet made it
133c0 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e   safely to disk.
133d0 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65    In such a case
133e0 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
133f0 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  f nRec computed 
13400 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
13410 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20  ze would be too 
13420 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  large.  For.** t
13430 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61  hat reason, we a
13440 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52  lways use the nR
13450 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
13460 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  header..**.** If
13470 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
13480 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74  is 0xffffffff it
13490 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63   means that nRec
134a0 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
134b0 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
134c0 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73  file size.  This
134d0 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77   value is used w
134e0 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c  hen the user sel
134f0 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73  ects the.** no-s
13500 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74  ync option for t
13510 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70  he journal.  A p
13520 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
13530 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75  ld lead to corru
13540 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73  ption.** in this
13550 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20   case.  But for 
13560 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70  things like temp
13570 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69  orary table (whi
13580 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  ch will be.** de
13590 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  leted when the p
135a0 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
135b0 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e  ) we don't care.
135c0 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
135d0 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74  file opened as t
135e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
135f0 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
13600 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  rmed.** journal 
13610 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61  file then all pa
13620 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69  ges up to the fi
13630 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61  rst corrupted pa
13640 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a  ge are rolled.**
13650 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67   back (or no pag
13660 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  es if the journa
13670 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72  l header is corr
13680 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72  upted). The jour
13690 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74  nal file.** is t
136a0 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20  hen deleted and 
136b0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
136c0 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e  ed, just as if n
136d0 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64  o corruption had
136e0 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  .** been encount
136f0 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ered..**.** If a
13700 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  n I/O or malloc(
13710 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
13720 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  the journal-file
13730 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a   is not deleted.
13740 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
13750 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
13760 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f  ..**.** The isHo
13770 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69  t parameter indi
13780 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72  cates that we ar
13790 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c  e trying to roll
137a0 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a  back a journal.*
137b0 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  * that might be 
137c0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  a hot journal.  
137d0 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  Or, it could be 
137e0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
137f0 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65   is .** preserve
13800 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55  d because of JOU
13810 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
13820 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f   or JOURNALMODE_
13830 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20  TRUNCATE..** If 
13840 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c  the journal real
13850 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74  ly is hot, reset
13860 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
13870 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a   prior rolling.*
13880 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65  * back any conte
13890 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72  nt.  If the jour
138a0 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65  nal is merely pe
138b0 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73  rsistent, no res
138c0 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e  et is.** needed.
138d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
138e0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
138f0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
13900 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74   isHot){.  sqlit
13910 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
13920 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
13930 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
13940 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
13950 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
13960 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
13970 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
13980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
13990 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
139a0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
139b0 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
139c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
139d0 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
139e0 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
139f0 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
13a00 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
13a10 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
13a20 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
13a30 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
13a40 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
13a50 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
13a60 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
13a70 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  res = 1;        
13a80 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
13a90 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
13aa0 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20  3OsAccess() */. 
13ab0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
13ac0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
13ad0 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
13ae0 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
13af0 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67  */.  int needPag
13b00 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  erReset;      /*
13b10 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70   True to reset p
13b20 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72  age prior to fir
13b30 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b  st page rollback
13b40 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
13b50 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
13b60 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
13b70 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74   journal.  Abort
13b80 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74   early if.  ** t
13b90 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d  he journal is em
13ba0 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pty..  */.  asse
13bb0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
13bc0 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20  r->jfd) );.  rc 
13bd0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
13be0 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
13bf0 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
13c00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
13c10 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74  zJ==0 ){.    got
13c20 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
13c30 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
13c40 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
13c50 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  l name from the 
13c60 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
13c70 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20  s present..  ** 
13c80 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
13c90 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
13ca0 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20   specified, but 
13cb0 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  the file is not.
13cc0 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20    ** present on 
13cd0 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a  disk, then the j
13ce0 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f  ournal is not ho
13cf0 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e  t and does not n
13d00 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70  eed to be.  ** p
13d10 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a  layed back..  **
13d20 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68  .  ** TODO: Tech
13d30 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c  nically the foll
13d40 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f  owing is an erro
13d50 72 20 62 65 63 61 75 73 65 20 69 74 20 61 73 73  r because it ass
13d60 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62  umes that.  ** b
13d70 75 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70  uffer Pager.pTmp
13d80 53 70 61 63 65 20 69 73 20 28 6d 78 50 61 74 68  Space is (mxPath
13d90 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72  name+1) bytes or
13da0 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68   larger. i.e. th
13db0 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d  at.  ** (pPager-
13dc0 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61  >pageSize >= pPa
13dd0 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
13de0 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20  hname+1). Using 
13df0 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20  os_unix.c,.  ** 
13e00 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35   mxPathname is 5
13e10 31 32 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  12, which is the
13e20 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e   same as the min
13e30 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76  imum allowable v
13e40 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61  alue.  ** for pa
13e50 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a  geSize..  */.  z
13e60 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
13e70 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63  >pTmpSpace;.  rc
13e80 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
13e90 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
13ea0 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
13eb0 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
13ec0 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63  ame+1);.  if( rc
13ed0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
13ee0 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20  Master[0] ){.   
13ef0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
13f00 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
13f10 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
13f20 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29  SS_EXISTS, &res)
13f30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20  ;.  }.  zMaster 
13f40 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  = 0;.  if( rc!=S
13f50 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73  QLITE_OK || !res
13f60 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
13f70 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
13f80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13f90 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50  Off = 0;.  needP
13fa0 61 67 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f  agerReset = isHo
13fb0 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  t;..  /* This lo
13fc0 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
13fd0 74 68 65 72 20 77 68 65 6e 20 61 20 72 65 61 64  ther when a read
13fe0 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20  JournalHdr() or 
13ff0 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79  .  ** pager_play
14000 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20  back_one_page() 
14010 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c  call returns SQL
14020 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49  ITE_DONE or an I
14030 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63  O error .  ** oc
14040 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68  curs. .  */.  wh
14050 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a  ile( 1 ){.    /*
14060 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
14070 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
14080 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
14090 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
140a0 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
140b0 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
140c0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
140d0 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
140e0 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
140f0 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
14100 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
14110 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69  cess must of fai
14120 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
14130 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
14140 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
14150 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
14160 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
14170 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
14180 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
14190 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20  (pPager, isHot, 
141a0 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
141b0 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
141c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
141d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
141e0 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
141f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
14200 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
14210 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
14220 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
14230 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
14240 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
14250 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
14260 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
14270 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
14280 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
14290 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
142a0 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
142b0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
142c0 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
142d0 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
142e0 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
142f0 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
14300 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
14310 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
14320 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
14330 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
14340 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
14350 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
14360 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
14370 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
14380 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
14390 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
143a0 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
143b0 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
143c0 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
143d0 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
143e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
143f0 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
14400 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
14410 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
14420 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
14430 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
14440 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
14450 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
14460 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
14470 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
14480 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
14490 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
144a0 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
144b0 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
144c0 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
144d0 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
144e0 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
144f0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
14500 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
14510 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
14520 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
14530 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
14540 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
14550 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
14560 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
14570 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68  #2565..    ** Wh
14580 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
14590 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e  a hot journal, n
145a0 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65  Rec==0 always me
145b0 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ans that the nex
145c0 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f  t.    ** chunk o
145d0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f  f the journal co
145e0 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65  ntains zero page
145f0 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
14600 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a  ack.  But.    **
14610 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f   when doing a RO
14620 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e  LLBACK and the n
14630 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20  Rec==0 chunk is 
14640 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69  the last chunk i
14650 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
14660 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  rnal, it means t
14670 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
14680 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64  might contain ad
14690 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20  ditional.    ** 
146a0 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20  pages that need 
146b0 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
146c0 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e  k and that the n
146d0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a  umber of pages .
146e0 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
146f0 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20   computed based 
14700 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
14710 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  ile size..    */
14720 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
14730 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20   && !isHot &&.  
14740 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
14750 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
14760 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
14770 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
14780 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Off ){.      nRe
14790 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
147a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
147b0 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
147c0 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
147d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
147e0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
147f0 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
14800 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
14810 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
14820 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
14830 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
14840 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
14850 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
14860 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
14870 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
14880 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
14890 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
148a0 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
148b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
148c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
148d0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
148e0 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
148f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
14900 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
14910 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
14920 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
14930 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
14940 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
14950 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
14960 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f  abase file and/o
14970 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20  r page cache..  
14980 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
14990 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
149a0 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61        if( needPa
149b0 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  gerReset ){.    
149c0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
149d0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
149e0 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
149f0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
14a00 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
14a10 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
14a20 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e  pPager,&pPager->
14a30 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30  journalOff,0,1,0
14a40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
14a50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14a60 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
14a70 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
14a80 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
14a90 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
14aa0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14ab0 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20  Off = szJ;.     
14ac0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14ad0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
14ae0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
14af0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
14b00 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
14b10 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
14b20 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d  n truncated, sim
14b30 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67  ply stop reading
14b40 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
14b50 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65  * processing the
14b60 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d   journal. This m
14b70 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20 74  ight happen if t
14b80 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  he journal was. 
14b90 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20           ** not 
14ba0 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74  completely writt
14bb0 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72  en and synced pr
14bc0 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20  ior to a crash. 
14bd0 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20   In that.       
14be0 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20     ** case, the 
14bf0 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20  database should 
14c00 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20  have never been 
14c10 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20  written in the. 
14c20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73           ** firs
14c30 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73  t place so it is
14c40 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62   OK to simply ab
14c50 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61  andon the rollba
14c60 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ck. */.         
14c70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14c80 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
14c90 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
14ca0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14cb0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
14cc0 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f  are unable to ro
14cd0 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64  llback, quit and
14ce0 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
14cf0 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  r.          ** c
14d00 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ode.  This will 
14d10 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72 20  cause the pager 
14d20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  to enter the err
14d30 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20 20  or state.       
14d40 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f     ** so that no
14d50 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77 69   further harm wi
14d60 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72  ll be done.  Per
14d70 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20  haps the next.  
14d80 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
14d90 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67  ss to come along
14da0 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
14db0 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61   rollback the da
14dc0 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20  tabase..        
14dd0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67    */.          g
14de0 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
14df0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14e00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
14e10 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
14e20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65   assert( 0 );..e
14e30 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f  nd_playback:.  /
14e40 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f  * Following a ro
14e50 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  llback, the data
14e60 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
14e70 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20   be back in its 
14e80 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74  original.  ** st
14e90 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ate prior to the
14ea0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
14eb0 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e  ansaction, so in
14ec0 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51  voke the.  ** SQ
14ed0 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
14ee0 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e  CHANGED file-con
14ef0 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64  trol method to d
14f00 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20  isable the.  ** 
14f10 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74  assertion that t
14f20 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
14f30 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66  ounter was modif
14f40 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ied..  */.  asse
14f50 72 74 28 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rt(.    pPager->
14f60 66 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20  fd->pMethods==0 
14f70 7c 7c 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ||.    sqlite3Os
14f80 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67  FileControl(pPag
14f90 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43  er->fd,SQLITE_FC
14fa0 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
14fb0 2c 30 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  ,0)>=SQLITE_OK. 
14fc0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   );..  /* If thi
14fd0 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61  s playback is ha
14fe0 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69  ppening automati
14ff0 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c  cally as a resul
15000 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20  t of an IO or . 
15010 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72   ** malloc error
15020 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 20 61   that occurred a
15030 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d  fter the change-
15040 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
15050 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65  ted but .  ** be
15060 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
15070 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74  tion was committ
15080 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61  ed, then the cha
15090 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a  nge-counter .  *
150a0 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d  * modification m
150b0 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65 65  ay just have bee
150c0 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20 74  n reverted. If t
150d0 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65  his happens in e
150e0 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d  xclusive .  ** m
150f0 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71  ode, then subseq
15100 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  uent transaction
15110 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74  s performed by t
15120 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  he connection wi
15130 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61  ll not.  ** upda
15140 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  te the change-co
15150 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68  unter at all. Th
15160 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63  is may lead to c
15170 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e  ache inconsisten
15180 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73  cy.  ** problems
15190 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65   for other proce
151a0 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69  sses at some poi
151b0 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
151c0 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20  . So, just.  ** 
151d0 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61 73  in case this has
151e0 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72   happened, clear
151f0 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   the changeCount
15200 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20  Done flag now.. 
15210 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68   */.  pPager->ch
15220 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
15230 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
15240 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
15250 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d  ITE_OK ){.    zM
15260 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  aster = pPager->
15270 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72  pTmpSpace;.    r
15280 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
15290 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
152a0 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  d, zMaster, pPag
152b0 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
152c0 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73  name+1);.    tes
152d0 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
152e0 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
152f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15300 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  && pPager->noSyn
15310 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  c==0 && pPager->
15320 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
15330 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72 63  LUSIVE ){.    rc
15340 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
15350 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
15360 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
15370 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
15380 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
15390 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26  ger->noSync==0 &
153a0 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  & pPager->state>
153b0 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
153c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
153d0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
153e0 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  r->fd, pPager->s
153f0 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a  ync_flags);.  }.
15400 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15410 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
15420 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
15430 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d  ction(pPager, zM
15440 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b  aster[0]!='\0');
15450 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
15460 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
15470 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
15480 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
15490 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a  er[0] && res ){.
154a0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
154b0 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
154c0 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
154d0 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
154e0 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a  n success,.    *
154f0 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
15500 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
15510 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
15520 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rnal..    */.   
15530 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
15540 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d  aster(pPager, zM
15550 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74  aster);.    test
15560 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
15570 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OK );.  }..  /*
15580 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
15590 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
155a0 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
155b0 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
155c0 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
155d0 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
155e0 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
155f0 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63   a different sec
15600 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61  tor size.  ** va
15610 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
15620 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
15630 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
15640 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53  ess..  */.  setS
15650 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
15660 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
15670 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  }.../*.** Read t
15680 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70  he content for p
15690 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74  age pPg out of t
156a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
156b0 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50   and into .** pP
156c0 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72  g->pData. A shar
156d0 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74  ed lock or great
156e0 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  er must be held 
156f0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
15700 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
15710 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
15720 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
15730 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c   page 1 is read,
15740 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
15750 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
15760 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a  ers[] is set to.
15770 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ** the value rea
15780 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
15790 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
157a0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
157b0 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
157c0 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  IO error is retu
157d0 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
157e0 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  er..** Otherwise
157f0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
15800 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
15810 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67  ic int readDbPag
15820 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
15830 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
15840 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a   pPg->pPager; /*
15850 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73   Pager object as
15860 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
15870 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f  ge pPg */.  Pgno
15880 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
15890 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  o;       /* Page
158a0 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20   number to read 
158b0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
158c0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
158d0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
158e0 20 2a 2f 0a 20 20 69 36 34 20 69 4f 66 66 73 65   */.  i64 iOffse
158f0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
15900 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
15910 74 20 6f 66 20 66 69 6c 65 20 74 6f 20 72 65 61  t of file to rea
15920 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  d from */.  int 
15930 69 73 49 6e 4c 6f 67 20 3d 20 30 3b 20 20 20 20  isInLog = 0;    
15940 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
15950 20 69 66 20 70 61 67 65 20 69 73 20 69 6e 20 6c   if page is in l
15960 6f 67 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73  og file */..  as
15970 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
15980 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
15990 44 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20  D && !MEMDB );. 
159a0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
159b0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a  pPager->fd) );..
159c0 20 20 69 66 28 20 4e 45 56 45 52 28 21 69 73 4f    if( NEVER(!isO
159d0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29  pen(pPager->fd))
159e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
159f0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
15a00 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   );.    memset(p
15a10 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50  Pg->pData, 0, pP
15a20 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
15a30 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15a40 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66  TE_OK;.  }..  if
15a50 28 20 70 61 67 65 72 55 73 65 4c 6f 67 28 70 50  ( pagerUseLog(pP
15a60 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ager) ){.    /* 
15a70 54 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20  Try to pull the 
15a80 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72  page from the wr
15a90 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a  ite-ahead log. *
15aa0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
15ab0 65 33 4c 6f 67 52 65 61 64 28 70 50 61 67 65 72  e3LogRead(pPager
15ac0 2d 3e 70 4c 6f 67 2c 20 70 67 6e 6f 2c 20 26 69  ->pLog, pgno, &i
15ad0 73 49 6e 4c 6f 67 2c 20 70 50 67 2d 3e 70 44 61  sInLog, pPg->pDa
15ae0 74 61 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ta);.  }.  if( r
15af0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
15b00 21 69 73 49 6e 4c 6f 67 20 29 7b 0a 20 20 20 20  !isInLog ){.    
15b10 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d  iOffset = (pgno-
15b20 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
15b30 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  pageSize;.    rc
15b40 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
15b50 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67  (pPager->fd, pPg
15b60 2d 3e 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  ->pData, pPager-
15b70 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 73  >pageSize, iOffs
15b80 65 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  et);.    if( rc=
15b90 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
15ba0 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
15bb0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
15bc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
15bd0 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
15be0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
15bf0 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64    /* If the read
15c00 20 69 73 20 75 6e 73 75 63 63 65 73 73 66 75 6c   is unsuccessful
15c10 2c 20 73 65 74 20 74 68 65 20 64 62 46 69 6c 65  , set the dbFile
15c20 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68  Vers[] to someth
15c30 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  ing.      ** tha
15c40 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  t will never be 
15c50 61 20 76 61 6c 69 64 20 66 69 6c 65 20 76 65 72  a valid file ver
15c60 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65 72  sion.  dbFileVer
15c70 73 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a 20 20  s[] is a copy.  
15c80 20 20 20 20 2a 2a 20 6f 66 20 62 79 74 65 73 20      ** of bytes 
15c90 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61  24..39 of the da
15ca0 74 61 62 61 73 65 2e 20 20 42 79 74 65 73 20 32  tabase.  Bytes 2
15cb0 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c 77  8..31 should alw
15cc0 61 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  ays be.      ** 
15cd0 7a 65 72 6f 2e 20 20 42 79 74 65 73 20 33 32 2e  zero.  Bytes 32.
15ce0 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 20 73  .35 and 35..39 s
15cf0 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75  hould be page nu
15d00 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65 0a  mbers which are.
15d10 20 20 20 20 20 20 2a 2a 20 6e 65 76 65 72 20 30        ** never 0
15d20 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66  xffffffff.  So f
15d30 69 6c 6c 69 6e 67 20 70 50 61 67 65 72 2d 3e 64  illing pPager->d
15d40 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68  bFileVers[] with
15d50 20 61 6c 6c 20 30 78 66 66 0a 20 20 20 20 20 20   all 0xff.      
15d60 2a 2a 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20  ** bytes should 
15d70 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a  suffice..      *
15d80 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  *.      ** For a
15d90 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61  n encrypted data
15da0 62 61 73 65 2c 20 74 68 65 20 73 69 74 75 61 74  base, the situat
15db0 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70  ion is more comp
15dc0 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20  lex:  bytes.    
15dd0 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74    ** 24..39 of t
15de0 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20  he database are 
15df0 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75  white noise.  Bu
15e00 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  t the probabilit
15e10 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68  y of.      ** wh
15e20 69 74 65 20 6e 6f 69 73 69 6e 67 20 65 71 75 61  ite noising equa
15e30 6c 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66  ling 16 bytes of
15e40 20 30 78 66 66 20 69 73 20 76 61 6e 69 73 68 69   0xff is vanishi
15e50 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20  ngly small so.  
15e60 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64      ** we should
15e70 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20   still be ok..  
15e80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d      */.      mem
15e90 73 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69  set(pPager->dbFi
15ea0 6c 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69  leVers, 0xff, si
15eb0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
15ec0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
15ed0 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a  else{.      u8 *
15ee0 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28  dbFileVers = &((
15ef0 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b  u8*)pPg->pData)[
15f00 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  24];.      memcp
15f10 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
15f20 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72  eVers, dbFileVer
15f30 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  s, sizeof(pPager
15f40 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
15f50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45      }.  }.  CODE
15f60 43 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  C1(pPager, pPg->
15f70 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  pData, pgno, 3, 
15f80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
15f90 4d 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43  M);..  PAGER_INC
15fa0 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
15fb0 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  readdb_count);. 
15fc0 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
15fd0 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f  er->nRead);.  IO
15fe0 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20  TRACE(("PGIN %p 
15ff0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
16000 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52  gno));.  PAGERTR
16010 41 43 45 28 28 22 46 45 54 43 48 20 25 64 20 70  ACE(("FETCH %d p
16020 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
16030 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
16040 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
16050 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
16060 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
16070 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
16080 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .}..static int p
16090 61 67 65 72 52 6f 6c 6c 62 61 63 6b 4c 6f 67 28  agerRollbackLog(
160a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
160b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
160c0 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70  E_OK;.  PgHdr *p
160d0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
160e0 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
160f0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
16100 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
16110 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69   = pPager->dbOri
16120 67 53 69 7a 65 3b 0a 20 20 77 68 69 6c 65 28 20  gSize;.  while( 
16130 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c  pList && rc==SQL
16140 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67  ITE_OK ){.    Pg
16150 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69  Hdr *pNext = pLi
16160 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  st->pDirty;.    
16170 69 66 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  if( sqlite3Pcach
16180 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4c  ePageRefcount(pL
16190 69 73 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ist)==0 ){.     
161a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
161b0 6b 75 70 28 70 50 61 67 65 72 2c 20 70 4c 69 73  kup(pPager, pLis
161c0 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  t->pgno);.      
161d0 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f  sqlite3PcacheDro
161e0 70 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65  p(pList);.    }e
161f0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
16200 72 65 61 64 44 62 50 61 67 65 28 70 4c 69 73 74  readDbPage(pList
16210 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
16220 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16230 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52        pPager->xR
16240 65 69 6e 69 74 65 72 28 70 4c 69 73 74 29 3b 0a  einiter(pList);.
16250 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16260 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
16270 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
16280 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  ;.}../*.** Playb
16290 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53  ack savepoint pS
162a0 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66  avepoint. Or, if
162b0 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
162c0 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b  L, then playback
162d0 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d  .** the entire m
162e0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
162f0 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70 53 61  le. The case pSa
16300 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63  vepoint==NULL oc
16310 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20  curs when .** a 
16320 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d  ROLLBACK TO comm
16330 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  and is invoked o
16340 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68  n a SAVEPOINT th
16350 61 74 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  at is a transact
16360 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  ion .** savepoin
16370 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53  t..**.** When pS
16380 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20  avepoint is not 
16390 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20  NULL (meaning a 
163a0 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  non-transaction 
163b0 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a  savepoint is .**
163c0 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
163d0 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  ck), then the ro
163e0 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20  llback consists 
163f0 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65 20 73  of up to three s
16400 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72  tages,.** perfor
16410 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72  med in the order
16420 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a   specified:.**.*
16430 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20  *   * Pages are 
16440 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
16450 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
16460 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79  l starting at by
16470 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74  te.**     offset
16480 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
16490 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74  iOffset and cont
164a0 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20  inuing to .**   
164b0 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
164c0 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20  .iHdrOffset, or 
164d0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
164e0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a  e main journal.*
164f0 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20 50 61  *     file if Pa
16500 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
16510 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e  rOffset is zero.
16520 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61  .**.**   * If Pa
16530 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
16540 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a  rOffset is not z
16550 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20  ero, then pages 
16560 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20  are played.**   
16570 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20    back starting 
16580 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
16590 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74   header immediat
165a0 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a  ely following .*
165b0 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
165c0 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20  oint.iHdrOffset 
165d0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
165e0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
165f0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50  ile..**.**   * P
16600 61 67 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c  ages are then pl
16610 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
16620 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
16630 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a  ile, starting.**
16640 20 20 20 20 20 77 69 74 68 20 74 68 65 20 50 61       with the Pa
16650 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75  gerSavepoint.iSu
16660 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75  bRec and continu
16670 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ing to the end o
16680 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75  f.**     the jou
16690 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
166a0 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20   Throughout the 
166b0 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73  rollback process
166c0 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20 70 61  , each time a pa
166d0 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  ge is rolled bac
166e0 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  k, the.** corres
166f0 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73  ponding bit is s
16700 65 74 20 69 6e 20 61 20 62 69 74 76 65 63 20 73  et in a bitvec s
16710 74 72 75 63 74 75 72 65 20 28 76 61 72 69 61 62  tructure (variab
16720 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a  le pDone in the.
16730 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
16740 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69  n below). This i
16750 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65  s used to ensure
16760 20 74 68 61 74 20 61 20 70 61 67 65 20 69 73 20   that a page is 
16770 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  only.** rolled b
16780 61 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ack the first ti
16790 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74  me it is encount
167a0 65 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a  ered in either j
167b0 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
167c0 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e   pSavepoint is N
167d0 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20  ULL, then pages 
167e0 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20  are only played 
167f0 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
16800 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  in.** journal fi
16810 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  le. There is no 
16820 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74 76 65  need for a bitve
16830 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  c in this case..
16840 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20  **.** In either 
16850 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61  case, before pla
16860 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20  yback commences 
16870 74 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65  the Pager.dbSize
16880 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20   variable.** is 
16890 72 65 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  reset to the val
168a0 75 65 20 74 68 61 74 20 69 74 20 68 65 6c 64 20  ue that it held 
168b0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
168c0 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a  the savepoint .*
168d0 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  * (or transactio
168e0 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68  n). No page with
168f0 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67   a page-number g
16900 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
16910 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61   value.** is pla
16920 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65  yed back. If one
16930 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
16940 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69  it is simply ski
16950 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pped..*/.static 
16960 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61 63  int pagerPlaybac
16970 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72  kSavepoint(Pager
16980 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72 53   *pPager, PagerS
16990 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70  avepoint *pSavep
169a0 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a  oint){.  i64 szJ
169b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
169c0 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73    /* Effective s
169d0 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ize of the main 
169e0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
169f0 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
16a00 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
16a10 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66  first segment of
16a20 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65   main-journal re
16a30 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72  cords */.  int r
16a40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
16a50 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
16a60 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  de */.  Bitvec *
16a70 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20  pDone = 0;      
16a80 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e   /* Bitvec to en
16a90 73 75 72 65 20 70 61 67 65 73 20 70 6c 61 79 65  sure pages playe
16aa0 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65  d back only once
16ab0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
16ac0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
16ad0 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20  GER_SHARED );.. 
16ae0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62   /* Allocate a b
16af0 69 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20  itvec to use to 
16b00 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66  store the set of
16b10 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61   pages rolled ba
16b20 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  ck */.  if( pSav
16b30 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44  epoint ){.    pD
16b40 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74  one = sqlite3Bit
16b50 76 65 63 43 72 65 61 74 65 28 70 53 61 76 65 70  vecCreate(pSavep
16b60 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20  oint->nOrig);.  
16b70 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a    if( !pDone ){.
16b80 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
16b90 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
16ba0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
16bb0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
16bc0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c   back to the val
16bd0 75 65 20 69 74 20 77 61 73 20 62 65 66 6f 72 65  ue it was before
16be0 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
16bf0 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72    ** being rever
16c00 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a  ted was opened..
16c10 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64    */.  pPager->d
16c20 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69  bSize = pSavepoi
16c30 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d  nt ? pSavepoint-
16c40 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d  >nOrig : pPager-
16c50 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 0a 20 20  >dbOrigSize;..  
16c60 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20  if( !pSavepoint 
16c70 26 26 20 70 61 67 65 72 55 73 65 4c 6f 67 28 70  && pagerUseLog(p
16c80 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
16c90 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61  turn pagerRollba
16ca0 63 6b 4c 6f 67 28 70 50 61 67 65 72 29 3b 0a 20  ckLog(pPager);. 
16cb0 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61   }..  /* Use pPa
16cc0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
16cd0 61 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65  as the effective
16ce0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69   size of the mai
16cf0 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
16d00 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63  journal.  The ac
16d10 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20  tual file might 
16d20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
16d30 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45  his in.  ** PAGE
16d40 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
16d50 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f  UNCATE or PAGER_
16d60 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
16d70 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69  IST.  But anythi
16d80 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61  ng.  ** past pPa
16d90 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
16da0 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f  is off-limits to
16db0 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20   us..  */.  szJ 
16dc0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
16dd0 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20  lOff;.  assert( 
16de0 70 61 67 65 72 55 73 65 4c 6f 67 28 70 50 61 67  pagerUseLog(pPag
16df0 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30  er)==0 || szJ==0
16e00 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20   );..  /* Begin 
16e10 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  by rolling back 
16e20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
16e30 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
16e40 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50  arting at.  ** P
16e50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
16e60 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
16e70 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74  uing to the next
16e80 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
16e90 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68  .  ** There migh
16ea0 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20  t be records in 
16eb0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
16ec0 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67   that have a pag
16ed0 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72  e number.  ** gr
16ee0 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
16ef0 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
16f00 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62  size (pPager->db
16f10 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a  Size) but those.
16f20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
16f30 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  pped automatical
16f40 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61  ly.  Pages are a
16f50 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73  dded to pDone as
16f60 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70   they.  ** are p
16f70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
16f80 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
16f90 74 20 26 26 20 21 70 61 67 65 72 55 73 65 4c 6f  t && !pagerUseLo
16fa0 67 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  g(pPager) ){.   
16fb0 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65   iHdrOff = pSave
16fc0 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65  point->iHdrOffse
16fd0 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
16fe0 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a  iHdrOffset : szJ
16ff0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
17000 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65  urnalOff = pSave
17010 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a  point->iOffset;.
17020 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
17030 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
17040 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69  er->journalOff<i
17050 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  HdrOff ){.      
17060 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
17070 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
17080 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  ger, &pPager->jo
17090 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c  urnalOff, pDone,
170a0 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
170b0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
170c0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
170d0 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
170e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
170f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74  ;.  }..  /* Cont
17100 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63  inue rolling bac
17110 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66  k records out of
17120 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
17130 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
17140 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  ** the first jou
17150 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e  rnal header seen
17160 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
17170 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63 74  until the effect
17180 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20  ive end.  ** of 
17190 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
171a0 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65   file.  Continue
171b0 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d   to skip out-of-
171c0 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a  range pages and.
171d0 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64    ** continue ad
171e0 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65  ding pages rolle
171f0 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e  d back to pDone.
17200 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72  .  */.  while( r
17210 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
17220 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
17230 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33  ff<szJ ){.    u3
17240 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
17250 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
17260 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65   */.    u32 nJRe
17270 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  c = 0;     /* Nu
17280 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20  mber of Journal 
17290 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75  Records */.    u
172a0 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63  32 dummy;.    rc
172b0 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
172c0 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a  r(pPager, 0, szJ
172d0 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79  , &nJRec, &dummy
172e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
172f0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
17300 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ;..    /*.    **
17310 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f   The "pPager->jo
17320 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
17330 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
17340 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
17350 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74  Off".    ** test
17360 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74   is related to t
17370 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65  icket #2565.  Se
17380 65 20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e  e the discussion
17390 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   in the.    ** p
173a0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
173b0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64  function for add
173c0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
173d0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
173e0 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20  if( nJRec==0 .  
173f0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
17400 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
17410 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
17420 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
17430 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Off.    ){.     
17440 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28   nJRec = (u32)((
17450 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
17460 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41  urnalOff)/JOURNA
17470 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
17480 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
17490 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ii=0; rc==SQLITE
174a0 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20  _OK && ii<nJRec 
174b0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
174c0 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29  alOff<szJ; ii++)
174d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
174e0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
174f0 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
17500 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
17510 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a  , pDone, 1, 1);.
17520 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
17530 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
17540 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  E );.  }.  asser
17550 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
17560 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
17570 6e 61 6c 4f 66 66 3d 3d 73 7a 4a 20 29 3b 0a 0a  nalOff==szJ );..
17580 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72    /* Finally,  r
17590 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72  ollback pages fr
175a0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
175b0 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20 77  al.  Page that w
175c0 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75  ere.  ** previou
175d0 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  sly rolled back 
175e0 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
175f0 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65  journal (and are
17600 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29   hence in pDone)
17610 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b  .  ** will be sk
17620 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72  ipped.  Out-of-r
17630 61 6e 67 65 20 70 61 67 65 73 20 61 72 65 20 61  ange pages are a
17640 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a  lso skipped..  *
17650 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
17660 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69  nt ){.    u32 ii
17670 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
17680 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
17690 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
176a0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75   pSavepoint->iSu
176b0 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e  bRec*(4+pPager->
176c0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 66  pageSize);.    f
176d0 6f 72 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74  or(ii=pSavepoint
176e0 2d 3e 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53  ->iSubRec; rc==S
176f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70  QLITE_OK && ii<p
17700 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20  Pager->nSubRec; 
17710 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  ii++){.      ass
17720 65 72 74 28 20 6f 66 66 73 65 74 3d 3d 69 69 2a  ert( offset==ii*
17730 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
17740 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63  ize) );.      rc
17750 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
17760 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
17770 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e  r, &offset, pDon
17780 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 0, 1);.    }.
17790 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
177a0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
177b0 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74   }..  sqlite3Bit
177c0 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65  vecDestroy(pDone
177d0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
177e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
177f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
17800 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 72 65   = szJ;.  }.  re
17810 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17820 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78  * Change the max
17830 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69  imum number of i
17840 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74  n-memory pages t
17850 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e  hat are allowed.
17860 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
17870 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
17880 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
17890 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
178a0 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
178b0 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72  Cachesize(pPager
178c0 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67  ->pPCache, mxPag
178d0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a  e);.}../*.** Adj
178e0 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65  ust the robustne
178f0 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ss of the databa
17900 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65  se to damage due
17910 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a   to OS crashes.*
17920 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75  * or power failu
17930 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20  res by changing 
17940 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79  the number of sy
17950 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74  ncs()s when writ
17960 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  ing.** the rollb
17970 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ack journal.  Th
17980 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65  ere are three le
17990 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  vels:.**.**    O
179a0 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  FF       sqlite3
179b0 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65  OsSync() is neve
179c0 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20  r called.  This 
179d0 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a  is the default.*
179e0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  *              f
179f0 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64  or temporary and
17a00 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73   transient files
17a10 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41  ..**.**    NORMA
17a20 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c  L    The journal
17a30 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20   is synced once 
17a40 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
17a50 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
17a60 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
17a70 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f  ase.  This is no
17a80 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20  rmally adequate 
17a90 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a  protection, but.
17aa0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
17ab0 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61  it is theoretica
17ac0 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68  lly possible, th
17ad0 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65  ough very unlike
17ae0 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ly,.**          
17af0 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70      that an inop
17b00 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69  ertune power fai
17b10 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65  lure could leave
17b20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
17b30 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20               in 
17b40 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f  a state which wo
17b50 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65  uld cause damage
17b60 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
17b70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
17b80 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c   when it is roll
17b90 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ed back..**.**  
17ba0 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20    FULL      The 
17bb0 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
17bc0 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77  d twice before w
17bd0 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
17be0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
17bf0 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74     database (wit
17c00 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61  h some additiona
17c10 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  l information - 
17c20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a  the nRec field.*
17c30 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  *              o
17c40 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
17c50 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69  ader - being wri
17c60 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20  tten in between 
17c70 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20  the two.**      
17c80 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20          syncs). 
17c90 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68   If we assume th
17ca0 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20  at writing a.** 
17cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e               sin
17cc0 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20  gle disk sector 
17cd0 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20  is atomic, then 
17ce0 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64  this mode provid
17cf0 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  es.**           
17d00 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61     assurance tha
17d10 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69  t the journal wi
17d20 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70  ll not be corrup
17d30 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20  ted to the.**   
17d40 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74             point
17d50 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61   of causing dama
17d60 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
17d70 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  se during rollba
17d80 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69  ck..**.** Numeri
17d90 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61  c values associa
17da0 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73  ted with these s
17db0 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31  tates are OFF==1
17dc0 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61  , NORMAL=2,.** a
17dd0 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69  nd FULL=3..*/.#i
17de0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17df0 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
17e00 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
17e10 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  rSetSafetyLevel(
17e20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
17e30 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 62 46  nt level, int bF
17e40 75 6c 6c 46 73 79 6e 63 29 7b 0a 20 20 70 50 61  ullFsync){.  pPa
17e50 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28  ger->noSync =  (
17e60 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67  level==1 || pPag
17e70 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31  er->tempFile) ?1
17e80 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  :0;.  pPager->fu
17e90 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d  llSync = (level=
17ea0 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  =3 && !pPager->t
17eb0 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20  empFile) ?1:0;. 
17ec0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
17ed0 61 67 73 20 3d 20 28 62 46 75 6c 6c 46 73 79 6e  ags = (bFullFsyn
17ee0 63 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  c?SQLITE_SYNC_FU
17ef0 4c 4c 3a 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  LL:SQLITE_SYNC_N
17f00 4f 52 4d 41 4c 29 3b 0a 20 20 69 66 28 20 70 50  ORMAL);.  if( pP
17f10 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70  ager->noSync ) p
17f20 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
17f30 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  = 0;.}.#endif../
17f40 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
17f50 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
17f60 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  le is incremente
17f70 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c  d whenever the l
17f80 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70  ibrary.** attemp
17f90 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  ts to open a tem
17fa0 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68  porary file.  Th
17fb0 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
17fc0 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65  s used for.** te
17fd0 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
17fe0 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69  is only.  .*/.#i
17ff0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
18000 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
18010 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b  ntemp_count = 0;
18020 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
18030 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
18040 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74  file..**.** Writ
18050 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
18060 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c  iptor into *pFil
18070 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  e. Return SQLITE
18080 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 0a  _OK on success .
18090 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ** or some other
180a0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
180b0 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77  e fail. The OS w
180c0 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
180d0 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65  y .** delete the
180e0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
180f0 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
18100 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  d..**.** The fla
18110 67 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  gs passed to the
18120 20 56 46 53 20 6c 61 79 65 72 20 78 4f 70 65 6e   VFS layer xOpen
18130 28 29 20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73  () call are thos
18140 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62  e specified.** b
18150 79 20 70 61 72 61 6d 65 74 65 72 20 76 66 73 46  y parameter vfsF
18160 6c 61 67 73 20 4f 52 65 64 20 77 69 74 68 20 74  lags ORed with t
18170 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
18180 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
18190 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a  PEN_READWRITE.**
181a0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
181b0 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20 20 20 53  _CREATE.**     S
181c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
181d0 53 49 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  SIVE.**     SQLI
181e0 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
181f0 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20  CLOSE.*/.static 
18200 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d  int pagerOpentem
18210 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  p(.  Pager *pPag
18220 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  er,        /* Th
18230 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  e pager object *
18240 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
18250 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69   *pFile,  /* Wri
18260 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  te the file desc
18270 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20  riptor here */. 
18280 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20   int vfsFlags   
18290 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
182a0 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
182b0 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a  o the VFS */.){.
182c0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
182d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
182e0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65  n code */..#ifde
182f0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
18300 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
18310 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73  _count++;  /* Us
18320 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
18330 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
18340 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66   */.#endif..  vf
18350 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54  sFlags |=  SQLIT
18360 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
18370 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
18380 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20  REATE |.        
18390 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
183a0 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49  EXCLUSIVE | SQLI
183b0 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
183c0 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71  CLOSE;.  rc = sq
183d0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61 67  lite3OsOpen(pPag
183e0 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46 69  er->pVfs, 0, pFi
183f0 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29  le, vfsFlags, 0)
18400 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
18410 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
18420 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20 20  pen(pFile) );.  
18430 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18440 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79  .** Set the busy
18450 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f   handler functio
18460 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  n..**.** The pag
18470 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 62  er invokes the b
18480 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20 73  usy-handler if s
18490 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72  qlite3OsLock() r
184a0 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54  eturns .** SQLIT
184b0 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79 69  E_BUSY when tryi
184c0 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ng to upgrade fr
184d0 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20  om no-lock to a 
184e0 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20  SHARED lock,.** 
184f0 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74  or when trying t
18500 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61  o upgrade from a
18510 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74   RESERVED lock t
18520 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a  o an EXCLUSIVE .
18530 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73  ** lock. It does
18540 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68   *not* invoke th
18550 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77  e busy handler w
18560 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72  hen upgrading fr
18570 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f 20  om.** SHARED to 
18580 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68 65  RESERVED, or whe
18590 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d  n upgrading from
185a0 20 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c 55   SHARED to EXCLU
185b0 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f  SIVE.** (which o
185c0 63 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f 74  ccurs during hot
185d0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
185e0 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a  k). Summary:.**.
185f0 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e 20  **   Transition 
18600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18610 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73         | Invokes
18620 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a   xBusyHandler.**
18630 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
18640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
18670 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d   NO_LOCK       -
18680 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20  > SHARED_LOCK   
18690 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48     | Yes.**   SH
186a0 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52  ARED_LOCK   -> R
186b0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20  ESERVED_LOCK    
186c0 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44  | No.**   SHARED
186d0 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55  _LOCK   -> EXCLU
186e0 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f  SIVE_LOCK   | No
186f0 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f 4c  .**   RESERVED_L
18700 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  OCK -> EXCLUSIVE
18710 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a  _LOCK   | Yes.**
18720 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79 2d  .** If the busy-
18730 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
18740 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
18750 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a  o, the lock is .
18760 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20 69  ** retried. If i
18770 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20  t returns zero, 
18780 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  then the SQLITE_
18790 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a  BUSY error is.**
187a0 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
187b0 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20 70   caller of the p
187c0 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f  ager API functio
187d0 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
187e0 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
187f0 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a  ndler(.  Pager *
18800 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
18810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18820 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
18830 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61  .  int (*xBusyHa
18840 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c 20  ndler)(void *), 
18850 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
18860 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c  er to busy-handl
18870 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  er function */. 
18880 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64   void *pBusyHand
18890 6c 65 72 41 72 67 20 20 20 20 20 20 20 20 20 20  lerArg          
188a0 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
188b0 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42 75  t to pass to xBu
188c0 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20  syHandler */.){ 
188d0 20 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73   .  pPager->xBus
188e0 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79  yHandler = xBusy
188f0 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65  Handler;.  pPage
18900 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
18910 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65  rg = pBusyHandle
18920 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rArg;.}../*.** R
18930 65 70 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e  eport the curren
18940 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20  t page size and 
18950 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
18960 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a  ed bytes back.**
18970 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a   to the codec..*
18980 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
18990 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74 69 63  HAS_CODEC.static
189a0 20 76 6f 69 64 20 70 61 67 65 72 52 65 70 6f 72   void pagerRepor
189b0 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  tSize(Pager *pPa
189c0 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
189d0 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68  er->xCodecSizeCh
189e0 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  ng ){.    pPager
189f0 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  ->xCodecSizeChng
18a00 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c  (pPager->pCodec,
18a10 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
18a20 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
18a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
18a40 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65 73 65  nt)pPager->nRese
18a50 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  rve);.  }.}.#els
18a60 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  e.# define pager
18a70 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20 20 20  ReportSize(X)   
18a80 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65    /* No-op if we
18a90 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
18aa0 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69  a codec */.#endi
18ab0 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  f../*.** Change 
18ac0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 75 73  the page size us
18ad0 65 64 20 62 79 20 74 68 65 20 50 61 67 65 72 20  ed by the Pager 
18ae0 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20  object. The new 
18af0 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73  page size .** is
18b00 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67   passed in *pPag
18b10 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eSize..**.** If 
18b20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
18b30 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
18b40 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
18b50 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
18b60 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  .** is a no-op. 
18b70 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
18b80 65 64 20 69 73 20 74 68 65 20 65 72 72 6f 72 20  ed is the error 
18b90 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  state error code
18ba0 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f   (i.e. .** one o
18bb0 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  f SQLITE_IOERR, 
18bc0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 6f  SQLITE_CORRUPT o
18bd0 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a  r SQLITE_FULL)..
18be0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
18bf0 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
18c00 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
18c10 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  e:.**.**   * the
18c20 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 28   new page size (
18c30 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65 53  value of *pPageS
18c40 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28 61  ize) is valid (a
18c50 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f   power .**     o
18c60 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35 31  f two between 51
18c70 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58  2 and SQLITE_MAX
18c80 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c  _PAGE_SIZE, incl
18c90 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a  usive), and.**.*
18ca0 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72 65 20  *   * there are 
18cb0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  no outstanding p
18cc0 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20  age references, 
18cd0 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  and.**.**   * th
18ce0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65 69  e database is ei
18cf0 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d  ther not an in-m
18d00 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 6f  emory database o
18d10 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 61  r it is.**     a
18d20 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
18d30 62 61 73 65 20 74 68 61 74 20 63 75 72 72 65 6e  base that curren
18d40 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  tly consists of 
18d50 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a  zero pages..**.*
18d60 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72  * then the pager
18d70 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69 7a   object page siz
18d80 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50 61  e is set to *pPa
18d90 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  geSize..**.** If
18da0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
18db0 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20  s changed, then 
18dc0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 73  this function us
18dd0 65 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  es sqlite3PagerM
18de0 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f  alloc() .** to o
18df0 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67 65  btain a new Page
18e00 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66  r.pTmpSpace buff
18e10 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c 6f  er. If this allo
18e20 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a  cation attempt .
18e30 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  ** fails, SQLITE
18e40 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
18e50 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  ed and the page 
18e60 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e 63  size remains unc
18e70 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61  hanged. .** In a
18e80 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20  ll other cases, 
18e90 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
18ea0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
18eb0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
18ec0 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65 69   not changed, ei
18ed0 74 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e 65  ther because one
18ee0 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61 74   of the enumerat
18ef0 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73  ed.** conditions
18f00 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74 72   above is not tr
18f10 75 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 61  ue, the pager wa
18f20 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65  s in error state
18f30 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75   when this.** fu
18f40 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
18f50 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74 68  d, or because th
18f60 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
18f70 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69 6c  ion attempt fail
18f80 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50  ed, .** then *pP
18f90 61 67 65 53 69 7a 65 20 69 73 20 73 65 74 20 74  ageSize is set t
18fa0 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61 69  o the old, retai
18fb0 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20 62 65  ned page size be
18fc0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
18fd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
18fe0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50  gerSetPagesize(P
18ff0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75 31  ager *pPager, u1
19000 36 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69 6e  6 *pPageSize, in
19010 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69  t nReserve){.  i
19020 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e  nt rc = pPager->
19030 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20  errCode;..  if( 
19040 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19050 0a 20 20 20 20 75 31 36 20 70 61 67 65 53 69 7a  .    u16 pageSiz
19060 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a  e = *pPageSize;.
19070 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
19080 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65  Size==0 || (page
19090 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
190a0 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
190b0 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a  X_PAGE_SIZE) );.
190c0 20 20 20 20 69 66 28 20 28 70 50 61 67 65 72 2d      if( (pPager-
190d0 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61  >memDb==0 || pPa
190e0 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a  ger->dbSize==0).
190f0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
19100 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
19110 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
19120 30 20 0a 20 20 20 20 20 26 26 20 70 61 67 65 53  0 .     && pageS
19130 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21  ize && pageSize!
19140 3d 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  =pPager->pageSiz
19150 65 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  e .    ){.      
19160 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 28 63 68  char *pNew = (ch
19170 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ar *)sqlite3Page
19180 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29  Malloc(pageSize)
19190 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65  ;.      if( !pNe
191a0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  w ){.        rc 
191b0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
191c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
191d0 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
191e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
191f0 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
19200 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
19210 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
19220 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
19230 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20  TmpSpace);.     
19240 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53     pPager->pTmpS
19250 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  pace = pNew;.   
19260 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
19270 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 50  heSetPageSize(pP
19280 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
19290 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
192a0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 50 61  }.    }.    *pPa
192b0 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70 50  geSize = (u16)pP
192c0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
192d0 20 20 20 20 69 66 28 20 6e 52 65 73 65 72 76 65      if( nReserve
192e0 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20  <0 ) nReserve = 
192f0 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
19300 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 52  ;.    assert( nR
19310 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65  eserve>=0 && nRe
19320 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20  serve<1000 );.  
19330 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72    pPager->nReser
19340 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72  ve = (i16)nReser
19350 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70  ve;.    pagerRep
19360 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b  ortSize(pPager);
19370 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19380 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
19390 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
193a0 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61  he "temporary pa
193b0 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20  ge" buffer held 
193c0 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79  internally.** by
193d0 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69   the pager.  Thi
193e0 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68  s is a buffer th
193f0 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68  at is big enough
19400 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20   to hold the.** 
19410 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f  entire content o
19420 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  f a database pag
19430 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20  e.  This buffer 
19440 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  is used internal
19450 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c  ly.** during rol
19460 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62  lback and will b
19470 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68  e overwritten wh
19480 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63  enever a rollbac
19490 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75  k.** occurs.  Bu
194a0 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20  t other modules 
194b0 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20  are free to use 
194c0 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20  it too, as long 
194d0 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63  as.** no rollbac
194e0 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67  ks are happening
194f0 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
19500 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
19510 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
19520 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
19530 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a  ->pTmpSpace;.}..
19540 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
19550 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   set the maximum
19560 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
19570 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69  ount if mxPage i
19580 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20  s positive. .** 
19590 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  Make no changes 
195a0 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72  if mxPage is zer
195b0 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20  o or negative.  
195c0 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65  And never reduce
195d0 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20   the.** maximum 
195e0 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77  page count below
195f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
19600 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
19610 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c  e..**.** Regardl
19620 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  ess of mxPage, r
19630 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
19640 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  t maximum page c
19650 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
19660 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
19670 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  Count(Pager *pPa
19680 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
19690 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20  {.  int nPage;. 
196a0 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b   if( mxPage>0 ){
196b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
196c0 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20  gno = mxPage;.  
196d0 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  }.  sqlite3Pager
196e0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
196f0 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 61 73 73  , &nPage);.  ass
19700 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 78 50  ert( pPager->mxP
19710 67 6e 6f 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20  gno>=nPage );.  
19720 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d  return pPager->m
19730 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xPgno;.}../*.** 
19740 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  The following se
19750 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72  t of routines ar
19760 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c  e used to disabl
19770 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a  e the simulated.
19780 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63  ** I/O error mec
19790 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72  hanism.  These r
197a0 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
197b0 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61   to avoid simula
197c0 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e  ted.** errors in
197d0 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65   places where we
197e0 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
197f0 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  ut errors..**.**
19800 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45   Unless -DSQLITE
19810 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c  _TEST=1 is used,
19820 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   these routines 
19830 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a  are all no-ops.*
19840 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e  * and generate n
19850 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65  o code..*/.#ifde
19860 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78  f SQLITE_TEST.ex
19870 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
19880 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
19890 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  g;.extern int sq
198a0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68  lite3_io_error_h
198b0 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73  it;.static int s
198c0 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64  aved_cnt;.void d
198d0 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
198e0 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
198f0 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20  {.  saved_cnt = 
19900 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
19910 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69  _pending;.  sqli
19920 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
19930 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69  ding = -1;.}.voi
19940 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  d enable_simulat
19950 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
19960 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  d){.  sqlite3_io
19970 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
19980 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65   saved_cnt;.}.#e
19990 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73  lse.# define dis
199a0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
199b0 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66  o_errors().# def
199c0 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ine enable_simul
199d0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
199e0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
199f0 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20  ead the first N 
19a00 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62  bytes from the b
19a10 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
19a20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  file into memory
19a30 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70  .** that pDest p
19a40 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a  oints to. .**.**
19a50 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77 61   If the pager wa
19a60 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72  s opened on a tr
19a70 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46  ansient file (zF
19a80 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72  ilename==""), or
19a90 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  .** opened on a 
19aa0 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e  file less than N
19ab0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
19ac0 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
19ad0 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61  r is.** zeroed a
19ae0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
19af0 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f  urned. The ratio
19b00 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73  nale for this is
19b10 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66   that this .** f
19b20 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
19b30 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65  to read database
19b40 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20   headers, and a 
19b50 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72  new transient or
19b60 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64  .** zero sized d
19b70 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68 65  atabase has a he
19b80 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73  ader than consis
19b90 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a  ts entirely of z
19ba0 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eroes..**.** If 
19bb0 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61  any IO error apa
19bc0 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49  rt from SQLITE_I
19bd0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
19be0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a  is encountered,.
19bf0 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  ** the error cod
19c00 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
19c10 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20   the caller and 
19c20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
19c30 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75  the.** output bu
19c40 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ffer undefined..
19c50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
19c60 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
19c70 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
19c80 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64   int N, unsigned
19c90 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20   char *pDest){. 
19ca0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
19cb0 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44  _OK;.  memset(pD
19cc0 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73  est, 0, N);.  as
19cd0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
19ce0 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
19cf0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
19d00 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
19d10 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
19d20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20  IOTRACE(("DBHDR 
19d30 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67  %p 0 %d\n", pPag
19d40 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d  er, N)).    rc =
19d50 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
19d60 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74  Pager->fd, pDest
19d70 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , N, 0);.    if(
19d80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
19d90 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
19da0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
19db0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
19dc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19dd0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
19de0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
19df0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
19e00 74 61 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f  tabase file asso
19e10 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20  ciated .** with 
19e20 70 50 61 67 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  pPager. Normally
19e30 2c 20 74 68 69 73 20 69 73 20 63 61 6c 63 75 6c  , this is calcul
19e40 61 74 65 64 20 61 73 20 28 3c 64 62 20 66 69 6c  ated as (<db fil
19e50 65 20 73 69 7a 65 3e 2f 3c 70 61 67 65 2d 73 69  e size>/<page-si
19e60 7a 65 3e 29 2e 0a 2a 2a 20 48 6f 77 65 76 65 72  ze>)..** However
19e70 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  , if the file is
19e80 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c   between 1 and <
19e90 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73  page-size> bytes
19ea0 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a   in size, then .
19eb0 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69  ** this is consi
19ec0 64 65 72 65 64 20 61 20 31 20 70 61 67 65 20 66  dered a 1 page f
19ed0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ile..**.** If th
19ee0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 72  e pager is in er
19ef0 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74  ror state when t
19f00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
19f10 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  called, then the
19f20 0a 2a 2a 20 65 72 72 6f 72 20 73 74 61 74 65 20  .** error state 
19f30 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
19f40 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61  turned and *pnPa
19f50 67 65 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  ge left unchange
19f60 64 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20 74 68 65  d. Or,.** if the
19f70 20 66 69 6c 65 20 73 79 73 74 65 6d 20 68 61 73   file system has
19f80 20 74 6f 20 62 65 20 71 75 65 72 69 65 64 20 66   to be queried f
19f90 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  or the size of t
19fa0 68 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74  he file and.** t
19fb0 68 65 20 71 75 65 72 79 20 61 74 74 65 6d 70 74  he query attempt
19fc0 20 72 65 74 75 72 6e 73 20 61 6e 20 49 4f 20 65   returns an IO e
19fd0 72 72 6f 72 2c 20 74 68 65 20 49 4f 20 65 72 72  rror, the IO err
19fe0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
19ff0 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50 61  ned.** and *pnPa
1a000 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  ge is left uncha
1a010 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  nged..**.** Othe
1a020 72 77 69 73 65 2c 20 69 66 20 65 76 65 72 79 74  rwise, if everyt
1a030 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
1a040 75 6c 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  ul, then SQLITE_
1a050 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
1a060 2a 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73  * and *pnPage is
1a070 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
1a080 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
1a090 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
1a0a0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1a0b0 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
1a0c0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e  *pPager, int *pn
1a0d0 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50  Page){.  Pgno nP
1a0e0 61 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  age = 0;        
1a0f0 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
1a100 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67  eturn via *pnPag
1a110 65 20 2a 2f 0a 0a 20 20 2f 2a 20 44 65 74 65 72  e */..  /* Deter
1a120 6d 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mine the number 
1a130 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
1a140 66 69 6c 65 2e 20 53 74 6f 72 65 20 74 68 69 73  file. Store this
1a150 20 69 6e 20 6e 50 61 67 65 2e 20 2a 2f 0a 20 20   in nPage. */.  
1a160 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
1a170 7a 65 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 6e  zeValid ){.    n
1a180 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Page = pPager->d
1a190 62 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  bSize;.  }else{.
1a1a0 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20      int rc;     
1a1b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
1a1c0 72 72 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79  rror returned by
1a1d0 20 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f   OsFileSize() */
1a1e0 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20  .    i64 n = 0; 
1a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a200 46 69 6c 65 20 73 69 7a 65 20 69 6e 20 62 79 74  File size in byt
1a210 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  es returned by O
1a220 73 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 0a  sFileSize() */..
1a230 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
1a240 4c 6f 67 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Log(pPager) ){. 
1a250 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 4d       sqlite3LogM
1a260 61 78 70 67 6e 6f 28 70 50 61 67 65 72 2d 3e 70  axpgno(pPager->p
1a270 4c 6f 67 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  Log, &nPage);.  
1a280 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6e 50 61    }..    if( nPa
1a290 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ge==0 ){.      a
1a2a0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1a2b0 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
1a2c0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
1a2d0 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65  .      if( isOpe
1a2e0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
1a2f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c  .        if( SQL
1a300 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
1a310 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
1a320 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29  pPager->fd, &n))
1a330 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61   ){.          pa
1a340 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
1a350 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20  , rc);.         
1a360 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1a370 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1a380 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e      if( n>0 && n
1a390 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  <pPager->pageSiz
1a3a0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 50 61  e ){.        nPa
1a3b0 67 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  ge = 1;.      }e
1a3c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 50 61  lse{.        nPa
1a3d0 67 65 20 3d 20 28 50 67 6e 6f 29 28 6e 20 2f 20  ge = (Pgno)(n / 
1a3e0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1a3f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1a400 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1a410 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
1a420 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
1a430 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
1a440 50 61 67 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Page;.      pPag
1a450 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
1a460 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 70 50   nPage;.      pP
1a470 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
1a480 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 1;.    }.  }
1a490 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
1a4a0 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20  rrent number of 
1a4b0 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
1a4c0 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  e is greater tha
1a4d0 6e 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f 6e 66  n the .  ** conf
1a4e0 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70  igured maximum p
1a4f0 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63  ager number, inc
1a500 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65  rease the allowe
1a510 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20  d limit so.  ** 
1a520 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63 61  that the file ca
1a530 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a  n be read..  */.
1a540 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67    if( nPage>pPag
1a550 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
1a560 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
1a570 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a   = (Pgno)nPage;.
1a580 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
1a590 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
1a5a0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  e and return SQL
1a5b0 49 54 45 5f 4f 4b 20 2a 2f 0a 20 20 2a 70 6e 50  ITE_OK */.  *pnP
1a5c0 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72  age = nPage;.  r
1a5d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a5e0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  .}.../*.** Try t
1a5f0 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  o obtain a lock 
1a600 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65  of type locktype
1a610 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1a620 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73   file. If.** a s
1a630 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65  imilar or greate
1a640 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  r lock is alread
1a650 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e  y held, this fun
1a660 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
1a670 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53  .** (returning S
1a680 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61  QLITE_OK immedia
1a690 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  tely)..**.** Oth
1a6a0 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20  erwise, attempt 
1a6b0 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  to obtain the lo
1a6c0 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ck using sqlite3
1a6d0 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65  OsLock(). Invoke
1a6e0 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61   .** the busy ca
1a6f0 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f  llback if the lo
1a700 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ck is currently 
1a710 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52  not available. R
1a720 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20  epeat .** until 
1a730 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
1a740 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20  k returns false 
1a750 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74  or until the att
1a760 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61  empt to .** obta
1a770 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63  in the lock succ
1a780 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eeds..**.** Retu
1a790 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
1a7a0 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65  success and an e
1a7b0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
1a7c0 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a  cannot obtain.**
1a7d0 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68   the lock. If th
1a7e0 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  e lock is obtain
1a7f0 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ed successfully,
1a800 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 73   set the Pager.s
1a810 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c  tate .** variabl
1a820 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65  e to locktype be
1a830 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
1a840 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1a850 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
1a860 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1a870 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
1a880 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1a890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8a0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1a8b0 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
1a8c0 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73  e OS lock values
1a8d0 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
1a8e0 65 20 61 73 20 74 68 65 20 50 61 67 65 72 20 6c  e as the Pager l
1a8f0 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ock values */.  
1a900 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53 48  assert( PAGER_SH
1a910 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  ARED==SHARED_LOC
1a920 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  K );.  assert( P
1a930 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52  AGER_RESERVED==R
1a940 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
1a950 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
1a960 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55  EXCLUSIVE==EXCLU
1a970 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  SIVE_LOCK );..  
1a980 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
1a990 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f  s currently unlo
1a9a0 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73 69  cked then the si
1a9b0 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f  ze must be unkno
1a9c0 77 6e 2e 20 49 74 0a 20 20 2a 2a 20 6d 75 73 74  wn. It.  ** must
1a9d0 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6d   not have been m
1a9e0 6f 64 69 66 69 65 64 20 61 74 20 74 68 69 73 20  odified at this 
1a9f0 70 6f 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  point..  */.  as
1aa00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1aa10 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
1aa20 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53  D || pPager->dbS
1aa30 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20  izeValid==0 );. 
1aa40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1aa50 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
1aa60 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  ARED || pPager->
1aa70 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 29 3b  dbModified==0 );
1aa80 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
1aa90 74 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72  t this is either
1aaa0 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73   a no-op (becaus
1aab0 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  e the requested 
1aac0 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c  lock is .  ** al
1aad0 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f  ready held, or o
1aae0 6e 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69  ne of the transi
1aaf0 73 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20  stions that the 
1ab00 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a  busy-handler.  *
1ab10 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64  * may be invoked
1ab20 20 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69   during, accordi
1ab30 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e  ng to the commen
1ab40 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c  t above.  ** sql
1ab50 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
1ab60 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a  handler()..  */.
1ab70 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
1ab80 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79  r->state>=lockty
1ab90 70 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  pe).       || (p
1aba0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
1abb0 47 45 52 5f 55 4e 4c 4f 43 4b 20 26 26 20 6c 6f  GER_UNLOCK && lo
1abc0 63 6b 74 79 70 65 3d 3d 50 41 47 45 52 5f 53 48  cktype==PAGER_SH
1abd0 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  ARED).       || 
1abe0 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d  (pPager->state==
1abf0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 26  PAGER_RESERVED &
1ac00 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50 41 47 45  & locktype==PAGE
1ac10 52 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 29  R_EXCLUSIVE).  )
1ac20 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
1ac30 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65  >state>=locktype
1ac40 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1ac50 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
1ac60 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
1ac70 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
1ac80 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c  ck(pPager->fd, l
1ac90 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77  ocktype);.    }w
1aca0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
1acb0 5f 42 55 53 59 20 26 26 20 70 50 61 67 65 72 2d  _BUSY && pPager-
1acc0 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50  >xBusyHandler(pP
1acd0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
1ace0 65 72 41 72 67 29 20 29 3b 0a 20 20 20 20 69 66  erArg) );.    if
1acf0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ad00 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
1ad10 3e 73 74 61 74 65 20 3d 20 28 75 38 29 6c 6f 63  >state = (u8)loc
1ad20 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54  ktype;.      IOT
1ad30 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25  RACE(("LOCK %p %
1ad40 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f  d\n", pPager, lo
1ad50 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20  cktype)).    }. 
1ad60 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1ad70 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f  }../*.** Functio
1ad80 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  n assertTruncate
1ad90 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65  Constraint(pPage
1ada0 72 29 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f  r) checks that o
1adb0 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f  ne of the .** fo
1adc0 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20  llowing is true 
1add0 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61  for all dirty pa
1ade0 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ges currently in
1adf0 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a   the page-cache:
1ae00 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20  .**.**   a) The 
1ae10 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c  page number is l
1ae20 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
1ae30 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  l to the size of
1ae40 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75   the .**      cu
1ae50 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 69  rrent database i
1ae60 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20  mage, in pages, 
1ae70 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66  OR.**.**   b) if
1ae80 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
1ae90 74 20 77 65 72 65 20 77 72 69 74 74 65 6e 20 61  t were written a
1aea0 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20  t this time, it 
1aeb0 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20  would not.**    
1aec0 20 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74    be necessary t
1aed0 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  o write the curr
1aee0 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20  ent content out 
1aef0 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
1af00 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64  al.**      (as d
1af10 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e  etermined by fun
1af20 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72  ction subjRequir
1af30 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a  esPage())..**.**
1af40 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f   If the conditio
1af50 6e 20 61 73 73 65 72 74 65 64 20 62 79 20 74 68  n asserted by th
1af60 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65  is function were
1af70 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74   not true, and t
1af80 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65  he.** dirty page
1af90 20 77 65 72 65 20 74 6f 20 62 65 20 64 69 73 63   were to be disc
1afa0 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63  arded from the c
1afb0 61 63 68 65 20 76 69 61 20 74 68 65 20 70 61 67  ache via the pag
1afc0 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f  erStress().** ro
1afd0 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65  utine, pagerStre
1afe0 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77  ss() would not w
1aff0 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
1b000 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f   page content to
1b010 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
1b020 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65   file. If a save
1b030 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  point transactio
1b040 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61  n were rolled ba
1b050 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73  ck after.** this
1b060 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63   happened, the c
1b070 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 75 72  orrect behaviour
1b080 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73   would be to res
1b090 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  tore the current
1b0a0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
1b0b0 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72  he page. However
1b0c0 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e  , since this con
1b0d0 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73  tent is not pres
1b0e0 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a  ent in either.**
1b0f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b100 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f  le or the portio
1b110 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  n of the rollbac
1b120 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a  k journal and .*
1b130 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f  * sub-journal ro
1b140 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f  lled back the co
1b150 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ntent could not 
1b160 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20  be restored and 
1b170 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
1b180 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f  image would beco
1b190 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69  me corrupt. It i
1b1a0 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74  s therefore fort
1b1b0 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74  unate that .** t
1b1c0 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65  his circumstance
1b1d0 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a   cannot arise..*
1b1e0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
1b1f0 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74  LITE_DEBUG).stat
1b200 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72  ic void assertTr
1b210 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
1b220 43 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  Cb(PgHdr *pPg){.
1b230 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
1b240 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
1b250 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73   );.  assert( !s
1b260 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
1b270 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  pPg) || pPg->pgn
1b280 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  o<=pPg->pPager->
1b290 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74  dbSize );.}.stat
1b2a0 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72  ic void assertTr
1b2b0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
1b2c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1b2d0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
1b2e0 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
1b2f0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73  ger->pPCache, as
1b300 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
1b310 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c  traintCb);.}.#el
1b320 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65  se.# define asse
1b330 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
1b340 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e  aint(pPager).#en
1b350 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  dif../*.** Trunc
1b360 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
1b370 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
1b380 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70  image to nPage p
1b390 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66  ages. This .** f
1b3a0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
1b3b0 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79   actually modify
1b3c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b3d0 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a  le on disk. It .
1b3e0 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68 65  ** just sets the
1b3f0 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
1b400 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  of the pager obj
1b410 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  ect so that the 
1b420 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77  .** truncation w
1b430 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e  ill be done when
1b440 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
1b450 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
1b460 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  itted..*/.void s
1b470 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
1b480 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a  ateImage(Pager *
1b490 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
1b4a0 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
1b4b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
1b4c0 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  id );.  assert( 
1b4d0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
1b4e0 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  nPage );.  asser
1b4f0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1b500 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
1b510 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   );.  pPager->db
1b520 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
1b530 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
1b540 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
1b550 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
1b560 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1b570 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  led before attem
1b580 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  pting a hot-jour
1b590 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74  nal rollback. It
1b5a0 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f  .** syncs the jo
1b5b0 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69  urnal file to di
1b5c0 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50  sk, then sets pP
1b5d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1b5e0 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20   to the.** size 
1b5f0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1b600 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  ile so that the 
1b610 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
1b620 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a   routine knows.*
1b630 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 69 72  * that the entir
1b640 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
1b650 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a  as been synced..
1b660 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20  **.** Syncing a 
1b670 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64  hot-journal to d
1b680 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d  isk before attem
1b690 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74  pting to roll it
1b6a0 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a   back ensures .*
1b6b0 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  * that if a powe
1b6c0 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r-failure occurs
1b6d0 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c   during the roll
1b6e0 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73  back, the proces
1b6f0 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70  s that.** attemp
1b700 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c  ts rollback foll
1b710 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63  owing system rec
1b720 6f 76 65 72 79 20 73 65 65 73 20 74 68 65 20 73  overy sees the s
1b730 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63  ame journal.** c
1b740 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20 70  ontent as this p
1b750 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  rocess..**.** If
1b760 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73   everything goes
1b770 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c   as planned, SQL
1b780 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1b790 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a  ed. Otherwise, .
1b7a0 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  ** an SQLite err
1b7b0 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
1b7c0 69 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63  ic int pagerSync
1b7d0 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  HotJournal(Pager
1b7e0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
1b7f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1b800 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
1b810 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63  noSync ){.    rc
1b820 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
1b830 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51  (pPager->jfd, SQ
1b840 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
1b850 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1b860 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b870 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1b880 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
1b890 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a  >jfd, &pPager->j
1b8a0 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a  ournalHdr);.  }.
1b8b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1b8c0 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
1b8d0 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
1b8e0 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
1b8f0 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69  and close all fi
1b900 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  les..**.** If a 
1b910 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
1b920 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e  in progress when
1b930 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1b940 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a   called, that.**
1b950 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1b960 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c  rolled back.  Al
1b970 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  l outstanding pa
1b980 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
1b990 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72  ted.** and their
1b9a0 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64   memory is freed
1b9b0 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
1b9c0 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73  o use a page ass
1b9d0 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
1b9e0 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20  this page cache 
1b9f0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
1ba00 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c  ion returns will
1ba10 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
1ba20 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
1ba30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
1ba40 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63  tion always succ
1ba50 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73  eeds. If a trans
1ba60 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
1ba70 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69   an attempt.** i
1ba80 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69  s made to roll i
1ba90 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72  t back. If an er
1baa0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
1bab0 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a  g the rollback .
1bac0 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** a hot journal
1bad0 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
1bae0 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62  the filesystem b
1baf0 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72  ut no error is r
1bb00 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68  eturned.** to th
1bb10 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74  e caller..*/.int
1bb20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
1bb30 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  se(Pager *pPager
1bb40 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20  ){.  u8 *pTmp = 
1bb50 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54  (u8 *)pPager->pT
1bb60 6d 70 53 70 61 63 65 3b 0a 0a 20 20 64 69 73 61  mpSpace;..  disa
1bb70 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
1bb80 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c  _errors();.  sql
1bb90 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
1bba0 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 50 61 67 65  alloc();.  pPage
1bbb0 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a  r->errCode = 0;.
1bbc0 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
1bbd0 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73  iveMode = 0;.  s
1bbe0 71 6c 69 74 65 33 4c 6f 67 43 6c 6f 73 65 28 70  qlite3LogClose(p
1bbf0 50 61 67 65 72 2d 3e 70 4c 6f 67 2c 20 70 50 61  Pager->pLog, pPa
1bc00 67 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20 28 70  ger->fd, .    (p
1bc10 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20  Pager->noSync ? 
1bc20 30 20 3a 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  0 : pPager->sync
1bc30 5f 66 6c 61 67 73 29 2c 20 70 54 6d 70 0a 20 20  _flags), pTmp.  
1bc40 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 6f  );.  pPager->pLo
1bc50 67 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72  g = 0;.  pager_r
1bc60 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1bc70 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1bc80 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
1bc90 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
1bca0 20 20 20 20 2f 2a 20 53 65 74 20 50 61 67 65 72      /* Set Pager
1bcb0 2e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 2d  .journalHdr to -
1bcc0 31 20 66 6f 72 20 74 68 65 20 62 65 6e 65 66 69  1 for the benefi
1bcd0 74 20 6f 66 20 74 68 65 20 70 61 67 65 72 5f 70  t of the pager_p
1bce0 6c 61 79 62 61 63 6b 28 29 20 0a 20 20 20 20 2a  layback() .    *
1bcf0 2a 20 63 61 6c 6c 20 77 68 69 63 68 20 6d 61 79  * call which may
1bd00 20 62 65 20 6d 61 64 65 20 66 72 6f 6d 20 77 69   be made from wi
1bd10 74 68 69 6e 20 70 61 67 65 72 55 6e 6c 6f 63 6b  thin pagerUnlock
1bd20 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 49  AndRollback(). I
1bd30 66 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e  f it.    ** is n
1bd40 6f 74 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20  ot -1, then the 
1bd50 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
1bd60 20 6f 66 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72   of an open jour
1bd70 6e 61 6c 20 66 69 6c 65 20 6d 61 79 0a 20 20 20  nal file may.   
1bd80 20 2a 2a 20 62 65 20 70 6c 61 79 65 64 20 62 61   ** be played ba
1bd90 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
1bda0 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72  base. If a power
1bdb0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
1bdc0 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69  while.    ** thi
1bdd0 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20  s is happening, 
1bde0 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79  the database may
1bdf0 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e   become corrupt.
1be00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1be10 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
1be20 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61  fd) ){.      pPa
1be30 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70  ger->errCode = p
1be40 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
1be50 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
1be60 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  }.    pagerUnloc
1be70 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
1be80 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
1be90 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
1bea0 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73  oc();.  enable_s
1beb0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
1bec0 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41  rs();.  PAGERTRA
1bed0 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE(("CLOSE %d\n"
1bee0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1bef0 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  )));.  IOTRACE((
1bf00 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
1bf10 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33  ager)).  sqlite3
1bf20 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
1bf30 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  fd);.  sqlite3Pa
1bf40 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20  geFree(pTmp);.  
1bf50 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f  sqlite3PcacheClo
1bf60 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  se(pPager->pPCac
1bf70 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  he);..#ifdef SQL
1bf80 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
1bf90 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
1bfa0 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d  ecFree ) pPager-
1bfb0 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67  >xCodecFree(pPag
1bfc0 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e  er->pCodec);.#en
1bfd0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21  dif..  assert( !
1bfe0 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
1bff0 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70  nt && !pPager->p
1c000 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  InJournal );.  a
1c010 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
1c020 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21  Pager->jfd) && !
1c030 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
1c040 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74  jfd) );..  sqlit
1c050 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
1c060 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1c070 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  _OK;.}..#if !def
1c080 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
1c090 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1c0a0 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
1c0b0 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
1c0c0 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  r for page pPg..
1c0d0 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50  */.Pgno sqlite3P
1c0e0 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44  agerPagenumber(D
1c0f0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
1c100 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b  eturn pPg->pgno;
1c110 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1c120 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
1c130 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
1c140 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
1c150 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
1c160 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
1c170 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
1c180 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f  heRef(pPg);.}../
1c190 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
1c1a0 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20  urnal. In other 
1c1b0 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
1c1c0 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
1c1d0 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
1c1e0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1c1f0 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
1c200 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
1c210 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
1c220 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e  .** disk and can
1c230 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20   be restored in 
1c240 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68  the event of a h
1c250 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1c260 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
1c270 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
1c280 20 66 6c 61 67 20 69 73 20 6e 6f 74 20 73 65 74   flag is not set
1c290 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
1c2a0 74 69 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d  tion is a.** no-
1c2b0 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  op. Otherwise, t
1c2c0 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69  he actions requi
1c2d0 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68  red depend on th
1c2e0 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 0a 2a  e journal-mode.*
1c2f0 2a 20 61 6e 64 20 74 68 65 20 64 65 76 69 63 65  * and the device
1c300 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
1c310 20 6f 66 20 74 68 65 20 74 68 65 20 66 69 6c 65   of the the file
1c320 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c  -system, as foll
1c330 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ows:.**.**   * I
1c340 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1c350 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  le is an in-memo
1c360 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ry journal file,
1c370 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a   no action need.
1c380 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e  **     be taken.
1c390 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72  .**.**   * Other
1c3a0 77 69 73 65 2c 20 69 66 20 74 68 65 20 64 65 76  wise, if the dev
1c3b0 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
1c3c0 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41 50  port the SAFE_AP
1c3d0 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a  PEND property,.*
1c3e0 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e  *     then the n
1c3f0 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65  Rec field of the
1c400 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77   most recently w
1c410 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68  ritten journal h
1c420 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20  eader.**     is 
1c430 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61  updated to conta
1c440 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  in the number of
1c450 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73   journal records
1c460 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20   that have.**   
1c470 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66    been written f
1c480 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20  ollowing it. If 
1c490 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 70 65  the pager is ope
1c4a0 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73  rating in full-s
1c4b0 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c  ync.**     mode,
1c4c0 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
1c4d0 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  l file is synced
1c4e0 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 69 65   before this fie
1c4f0 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a  ld is updated..*
1c500 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
1c510 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20  device does not 
1c520 73 75 70 70 6f 72 74 20 74 68 65 20 53 45 51 55  support the SEQU
1c530 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c  ENTIAL property,
1c540 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f   then .**     jo
1c550 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79  urnal file is sy
1c560 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  nced..**.** Or, 
1c570 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a  in pseudo-code:.
1c580 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20  **.**   if( NOT 
1c590 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e  <in-memory journ
1c5a0 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66  al> ){.**     if
1c5b0 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e  ( NOT SAFE_APPEN
1c5c0 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66  D ){.**       if
1c5d0 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  ( <full-sync mod
1c5e0 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72  e> ) xSync(<jour
1c5f0 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20  nal file>);.**  
1c600 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65       <update nRe
1c610 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20  c field>.**     
1c620 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f  } .**     if( NO
1c630 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78  T SEQUENTIAL ) x
1c640 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
1c650 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a  le>);.**   }.**.
1c660 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 6e 65 65  ** The Pager.nee
1c670 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 65  dSync flag is ne
1c680 76 65 72 20 62 65 20 73 65 74 20 66 6f 72 20 74  ver be set for t
1c690 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20  emporary files, 
1c6a0 6f 72 20 61 6e 79 0a 2a 2a 20 66 69 6c 65 20 6f  or any.** file o
1c6b0 70 65 72 61 74 69 6e 67 20 69 6e 20 6e 6f 2d 73  perating in no-s
1c6c0 79 6e 63 20 6d 6f 64 65 20 28 50 61 67 65 72 2e  ync mode (Pager.
1c6d0 6e 6f 53 79 6e 63 20 73 65 74 20 74 6f 20 6e 6f  noSync set to no
1c6e0 6e 2d 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49  n-zero)..**.** I
1c6f0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  f successful, th
1c700 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72  is routine clear
1c710 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  s the PGHDR_NEED
1c720 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76  _SYNC flag of ev
1c730 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72  ery .** page cur
1c740 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d  rently held in m
1c750 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74  emory before ret
1c760 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b  urning SQLITE_OK
1c770 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  . If an IO.** er
1c780 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
1c790 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  ed, then the IO 
1c7a0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1c7b0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
1c7c0 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
1c7d0 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
1c7e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1c7f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65    if( pPager->ne
1c800 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  edSync ){.    as
1c810 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
1c820 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
1c830 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
1c840 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
1c850 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
1c860 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
1c870 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c890 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1c8a0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
1c8b0 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
1c8c0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1c8d0 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
1c8e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1c8f0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1c900 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69  jfd) );..      i
1c910 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
1c920 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
1c930 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
1c940 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65  /* This block de
1c950 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63  als with an obsc
1c960 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20  ure problem. If 
1c970 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74  the last connect
1c980 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ion.        ** t
1c990 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69  hat wrote to thi
1c9a0 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f  s database was o
1c9b0 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73  perating in pers
1c9c0 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20  istent-journal. 
1c9d0 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20         ** mode, 
1c9e0 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1c9f0 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69   file may at thi
1ca00 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79  s point actually
1ca10 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20   be larger.     
1ca20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
1ca30 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65  .journalOff byte
1ca40 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74  s. If the next t
1ca50 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72  hing in the jour
1ca60 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  nal.        ** f
1ca70 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  ile happens to b
1ca80 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  e a journal-head
1ca90 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70  er (written as p
1caa0 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20  art of the.     
1cab0 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63     ** previous c
1cac0 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e  onnection's tran
1cad0 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20  saction), and a 
1cae0 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66  crash or power-f
1caf0 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20  ailure .        
1cb00 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20  ** occurs after 
1cb10 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
1cb20 62 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20  but before this 
1cb30 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65  connection write
1cb40 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  s .        ** an
1cb50 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74  ything else to t
1cb60 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1cb70 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c  (or commits/roll
1cb80 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20  s back its .    
1cb90 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1cba0 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65  on), then SQLite
1cbb0 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66   may become conf
1cbc0 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20  used when doing 
1cbd0 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
1cbe0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
1cbf0 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72  back following r
1cc00 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20  ecovery. It may 
1cc10 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20  roll back all.  
1cc20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73        ** of this
1cc30 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74   connections dat
1cc40 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20  a, then proceed 
1cc50 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  to rolling back 
1cc60 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20  the old,.       
1cc70 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20   ** out-of-date 
1cc80 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77  data that follow
1cc90 73 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63  s it. Database c
1cca0 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20  orruption..     
1ccb0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
1ccc0 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
1ccd0 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75  this, if the jou
1cce0 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61  rnal file does a
1ccf0 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e  ppear to contain
1cd00 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61  .        ** a va
1cd10 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f  lid header follo
1cd20 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e  wing Pager.journ
1cd30 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74  alOff, then writ
1cd40 65 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20  e a 0x00.       
1cd50 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20   ** byte to the 
1cd60 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70  start of it to p
1cd70 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62  revent it from b
1cd80 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e  eing recognized.
1cd90 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1cda0 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20      ** Variable 
1cdb0 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69  iNextHdrOffset i
1cdc0 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66  s set to the off
1cdd0 73 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69  set at which thi
1cde0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  s.        ** pro
1cdf0 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20  blematic header 
1ce00 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69  will occur, if i
1ce10 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63  t exists. aMagic
1ce20 20 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20   is used .      
1ce30 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72    ** as a tempor
1ce40 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e  ary buffer to in
1ce50 73 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20  spect the first 
1ce60 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20  couple of bytes 
1ce70 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  of.        ** th
1ce80 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72  e potential jour
1ce90 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20  nal header..    
1cea0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1ceb0 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  64 iNextHdrOffse
1cec0 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d  t;.        u8 aM
1ced0 61 67 69 63 5b 38 5d 3b 0a 09 75 38 20 7a 48 65  agic[8];..u8 zHe
1cee0 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
1cef0 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a  rnalMagic)+4];..
1cf00 09 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c  .memcpy(zHeader,
1cf10 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
1cf20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
1cf30 61 67 69 63 29 29 3b 0a 09 70 75 74 33 32 62 69  agic));..put32bi
1cf40 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
1cf50 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
1cf60 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  )], pPager->nRec
1cf70 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78  );..        iNex
1cf80 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75  tHdrOffset = jou
1cf90 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
1cfa0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72  ager);.        r
1cfb0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
1cfc0 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
1cfd0 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48  Magic, 8, iNextH
1cfe0 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  drOffset);.     
1cff0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d000 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  E_OK && 0==memcm
1d010 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
1d020 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20  alMagic, 8) ){. 
1d030 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
1d040 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74  const u8 zerobyt
1d050 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
1d060 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
1d070 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
1d080 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20  , &zerobyte, 1, 
1d090 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b  iNextHdrOffset);
1d0a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d0b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d0c0 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
1d0d0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
1d0e0 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
1d0f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1d100 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
1d110 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
1d120 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20   value into the 
1d130 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61  journal file hea
1d140 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20  der. If in.     
1d150 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68     ** full-synch
1d160 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e  ronous mode, syn
1d170 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
1d180 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65  rst. This ensure
1d190 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
1d1a0 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72  * all data has r
1d1b0 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69  eally hit the di
1d1c0 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69  sk before nRec i
1d1d0 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72  s updated to mar
1d1e0 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  k.        ** it 
1d1f0 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  as a candidate f
1d200 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20  or rollback..   
1d210 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1d220 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  ** This is not r
1d230 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70  equired if the p
1d240 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20  ersistent media 
1d250 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20  supports the.   
1d260 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50       ** SAFE_APP
1d270 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65  END property. Be
1d280 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61  cause in this ca
1d290 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  se it is not pos
1d2a0 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a  sible .        *
1d2b0 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61  * for garbage da
1d2c0 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65  ta to be appende
1d2d0 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74  d to the file, t
1d2e0 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20  he nRec field.  
1d2f0 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75        ** is popu
1d300 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46  lated with 0xFFF
1d310 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a  FFFFF when the j
1d320 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
1d330 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20   written.       
1d340 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65   ** and never ne
1d350 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
1d360 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
1d370 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1d380 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d  ->fullSync && 0=
1d390 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
1d3a0 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29  AP_SEQUENTIAL) )
1d3b0 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  {.          PAGE
1d3c0 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f  RTRACE(("SYNC jo
1d3d0 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
1d3e0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1d3f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54  );.          IOT
1d400 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
1d410 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
1d420 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1d430 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
1d440 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
1d450 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20  ync_flags);.    
1d460 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1d470 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1d480 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
1d490 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
1d4a0 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22  "JHDR %p %lld\n"
1d4b0 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
1d4c0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a  ->journalHdr));.
1d4d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1d4e0 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20  ite3OsWrite(.   
1d4f0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1d500 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73  >jfd, zHeader, s
1d510 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20  izeof(zHeader), 
1d520 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
1d530 64 72 0a 09 29 3b 0a 20 20 20 20 20 20 20 20 69  dr..);.        i
1d540 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d550 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1d560 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1d570 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
1d580 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
1d590 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45   ){.        PAGE
1d5a0 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f  RTRACE(("SYNC jo
1d5b0 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
1d5c0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1d5d0 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  );.        IOTRA
1d5e0 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22  CE(("JSYNC %p\n"
1d5f0 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
1d600 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1d610 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
1d620 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
1d630 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20  flags| .        
1d640 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f    (pPager->sync_
1d650 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59  flags==SQLITE_SY
1d660 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53  NC_FULL?SQLITE_S
1d670 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a  YNC_DATAONLY:0).
1d680 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
1d690 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d6a0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1d6b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d6c0 0a 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72  .    /* The jour
1d6d0 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73  nal file was jus
1d6e0 74 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73  t successfully s
1d6f0 79 6e 63 65 64 2e 20 53 65 74 20 50 61 67 65 72  ynced. Set Pager
1d700 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 2a  .needSync .    *
1d710 2a 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 63 6c  * to zero and cl
1d720 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45  ear the PGHDR_NE
1d730 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20  ED_SYNC flag on 
1d740 61 6c 6c 20 70 61 67 65 73 73 2e 0a 20 20 20 20  all pagess..    
1d750 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
1d760 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
1d770 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1d780 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20  Started = 1;.   
1d790 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1d7a0 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
1d7b0 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 73 71  urnalOff;.    sq
1d7c0 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72  lite3PcacheClear
1d7d0 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72  SyncFlags(pPager
1d7e0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a  ->pPCache);.  }.
1d7f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1d800 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
1d810 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
1d820 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e  e first in a lin
1d830 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74  ked list of dirt
1d840 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65  y pages connecte
1d850 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64  d.** by the PgHd
1d860 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  r.pDirty pointer
1d870 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1d880 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20  writes each one 
1d890 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d  of the.** in-mem
1d8a0 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  ory pages in the
1d8b0 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74   list to the dat
1d8c0 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
1d8d0 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20  argument may.** 
1d8e0 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65  be NULL, represe
1d8f0 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c  nting an empty l
1d900 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ist. In this cas
1d910 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
1d920 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is.** a no-op..*
1d930 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d  *.** The pager m
1d940 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73  ust hold at leas
1d950 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
1d960 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  k when this func
1d970 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tion.** is calle
1d980 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e  d. Before writin
1d990 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68  g anything to th
1d9a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
1d9b0 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73   this lock.** is
1d9c0 20 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20   upgraded to an 
1d9d0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
1d9e0 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e  If the lock cann
1d9f0 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a  ot be obtained,.
1da00 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  ** SQLITE_BUSY i
1da10 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e  s returned and n
1da20 6f 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  o data is writte
1da30 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
1da40 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49  e file..** .** I
1da50 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61  f the pager is a
1da60 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72   temp-file pager
1da70 20 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20   and the actual 
1da80 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65  file-system file
1da90 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f  .** is not yet o
1daa0 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74  pen, it is creat
1dab0 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65  ed and opened be
1dac0 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73  fore any data is
1dad0 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74   .** written out
1dae0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65  ..**.** Once the
1daf0 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75   lock has been u
1db00 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20  pgraded and, if 
1db10 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66  necessary, the f
1db20 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74  ile opened,.** t
1db30 68 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69  he pages are wri
1db40 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20  tten out to the 
1db50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
1db60 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69   list order. Wri
1db70 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69  ting.** a page i
1db80 73 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20  s skipped if it 
1db90 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20  meets either of 
1dba0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72  the following cr
1dbb0 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  iteria:.**.**   
1dbc0 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
1dbd0 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
1dbe0 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
1dbf0 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47  or.**   * The PG
1dc00 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66  HDR_DONT_WRITE f
1dc10 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68  lag is set on th
1dc20 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e page..**.** If
1dc30 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70   writing out a p
1dc40 61 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64  age causes the d
1dc50 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
1dc60 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69  grow, Pager.dbFi
1dc70 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64  leSize.** is upd
1dc80 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  ated accordingly
1dc90 2e 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77  . If page 1 is w
1dca0 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e  ritten out, then
1dcb0 20 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65   the value cache
1dcc0 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62  d.** in Pager.db
1dcd0 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70  FileVers[] is up
1dce0 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74  dated to match t
1dcf0 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f  he new value sto
1dd00 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61  red in.** the da
1dd10 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1dd20 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
1dd30 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
1dd40 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1dd50 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
1dd60 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
1dd70 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  , an IO error co
1dd80 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
1dd90 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55  Or, if the EXCLU
1dda0 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74  SIVE lock cannot
1ddb0 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  .** be obtained,
1ddc0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
1ddd0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1dde0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
1ddf0 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48  ite_pagelist(PgH
1de00 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61  dr *pList){.  Pa
1de10 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20  ger *pPager;    
1de20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de30 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
1de40 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ct */.  int rc; 
1de50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1de70 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
1de80 20 20 69 66 28 20 4e 45 56 45 52 28 70 4c 69 73    if( NEVER(pLis
1de90 74 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 53  t==0) ) return S
1dea0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67  QLITE_OK;.  pPag
1deb0 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67  er = pList->pPag
1dec0 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69  er;..  /* At thi
1ded0 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61  s point there ma
1dee0 79 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45  y be either a RE
1def0 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
1df00 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  IVE lock on the.
1df10 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1df20 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  le. If there is 
1df30 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55  already an EXCLU
1df40 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66  SIVE lock, the f
1df50 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61  ollowing.  ** ca
1df60 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  ll is a no-op.. 
1df70 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20   **.  ** Moving 
1df80 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45  the lock from RE
1df90 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53  SERVED to EXCLUS
1dfa0 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76  IVE actually inv
1dfb0 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a  olves going.  **
1dfc0 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65   through an inte
1dfd0 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50  rmediate state P
1dfe0 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44  ENDING.   A PEND
1dff0 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74  ING lock prevent
1e000 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65  s new.  ** reade
1e010 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e  rs from attachin
1e020 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
1e030 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69  e but is unsuffi
1e040 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a  cient for us to.
1e050 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65    ** write.  The
1e060 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49   idea of a PENDI
1e070 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72  NG lock is to pr
1e080 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72  event new reader
1e090 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69  s from.  ** comi
1e0a0 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77  ng in while we w
1e0b0 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67  ait for existing
1e0c0 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61   readers to clea
1e0d0 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69  r..  **.  ** Whi
1e0e0 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  le the pager is 
1e0f0 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20  in the RESERVED 
1e100 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69  state, the origi
1e110 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
1e120 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e  e.  ** is unchan
1e130 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72  ged and we can r
1e140 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ollback without 
1e150 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61  having to playba
1e160 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  ck the.  ** jour
1e170 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  nal into the ori
1e180 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
1e190 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72  ile.  Once we tr
1e1a0 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a  ansition to.  **
1e1b0 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d   EXCLUSIVE, it m
1e1c0 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
1e1d0 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  e file has been 
1e1e0 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20  changed and any 
1e1f0 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69  rollback.  ** wi
1e200 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75  ll require a jou
1e210 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20  rnal playback.. 
1e220 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
1e230 61 67 65 72 55 73 65 4c 6f 67 28 70 4c 69 73 74  agerUseLog(pList
1e240 2d 3e 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  ->pPager) );.  a
1e250 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1e260 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
1e270 52 56 45 44 20 29 3b 0a 20 20 72 63 20 3d 20 70  RVED );.  rc = p
1e280 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
1e290 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
1e2a0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 0a 20 20 2f 2a  IVE_LOCK);..  /*
1e2b0 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
1e2c0 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20  a temp-file has 
1e2d0 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
1e2e0 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77  ned, open it now
1e2f0 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  . It.  ** is not
1e300 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63   possible for rc
1e310 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61   to be other tha
1e320 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  n SQLITE_OK if t
1e330 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20  his branch.  ** 
1e340 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67  is taken, as pag
1e350 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
1e360 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  ) is a no-op for
1e370 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a   temp-files..  *
1e380 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  /.  if( !isOpen(
1e390 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
1e3a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1e3b0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72  r->tempFile && r
1e3c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
1e3d0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
1e3e0 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
1e3f0 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
1e400 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20  r->vfsFlags);.  
1e410 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  }..  while( rc==
1e420 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69  SQLITE_OK && pLi
1e430 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  st ){.    Pgno p
1e440 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e  gno = pList->pgn
1e450 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  o;..    /* If th
1e460 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61  ere are dirty pa
1e470 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
1e480 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20  cache with page 
1e490 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a  numbers greater.
1e4a0 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
1e4b0 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d  r.dbSize, this m
1e4c0 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65  eans sqlite3Page
1e4d0 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29  rTruncateImage()
1e4e0 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20   was called to. 
1e4f0 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66     ** make the f
1e500 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65  ile smaller (pre
1e510 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d  sumably by auto-
1e520 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f  vacuum code). Do
1e530 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a   not write.    *
1e540 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73  * any such pages
1e550 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   to the file..  
1e560 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f    **.    ** Also
1e570 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f  , do not write o
1e580 75 74 20 61 6e 79 20 70 61 67 65 20 74 68 61 74  ut any page that
1e590 20 68 61 73 20 74 68 65 20 50 47 48 44 52 5f 44   has the PGHDR_D
1e5a0 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20  ONT_WRITE flag. 
1e5b0 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62     ** set (set b
1e5c0 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  y sqlite3PagerDo
1e5d0 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20  ntWrite())..    
1e5e0 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  */.    if( pgno<
1e5f0 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  =pPager->dbSize 
1e600 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c  && 0==(pList->fl
1e610 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57  ags&PGHDR_DONT_W
1e620 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69  RITE) ){.      i
1e630 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e  64 offset = (pgn
1e640 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
1e650 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a  ->pageSize;   /*
1e660 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65   Offset to write
1e670 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a   */.      char *
1e680 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  pData;          
1e690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6a0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1e6b0 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20   to write */    
1e6c0 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64  ..      /* Encod
1e6d0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  e the database *
1e6e0 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70  /.      CODEC2(p
1e6f0 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44  Pager, pList->pD
1e700 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65  ata, pgno, 6, re
1e710 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1e720 4d 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  M, pData);..    
1e730 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74    /* Write out t
1e740 68 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f  he page data. */
1e750 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1e760 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
1e770 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50  r->fd, pData, pP
1e780 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
1e790 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20  offset);..      
1e7a0 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73  /* If page 1 was
1e7b0 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75   just written, u
1e7c0 70 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69  pdate Pager.dbFi
1e7d0 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a  leVers to match.
1e7e0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c        ** the val
1e7f0 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e  ue now stored in
1e800 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1e810 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74  le. If writing t
1e820 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61  his .      ** pa
1e830 67 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61  ge caused the da
1e840 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67  tabase file to g
1e850 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69  row, update dbFi
1e860 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a  leSize. .      *
1e870 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  /.      if( pgno
1e880 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  ==1 ){.        m
1e890 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
1e8a0 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74  bFileVers, &pDat
1e8b0 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50  a[24], sizeof(pP
1e8c0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1e8d0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
1e8e0 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
1e8f0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
1e900 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1e910 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67  >dbFileSize = pg
1e920 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  no;.      }..   
1e930 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79     /* Update any
1e940 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20   backup objects 
1e950 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  copying the cont
1e960 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67  ents of this pag
1e970 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  er. */.      sql
1e980 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
1e990 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
1e9a0 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69  , pgno, (u8*)pLi
1e9b0 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20  st->pData);..   
1e9c0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
1e9d0 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
1e9e0 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
1e9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea00 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1ea10 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
1ea20 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29  pagehash(pList))
1ea30 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
1ea40 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e  (("PGOUT %p %d\n
1ea50 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
1ea60 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
1ea70 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
1ea80 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29  r_writedb_count)
1ea90 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
1eaa0 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74  CR(pPager->nWrit
1eab0 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
1eac0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
1ead0 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67  ("NOSTORE %d pag
1eae0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
1eaf0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29  (pPager), pgno))
1eb00 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
1eb10 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
1eb20 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67  S.    pList->pag
1eb30 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
1eb40 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23  gehash(pList);.#
1eb50 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20  endif.    pList 
1eb60 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
1eb70 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1eb80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  c;.}../*.** Appe
1eb90 6e 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74  nd a record of t
1eba0 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
1ebb0 20 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f 20   of page pPg to 
1ebc0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
1ebd0 20 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 63   .** It is the c
1ebe0 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62  allers responsib
1ebf0 69 6c 69 74 79 20 74 6f 20 75 73 65 20 73 75 62  ility to use sub
1ec00 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29 20  jRequiresPage() 
1ec10 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61  to check .** tha
1ec20 74 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72  t it is really r
1ec30 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 63  equired before c
1ec40 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
1ec50 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  tion..**.** If s
1ec60 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74  uccessful, set t
1ec70 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  he bit correspon
1ec80 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e  ding to pPg->pgn
1ec90 6f 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 73  o in the bitvecs
1eca0 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e  .** for all open
1ecb0 20 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f   savepoints befo
1ecc0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
1ecd0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1ece0 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
1ecf0 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
1ed00 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
1ed10 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20   an IO.** error 
1ed20 63 6f 64 65 20 69 66 20 74 68 65 20 61 74 74 65  code if the atte
1ed30 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  mpt to write to 
1ed40 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
1ed50 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51  fails, or .** SQ
1ed60 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
1ed70 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69  malloc fails whi
1ed80 6c 65 20 73 65 74 74 69 6e 67 20 61 20 62 69 74  le setting a bit
1ed90 20 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a   in a savepoint.
1eda0 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74  ** bitvec..*/.st
1edb0 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72  atic int subjour
1edc0 6e 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70  nalPage(PgHdr *p
1edd0 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Pg){.  int rc = 
1ede0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
1edf0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1ee00 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
1ee10 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
1ee20 6a 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64  jfd) ){.    void
1ee30 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70   *pData = pPg->p
1ee40 44 61 74 61 3b 0a 20 20 20 20 69 36 34 20 6f 66  Data;.    i64 of
1ee50 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e  fset = pPager->n
1ee60 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72  SubRec*(4+pPager
1ee70 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1ee80 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a   char *pData2;..
1ee90 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
1eea0 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
1eeb0 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53  gno, 7, return S
1eec0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61  QLITE_NOMEM, pDa
1eed0 74 61 32 29 3b 0a 20 20 20 20 50 41 47 45 52 54  ta2);.    PAGERT
1eee0 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE(("STMT-JOUR
1eef0 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
1ef00 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1ef10 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b  r), pPg->pgno));
1ef20 0a 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20  .  .    assert( 
1ef30 70 61 67 65 72 55 73 65 4c 6f 67 28 70 50 61 67  pagerUseLog(pPag
1ef40 65 72 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  er) .         ||
1ef50 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70   pageInJournal(p
1ef60 50 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  Pg) .         ||
1ef70 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
1ef80 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20  r->dbOrigSize . 
1ef90 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77     );.    rc = w
1efa0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
1efb0 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c  r->sjfd, offset,
1efc0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1efd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1efe0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
1eff0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
1f000 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44  pPager->sjfd, pD
1f010 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61  ata2, pPager->pa
1f020 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34  geSize, offset+4
1f030 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
1f040 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f050 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
1f060 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61  nSubRec++;.    a
1f070 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
1f080 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20  Savepoint>0 );. 
1f090 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76     rc = addToSav
1f0a0 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
1f0b0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
1f0c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1f0d0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
1f0e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1f0f0 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63  lled by the pcac
1f100 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74  he layer when it
1f110 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d   has reached som
1f120 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79  e.** soft memory
1f130 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73   limit. The firs
1f140 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
1f150 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67  pointer to a Pag
1f160 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61  er object.** (ca
1f170 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20  st as a void*). 
1f180 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77  The pager is alw
1f190 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20  ays 'purgeable' 
1f1a0 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  (not an in-memor
1f1b0 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20  y.** database). 
1f1c0 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
1f1d0 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e  ent is a referen
1f1e0 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61  ce to a page tha
1f1f0 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74  t is .** current
1f200 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73  ly dirty but has
1f210 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
1f220 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20  references. The 
1f230 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79  page.** is alway
1f240 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1f250 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  h the Pager obje
1f260 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
1f270 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d   first .** argum
1f280 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ent..**.** The j
1f290 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ob of this funct
1f2a0 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70  ion is to make p
1f2b0 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74  Pg clean by writ
1f2c0 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  ing its contents
1f2d0 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64  .** out to the d
1f2e0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66  atabase file, if
1f2f0 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20   possible. This 
1f300 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63  may involve sync
1f310 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ing the.** journ
1f320 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  al file. .**.** 
1f330 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
1f340 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
1f350 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65  Clean() is calle
1f360 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e  d on the page an
1f370 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72  d.** SQLITE_OK r
1f380 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
1f390 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
1f3a0 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d  hile trying to m
1f3b0 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ake the.** page 
1f3c0 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72  clean, the IO er
1f3d0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1f3e0 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  rned. If the pag
1f3f0 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d  e cannot be.** m
1f400 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f  ade clean for so
1f410 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c  me other reason,
1f420 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
1f430 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54  curs, then SQLIT
1f440 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
1f450 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63  ned by sqlite3Pc
1f460 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
1f470 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a  is not called..*
1f480 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1f490 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70  erStress(void *p
1f4a0 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
1f4b0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1f4c0 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69   (Pager *)p;.  i
1f4d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1f4e0 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  K;..  assert( pP
1f4f0 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
1f500 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
1f510 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
1f520 44 49 52 54 59 20 29 3b 0a 0a 20 20 70 50 67 2d  DIRTY );..  pPg-
1f530 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 69  >pDirty = 0;.  i
1f540 66 28 20 70 61 67 65 72 55 73 65 4c 6f 67 28 70  f( pagerUseLog(p
1f550 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a  Pager) ){.    /*
1f560 20 57 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20   Write a single 
1f570 66 72 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70  frame for this p
1f580 61 67 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20  age to the log. 
1f590 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
1f5a0 74 65 33 4c 6f 67 46 72 61 6d 65 73 28 70 50 61  te3LogFrames(pPa
1f5b0 67 65 72 2d 3e 70 4c 6f 67 2c 20 70 50 61 67 65  ger->pLog, pPage
1f5c0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 67  r->pageSize, pPg
1f5d0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65  , 0, 0, 0);.  }e
1f5e0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
1f5f0 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 69  doNotSync flag i
1f600 73 20 73 65 74 20 62 79 20 74 68 65 20 73 71 6c  s set by the sql
1f610 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
1f620 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20   function while 
1f630 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6a 6f 75  it.    ** is jou
1f640 72 6e 61 6c 6c 69 6e 67 20 61 20 73 65 74 20 6f  rnalling a set o
1f650 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 64 61  f two or more da
1f660 74 61 62 61 73 65 20 70 61 67 65 73 20 74 68 61  tabase pages tha
1f670 74 20 61 72 65 20 73 74 6f 72 65 64 0a 20 20 20  t are stored.   
1f680 20 2a 2a 20 6f 6e 20 74 68 65 20 73 61 6d 65 20   ** on the same 
1f690 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 79 6e  disk sector. Syn
1f6a0 63 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cing the journal
1f6b0 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20   is not allowed 
1f6c0 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69  while.    ** thi
1f6d0 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61  s is happening a
1f6e0 73 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  s it is importan
1f6f0 74 20 74 68 61 74 20 61 6c 6c 20 6d 65 6d 62 65  t that all membe
1f700 72 73 20 6f 66 20 73 75 63 68 20 61 0a 20 20 20  rs of such a.   
1f710 20 2a 2a 20 73 65 74 20 6f 66 20 70 61 67 65 73   ** set of pages
1f720 20 61 72 65 20 73 79 6e 63 65 64 20 74 6f 20 64   are synced to d
1f730 69 73 6b 20 74 6f 67 65 74 68 65 72 2e 20 53 6f  isk together. So
1f740 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 74 68  , if the page th
1f750 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  is function.    
1f760 2a 2a 20 69 73 20 74 72 79 69 6e 67 20 74 6f 20  ** is trying to 
1f770 6d 61 6b 65 20 63 6c 65 61 6e 20 77 69 6c 6c 20  make clean will 
1f780 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61  require a journa
1f790 6c 20 73 79 6e 63 20 61 6e 64 20 74 68 65 20 64  l sync and the d
1f7a0 6f 4e 6f 74 53 79 6e 63 0a 20 20 20 20 2a 2a 20  oNotSync.    ** 
1f7b0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 72 65 74  flag is set, ret
1f7c0 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
1f7d0 67 20 61 6e 79 74 68 69 6e 67 2e 20 54 68 65 20  g anything. The 
1f7e0 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 69 6c  pcache layer wil
1f7f0 6c 0a 20 20 20 20 2a 2a 20 6a 75 73 74 20 68 61  l.    ** just ha
1f800 76 65 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61  ve to go ahead a
1f810 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  nd allocate a ne
1f820 77 20 70 61 67 65 20 62 75 66 66 65 72 20 69 6e  w page buffer in
1f830 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20  stead of.    ** 
1f840 72 65 75 73 69 6e 67 20 70 50 67 2e 0a 20 20 20  reusing pPg..   
1f850 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 69 6d 69 6c   **.    ** Simil
1f860 61 72 6c 79 2c 20 69 66 20 74 68 65 20 70 61 67  arly, if the pag
1f870 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65  er has already e
1f880 6e 74 65 72 65 64 20 74 68 65 20 65 72 72 6f 72  ntered the error
1f890 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 0a 20   state, do not. 
1f8a0 20 20 20 2a 2a 20 74 72 79 20 74 6f 20 77 72 69     ** try to wri
1f8b0 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
1f8c0 6f 66 20 70 50 67 20 74 6f 20 64 69 73 6b 2e 0a  of pPg to disk..
1f8d0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e      */.    if( N
1f8e0 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
1f8f0 43 6f 64 65 29 0a 20 20 20 20 20 7c 7c 20 28 70  Code).     || (p
1f900 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
1f910 20 26 26 20 70 50 67 2d 3e 66 6c 61 67 73 26 50   && pPg->flags&P
1f920 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 0a  GHDR_NEED_SYNC).
1f930 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1f940 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1f950 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 53     }.  .    /* S
1f960 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
1f970 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65 64  file if required
1f980 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67  . */.    if( pPg
1f990 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
1f9a0 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20  ED_SYNC ){.     
1f9b0 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
1f9c0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
1f9d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1f9e0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66 75  OK && pPager->fu
1f9f0 6c 6c 53 79 6e 63 20 26 26 20 0a 20 20 20 20 20  llSync && .     
1fa00 20 20 20 21 28 70 50 61 67 65 72 2d 3e 6a 6f 75     !(pPager->jou
1fa10 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
1fa20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
1fa30 52 59 29 20 26 26 0a 20 20 20 20 20 20 20 20 21  RY) &&.        !
1fa40 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
1fa50 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1fa60 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49  pPager->fd)&SQLI
1fa70 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
1fa80 50 45 4e 44 29 0a 20 20 20 20 20 20 29 7b 0a 20  PEND).      ){. 
1fa90 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
1faa0 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Rec = 0;.       
1fab0 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
1fac0 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
1fad0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
1fae0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
1faf0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 69  ge number of thi
1fb00 73 20 70 61 67 65 20 69 73 20 6c 61 72 67 65 72  s page is larger
1fb10 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
1fb20 74 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a  t size of.    **
1fb30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
1fb40 61 67 65 2c 20 69 74 20 6d 61 79 20 6e 65 65 64  age, it may need
1fb50 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 74   to be written t
1fb60 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
1fb70 6c 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  l..    ** This i
1fb80 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61  s because the ca
1fb90 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77 72 69 74  ll to pager_writ
1fba0 65 5f 70 61 67 65 6c 69 73 74 28 29 20 62 65 6c  e_pagelist() bel
1fbb0 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20  ow will not.    
1fbc0 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74  ** actually writ
1fbd0 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69  e data to the fi
1fbe0 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  le in this case.
1fbf0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
1fc00 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
1fc10 6f 77 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f  owing sequence o
1fc20 66 20 65 76 65 6e 74 73 3a 0a 20 20 20 20 2a 2a  f events:.    **
1fc30 0a 20 20 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b  .    **   BEGIN;
1fc40 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75  .    **     <jou
1fc50 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20 20 20  rnal page X>.   
1fc60 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79 20   **     <modify 
1fc70 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20  page X>.    **  
1fc80 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70 3b     SAVEPOINT sp;
1fc90 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 3c 73  .    **       <s
1fca0 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66  hrink database f
1fcb0 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a  ile to Y pages>.
1fcc0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67      **       pag
1fcd0 65 72 53 74 72 65 73 73 28 70 61 67 65 20 58 29  erStress(page X)
1fce0 0a 20 20 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c  .    **     ROLL
1fcf0 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20 20  BACK TO sp;.    
1fd00 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 28 58 3e  **.    ** If (X>
1fd10 59 29 2c 20 74 68 65 6e 20 77 68 65 6e 20 70 61  Y), then when pa
1fd20 67 65 72 53 74 72 65 73 73 20 69 73 20 63 61 6c  gerStress is cal
1fd30 6c 65 64 20 70 61 67 65 20 58 20 77 69 6c 6c 20  led page X will 
1fd40 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 0a 20  not be written. 
1fd50 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65     ** out to the
1fd60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
1fd70 62 75 74 20 77 69 6c 6c 20 62 65 20 64 72 6f 70  but will be drop
1fd80 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63  ped from the cac
1fd90 68 65 2e 20 54 68 65 6e 2c 0a 20 20 20 20 2a 2a  he. Then,.    **
1fda0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22   following the "
1fdb0 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20  ROLLBACK TO sp" 
1fdc0 73 74 61 74 65 6d 65 6e 74 2c 20 72 65 61 64 69  statement, readi
1fdd0 6e 67 20 70 61 67 65 20 58 20 77 69 6c 6c 20 72  ng page X will r
1fde0 65 61 64 0a 20 20 20 20 2a 2a 20 64 61 74 61 20  ead.    ** data 
1fdf0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1fe00 65 20 66 69 6c 65 2e 20 54 68 69 73 20 77 69 6c  e file. This wil
1fe10 6c 20 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66  l be the copy of
1fe20 20 70 61 67 65 20 58 20 61 73 20 69 74 0a 20 20   page X as it.  
1fe30 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68    ** was when th
1fe40 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  e transaction st
1fe50 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74  arted, not as it
1fe60 20 77 61 73 20 77 68 65 6e 20 22 53 41 56 45 50   was when "SAVEP
1fe70 4f 49 4e 54 20 73 70 22 0a 20 20 20 20 2a 2a 20  OINT sp".    ** 
1fe80 77 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20  was executed..  
1fe90 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1fea0 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 77  solution is to w
1feb0 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
1fec0 20 64 61 74 61 20 66 6f 72 20 70 61 67 65 20 58   data for page X
1fed0 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a   into the .    *
1fee0 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  * sub-journal fi
1fef0 6c 65 20 6e 6f 77 20 28 69 66 20 69 74 20 69 73  le now (if it is
1ff00 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 74 68 65   not already the
1ff10 72 65 29 2c 20 73 6f 20 74 68 61 74 20 69 74 20  re), so that it 
1ff20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72  will.    ** be r
1ff30 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 63  estored to its c
1ff40 75 72 72 65 6e 74 20 76 61 6c 75 65 20 77 68 65  urrent value whe
1ff50 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20  n the "ROLLBACK 
1ff60 54 4f 20 73 70 22 20 69 73 20 0a 20 20 20 20 2a  TO sp" is .    *
1ff70 2a 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20  * executed..    
1ff80 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  */.    if( NEVER
1ff90 28 0a 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51  (.        rc==SQ
1ffa0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e  LITE_OK && pPg->
1ffb0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53  pgno>pPager->dbS
1ffc0 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75 69  ize && subjRequi
1ffd0 72 65 73 50 61 67 65 28 70 50 67 29 0a 20 20 20  resPage(pPg).   
1ffe0 20 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d   ) ){.      rc =
1fff0 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
20000 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  pPg);.    }.  . 
20010 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
20020 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
20030 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20  page out to the 
20040 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
20050 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
20060 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20070 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
20080 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b  e_pagelist(pPg);
20090 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
200a0 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
200b0 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66  s clean. */.  if
200c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
200d0 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  ){.    PAGERTRAC
200e0 45 28 28 22 53 54 52 45 53 53 20 25 64 20 70 61  E(("STRESS %d pa
200f0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
20100 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
20110 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69  pgno));.    sqli
20120 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
20130 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20  an(pPg);.  }..  
20140 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
20150 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
20160 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  }.../*.** Alloca
20170 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
20180 65 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62  e a new Pager ob
20190 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61 20 70  ject and put a p
201a0 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20  ointer to it.** 
201b0 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65  in *ppPager. The
201c0 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76   pager should ev
201d0 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65  entually be free
201e0 64 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a  d by passing it.
201f0 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ** to sqlite3Pag
20200 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a  erClose()..**.**
20210 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61   The zFilename a
20220 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70  rgument is the p
20230 61 74 68 20 74 6f 20 74 68 65 20 64 61 74 61 62  ath to the datab
20240 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
20250 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  ..** If zFilenam
20260 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61  e is NULL then a
20270 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20   randomly-named 
20280 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
20290 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
202a0 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c   used as the fil
202b0 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20  e to be cached. 
202c0 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  Temporary files 
202d0 61 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a  are be deleted.*
202e0 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
202f0 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c  when they are cl
20300 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61  osed. If zFilena
20310 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
20320 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e   then .** all in
20330 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c  formation is hel
20340 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69  d in cache. It i
20350 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
20360 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69  to disk. .** Thi
20370 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
20380 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e   implement an in
20390 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
203a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74  ..**.** The nExt
203b0 72 61 20 70 61 72 61 6d 65 74 65 72 20 73 70 65  ra parameter spe
203c0 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65  cifies the numbe
203d0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
203e0 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  ace allocated.**
203f0 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68   along with each
20400 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
20410 20 54 68 69 73 20 73 70 61 63 65 20 69 73 20 61   This space is a
20420 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20  vailable to the 
20430 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20  user.** via the 
20440 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
20450 78 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a  xtra() API..**.*
20460 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72 67 75  * The flags argu
20470 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20  ment is used to 
20480 73 70 65 63 69 66 79 20 70 72 6f 70 65 72 74 69  specify properti
20490 65 73 20 74 68 61 74 20 61 66 66 65 63 74 20 74  es that affect t
204a0 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  he.** operation 
204b0 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20 49 74  of the pager. It
204c0 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65   should be passe
204d0 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63  d some bitwise c
204e0 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66  ombination.** of
204f0 20 74 68 65 20 50 41 47 45 52 5f 4f 4d 49 54 5f   the PAGER_OMIT_
20500 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41 47 45  JOURNAL and PAGE
20510 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66 6c  R_NO_READLOCK fl
20520 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ags..**.** The v
20530 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65  fsFlags paramete
20540 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74  r is a bitmask t
20550 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c  o pass to the fl
20560 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a  ags parameter.**
20570 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20   of the xOpen() 
20580 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75  method of the su
20590 70 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20  pplied VFS when 
205a0 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a  opening files. .
205b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
205c0 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c  er object is all
205d0 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 73  ocated and the s
205e0 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70  pecified file op
205f0 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73  ened .** success
20600 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b  fully, SQLITE_OK
20610 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
20620 20 2a 70 70 50 61 67 65 72 20 73 65 74 20 74 6f   *ppPager set to
20630 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65   point to.** the
20640 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63   new pager objec
20650 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  t. If an error o
20660 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20  ccurs, *ppPager 
20670 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a  is set to NULL.*
20680 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65  * and error code
20690 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20   returned. This 
206a0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74  function may ret
206b0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
206c0 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c  .** (sqlite3Mall
206d0 6f 63 28 29 20 69 73 20 75 73 65 64 20 74 6f 20  oc() is used to 
206e0 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29  allocate memory)
206f0 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  , SQLITE_CANTOPE
20700 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73  N or .** various
20710 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65   SQLITE_IO_XXX e
20720 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrors..*/.int sq
20730 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a  lite3PagerOpen(.
20740 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
20750 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  Vfs,       /* Th
20760 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73  e virtual file s
20770 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a  ystem to use */.
20780 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65    Pager **ppPage
20790 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  r,         /* OU
207a0 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61  T: Return the Pa
207b0 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65  ger structure he
207c0 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  re */.  const ch
207d0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
207e0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
207f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
20800 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e   open */.  int n
20810 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20  Extra,          
20820 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74      /* Extra byt
20830 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63  es append to eac
20840 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
20850 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
20860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20870 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c  * flags controll
20880 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f  ing this file */
20890 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c  .  int vfsFlags,
208a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
208b0 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
208c0 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  ugh to sqlite3_v
208d0 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  fs.xOpen() */.  
208e0 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28  void (*xReinit)(
208f0 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63  DbPage*) /* Func
20900 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69 61  tion to reinitia
20910 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b  lize pages */.){
20920 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50  .  u8 *pPtr;.  P
20930 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30  ager *pPager = 0
20940 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72  ;       /* Pager
20950 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63   object to alloc
20960 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a  ate and return *
20970 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
20980 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
20990 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
209a0 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20   int tempFile = 
209b0 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  0;        /* Tru
209c0 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73  e for temp files
209d0 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72   (incl. in-memor
209e0 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e  y files) */.  in
209f0 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20  t memDb = 0;    
20a00 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
20a10 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d  f this is an in-
20a20 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20  memory file */. 
20a30 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20   int readOnly = 
20a40 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  0;        /* Tru
20a50 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72  e if this is a r
20a60 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f  ead-only file */
20a70 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69  .  int journalFi
20a80 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42  leSize;     /* B
20a90 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ytes to allocate
20aa0 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61   for each journa
20ab0 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  l fd */.  char *
20ac0 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20  zPathname = 0;  
20ad0 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20     /* Full path 
20ae0 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  to database file
20af0 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e   */.  int nPathn
20b00 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ame = 0;       /
20b10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
20b20 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a  s in zPathname *
20b30 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e  /.  int useJourn
20b40 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  al = (flags & PA
20b50 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  GER_OMIT_JOURNAL
20b60 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74  )==0; /* False t
20b70 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a  o omit journal *
20b80 2f 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f  /.  int noReadlo
20b90 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  ck = (flags & PA
20ba0 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29  GER_NO_READLOCK)
20bb0 21 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f  !=0;  /* True to
20bc0 20 6f 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b 20   omit read-lock 
20bd0 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53  */.  int pcacheS
20be0 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ize = sqlite3Pca
20bf0 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20  cheSize();      
20c00 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c   /* Bytes to all
20c10 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63 68 65  ocate for PCache
20c20 20 2a 2f 0a 20 20 75 31 36 20 73 7a 50 61 67 65   */.  u16 szPage
20c30 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45  Dflt = SQLITE_DE
20c40 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
20c50 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67    /* Default pag
20c60 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a 20  e size */..  /* 
20c70 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
20c80 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71  uch space is req
20c90 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a  uired for each j
20ca0 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64  ournal file-hand
20cb0 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61  le.  ** (there a
20cc0 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20  re two of them, 
20cd0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
20ce0 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75   and the sub-jou
20cf0 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a  rnal). This.  **
20d00 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
20d10 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66  space required f
20d20 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
20d30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
20d40 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20  dle .  ** and a 
20d50 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20  regular journal 
20d60 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74  file-handle. Not
20d70 65 20 74 68 61 74 20 61 20 22 72 65 67 75 6c 61  e that a "regula
20d80 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65  r journal-handle
20d90 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20  ".  ** may be a 
20da0 77 72 61 70 70 65 72 20 63 61 70 61 62 6c 65 20  wrapper capable 
20db0 6f 66 20 63 61 63 68 69 6e 67 20 74 68 65 20 66  of caching the f
20dc0 69 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20  irst portion of 
20dd0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  the journal.  **
20de0 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20   file in memory 
20df0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
20e00 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
20e10 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20  timization (see 
20e20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c  .  ** source fil
20e30 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20  e journal.c)..  
20e40 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
20e50 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
20e60 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72  )>sqlite3MemJour
20e70 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20  nalSize() ){.   
20e80 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
20e90 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65   = ROUND8(sqlite
20ea0 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
20eb0 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  s));.  }else{.  
20ec0 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
20ed0 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74  e = ROUND8(sqlit
20ee0 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65  e3MemJournalSize
20ef0 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ());.  }..  /* S
20f00 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  et the output va
20f10 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69  riable to NULL i
20f20 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20  n case an error 
20f30 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70  occurs. */.  *pp
20f40 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a  Pager = 0;..  /*
20f50 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f   Compute and sto
20f60 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  re the full path
20f70 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63  name in an alloc
20f80 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e  ated buffer poin
20f90 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a  ted.  ** to by z
20fa0 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68  Pathname, length
20fb0 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20   nPathname. Or, 
20fc0 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  if this is a tem
20fd0 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a  porary file,.  *
20fe0 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61  * leave both nPa
20ff0 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68  thname and zPath
21000 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20  name set to 0.. 
21010 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
21020 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
21030 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74 68  [0] ){.    nPath
21040 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
21050 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a  athname+1;.    z
21060 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
21070 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61  e3Malloc(nPathna
21080 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a  me*2);.    if( z
21090 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Pathname==0 ){. 
210a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
210b0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
210c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
210d0 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20  MIT_MEMORYDB.   
210e0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
210f0 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22  ename,":memory:"
21100 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  )==0 ){.      me
21110 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a  mDb = 1;.      z
21120 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b  Pathname[0] = 0;
21130 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
21140 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 50  f.    {.      zP
21150 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20  athname[0] = 0; 
21160 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69  /* Make sure ini
21170 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66  tialized even if
21180 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20   FullPathname() 
21190 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20 72  fails */.      r
211a0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c  c = sqlite3OsFul
211b0 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
211c0 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68  zFilename, nPath
211d0 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29  name, zPathname)
211e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 50 61  ;.    }..    nPa
211f0 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
21200 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61  Strlen30(zPathna
21210 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  me);.    if( rc=
21220 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50  =SQLITE_OK && nP
21230 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e  athname+8>pVfs->
21240 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  mxPathname ){.  
21250 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
21260 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e  ch is taken when
21270 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74   the journal pat
21280 68 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20  h required by.  
21290 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
212a0 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ase being opened
212b0 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68   will be more th
212c0 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  an pVfs->mxPathn
212d0 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  ame.      ** byt
212e0 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68  es in length. Th
212f0 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74  is means the dat
21300 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20  abase cannot be 
21310 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a  opened,.      **
21320 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20   as it will not 
21330 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f  be possible to o
21340 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
21350 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20  file or even.   
21360 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20     ** check for 
21370 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65  a hot-journal be
21380 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20  fore reading..  
21390 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
213a0 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
213b0 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  N_BKPT;.    }.  
213c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
213d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
213e0 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
213f0 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
21400 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
21410 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
21420 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50  memory for the P
21430 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20  ager structure, 
21440 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74  PCache object, t
21450 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69  he.  ** three fi
21460 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20  le descriptors, 
21470 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21480 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a  e name and the j
21490 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c  ournal .  ** fil
214a0 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f  e name. The layo
214b0 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20  ut in memory is 
214c0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a  as follows:.  **
214d0 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20  .  **     Pager 
214e0 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20  object          
214f0 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f            (sizeo
21500 66 28 50 61 67 65 72 29 20 62 79 74 65 73 29 0a  f(Pager) bytes).
21510 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20    **     PCache 
21520 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20  object          
21530 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
21540 33 50 63 61 63 68 65 53 69 7a 65 28 29 20 62 79  3PcacheSize() by
21550 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61  tes).  **     Da
21560 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64  tabase file hand
21570 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 28 70  le            (p
21580 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79  Vfs->szOsFile by
21590 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75  tes).  **     Su
215a0 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  b-journal file h
215b0 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a  andle         (j
215c0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62  ournalFileSize b
215d0 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d  ytes).  **     M
215e0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
215f0 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28   handle        (
21600 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
21610 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
21620 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  Database file na
21630 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
21640 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74  (nPathname+1 byt
21650 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75  es).  **     Jou
21660 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20  rnal file name  
21670 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50               (nP
21680 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65  athname+8+1 byte
21690 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d  s).  */.  pPtr =
216a0 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61   (u8 *)sqlite3Ma
216b0 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f  llocZero(.    RO
216c0 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61  UND8(sizeof(*pPa
216d0 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20  ger)) +      /* 
216e0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
216f0 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63  */.    ROUND8(pc
21700 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20  acheSize) +     
21710 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20        /* PCache 
21720 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f  object */.    RO
21730 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46  UND8(pVfs->szOsF
21740 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20  ile) +       /* 
21750 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65  The main db file
21760 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46   */.    journalF
21770 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20  ileSize * 2 +   
21780 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77         /* The tw
21790 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  o journal files 
217a0 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d  */ .    nPathnam
217b0 65 20 2b 20 31 20 2b 20 20 20 20 20 20 20 20 20  e + 1 +         
217c0 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
217d0 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68  ame */.    nPath
217e0 6e 61 6d 65 20 2b 20 38 20 2b 20 31 20 20 20 20  name + 8 + 1    
217f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f            /* zJo
21800 75 72 6e 61 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20  urnal */.  );.  
21810 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
21820 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c  TE_ALIGNMENT(SQL
21830 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a  ITE_INT_TO_PTR(j
21840 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29  ournalFileSize))
21850 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72 20   );.  if( !pPtr 
21860 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
21870 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
21880 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21890 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
218a0 50 61 67 65 72 20 3d 20 20 20 20 20 20 20 20 20  Pager =         
218b0 20 20 20 20 20 28 50 61 67 65 72 2a 29 28 70 50       (Pager*)(pP
218c0 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  tr);.  pPager->p
218d0 50 43 61 63 68 65 20 3d 20 20 20 20 28 50 43 61  PCache =    (PCa
218e0 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  che*)(pPtr += RO
218f0 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61  UND8(sizeof(*pPa
21900 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72  ger)));.  pPager
21910 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65  ->fd =   (sqlite
21920 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
21930 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69   ROUND8(pcacheSi
21940 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ze));.  pPager->
21950 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  sjfd = (sqlite3_
21960 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  file*)(pPtr += R
21970 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73  OUND8(pVfs->szOs
21980 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72  File));.  pPager
21990 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65  ->jfd =  (sqlite
219a0 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
219b0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
219c0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69  );.  pPager->zFi
219d0 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61  lename =    (cha
219e0 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72  r*)(pPtr += jour
219f0 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20  nalFileSize);.  
21a00 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
21a10 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61  TE_ALIGNMENT(pPa
21a20 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  ger->jfd) );..  
21a30 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50  /* Fill in the P
21a40 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61  ager.zFilename a
21a50 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61  nd Pager.zJourna
21a60 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20 72 65  l buffers, if re
21a70 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28  quired. */.  if(
21a80 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20   zPathname ){.  
21a90 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e    pPager->zJourn
21aa0 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70  al =   (char*)(p
21ab0 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65  Ptr += nPathname
21ac0 20 2b 20 31 29 3b 0a 20 20 20 20 6d 65 6d 63 70   + 1);.    memcp
21ad0 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  y(pPager->zFilen
21ae0 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  ame, zPathname, 
21af0 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
21b00 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
21b10 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61  Journal, zPathna
21b20 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
21b30 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
21b40 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
21b50 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e  thname], "-journ
21b60 61 6c 22 2c 20 38 29 3b 0a 20 20 20 20 69 66 28  al", 8);.    if(
21b70 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
21b80 6d 65 5b 30 5d 3d 3d 30 20 29 20 70 50 61 67 65  me[0]==0 ) pPage
21b90 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 30 5d 20 3d  r->zJournal[0] =
21ba0 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
21bb0 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
21bc0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70  .  }.  pPager->p
21bd0 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50  Vfs = pVfs;.  pP
21be0 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d  ager->vfsFlags =
21bf0 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a   vfsFlags;..  /*
21c00 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20   Open the pager 
21c10 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
21c20 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
21c30 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21 6d  ilename[0] && !m
21c40 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 6e 74 20  emDb ){.    int 
21c50 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20  fout = 0;       
21c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21c70 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e  VFS flags return
21c80 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f  ed by xOpen() */
21c90 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
21ca0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
21cb0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
21cc0 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73   pPager->fd, vfs
21cd0 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20  Flags, &fout);. 
21ce0 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66     readOnly = (f
21cf0 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  out&SQLITE_OPEN_
21d00 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20  READONLY);..    
21d10 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77  /* If the file w
21d20 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
21d30 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f  opened for read/
21d40 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20  write access,.  
21d50 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65    ** choose a de
21d60 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
21d70 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20  in case we have 
21d80 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20  to create the.  
21d90 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
21da0 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  le. The default 
21db0 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65  page size is the
21dc0 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20   maximum of:.   
21dd0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20   **.    **    + 
21de0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
21df0 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a  AGE_SIZE,.    **
21e00 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20      + The value 
21e10 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
21e20 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
21e30 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  ).    **    + Th
21e40 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73  e largest page s
21e50 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ize that can be 
21e60 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c  written atomical
21e70 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ly..    */.    i
21e80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21e90 20 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b   && !readOnly ){
21ea0 0a 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72  .      setSector
21eb0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
21ec0 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
21ed0 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
21ee0 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  IZE<=SQLITE_MAX_
21ef0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
21f00 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  E);.      if( sz
21f10 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72 2d  PageDflt<pPager-
21f20 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20  >sectorSize ){. 
21f30 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
21f40 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51  r->sectorSize>SQ
21f50 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
21f60 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20  _PAGE_SIZE ){.  
21f70 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
21f80 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  lt = SQLITE_MAX_
21f90 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
21fa0 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  E;.        }else
21fb0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61  {.          szPa
21fc0 67 65 44 66 6c 74 20 3d 20 28 75 31 36 29 70 50  geDflt = (u16)pP
21fd0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
21fe0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21ff0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
22000 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
22010 57 52 49 54 45 0a 20 20 20 20 20 20 7b 0a 20 20  WRITE.      {.  
22020 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20        int iDc = 
22030 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
22040 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
22050 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
22060 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
22070 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
22080 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
22090 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20  2==(512>>8));.  
220a0 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
220b0 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
220c0 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29  64K==(65536>>8))
220d0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
220e0 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  (SQLITE_MAX_DEFA
220f0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36  ULT_PAGE_SIZE<=6
22100 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 66  5536);.        f
22110 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74  or(ii=szPageDflt
22120 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  ; ii<=SQLITE_MAX
22130 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
22140 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20  ZE; ii=ii*2){.  
22150 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26          if( iDc&
22160 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
22170 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b  OMIC|(ii>>8)) ){
22180 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50  .            szP
22190 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20  ageDflt = ii;.  
221a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
221b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
221c0 69 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  if.    }.  }else
221d0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65  {.    /* If a te
221e0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
221f0 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73  requested, it is
22200 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65   not opened imme
22210 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20  diately..    ** 
22220 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20  In this case we 
22230 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61 75  accept the defau
22240 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64  lt page size and
22250 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a   delay actually.
22260 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74      ** opening t
22270 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68  he file until th
22280 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
22290 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a  OsWrite()..    *
222a0 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72  *.    ** This br
222b0 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75 6e  anch is also run
222c0 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
222d0 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20 69  y database. An i
222e0 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20  n-memory.    ** 
222f0 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65 20  database is the 
22300 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d 66  same as a temp-f
22310 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76 65  ile that is neve
22320 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  r written out to
22330 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64  .    ** disk and
22340 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f   uses an in-memo
22350 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ry rollback jour
22360 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20  nal..    */ .   
22370 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20   tempFile = 1;. 
22380 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
22390 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
223a0 56 45 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79  VE;.    readOnly
223b0 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c   = (vfsFlags&SQL
223c0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
223d0 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  Y);.  }..  /* Th
223e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c  e following call
223f0 20 74 6f 20 50 61 67 65 72 53 65 74 50 61 67 65   to PagerSetPage
22400 73 69 7a 65 28 29 20 73 65 72 76 65 73 20 74 6f  size() serves to
22410 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   set the value o
22420 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70 61  f .  ** Pager.pa
22430 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c  geSize and to al
22440 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65 72  locate the Pager
22450 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65  .pTmpSpace buffe
22460 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  r..  */.  if( rc
22470 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22480 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
22490 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20  r->memDb==0 );. 
224a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
224b0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
224c0 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65 44  pPager, &szPageD
224d0 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65  flt, -1);.    te
224e0 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
224f0 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20  TE_OK );.  }..  
22500 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
22510 63 63 75 72 72 65 64 20 69 6e 20 65 69 74 68 65  ccurred in eithe
22520 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20  r of the blocks 
22530 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20  above, free the 
22540 0a 20 20 2a 2a 20 50 61 67 65 72 20 73 74 72 75  .  ** Pager stru
22550 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20  cture and close 
22560 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  the file..  */. 
22570 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
22580 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
22590 28 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ( !pPager->pTmpS
225a0 70 61 63 65 20 29 3b 0a 20 20 20 20 73 71 6c 69  pace );.    sqli
225b0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
225c0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69  r->fd);.    sqli
225d0 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29  te3_free(pPager)
225e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
225f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
22600 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68 65  alize the PCache
22610 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 61 73   object. */.  as
22620 73 65 72 74 28 20 6e 45 78 74 72 61 3c 31 30 30  sert( nExtra<100
22630 30 20 29 3b 0a 20 20 6e 45 78 74 72 61 20 3d 20  0 );.  nExtra = 
22640 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a  ROUND8(nExtra);.
22650 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f    sqlite3PcacheO
22660 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20  pen(szPageDflt, 
22670 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a  nExtra, !memDb,.
22680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22690 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72      !memDb?pager
226a0 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20  Stress:0, (void 
226b0 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  *)pPager, pPager
226c0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 50  ->pPCache);..  P
226d0 41 47 45 52 54 52 41 43 45 28 28 22 4f 50 45 4e  AGERTRACE(("OPEN
226e0 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48   %d %s\n", FILEH
226f0 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e  ANDLEID(pPager->
22700 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  fd), pPager->zFi
22710 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52  lename));.  IOTR
22720 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73  ACE(("OPEN %p %s
22730 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
22740 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29  ger->zFilename))
22750 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  ..  pPager->useJ
22760 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65  ournal = (u8)use
22770 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65  Journal;.  pPage
22780 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20  r->noReadlock = 
22790 28 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72  (noReadlock && r
227a0 65 61 64 4f 6e 6c 79 29 20 3f 31 3a 30 3b 0a 20  eadOnly) ?1:0;. 
227b0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
227c0 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Open = 0; */.  /
227d0 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  * pPager->stmtIn
227e0 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  Use = 0; */.  /*
227f0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20   pPager->nRef = 
22800 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
22810 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 28 75  dbSizeValid = (u
22820 38 29 6d 65 6d 44 62 3b 0a 20 20 2f 2a 20 70 50  8)memDb;.  /* pP
22830 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
22840 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
22850 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
22860 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
22870 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f  r->nPage = 0; */
22880 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  .  pPager->mxPgn
22890 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50  o = SQLITE_MAX_P
228a0 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20  AGE_COUNT;.  /* 
228b0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
228c0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f  PAGER_UNLOCK; */
228d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
228e0 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74 65 6d  r->state == (tem
228f0 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f 45 58  pFile ? PAGER_EX
22900 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45 52 5f  CLUSIVE : PAGER_
22910 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a 20  UNLOCK) );.  /* 
22920 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
22930 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
22940 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38  ->tempFile = (u8
22950 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73  )tempFile;.  ass
22960 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50  ert( tempFile==P
22970 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
22980 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20  _NORMAL .       
22990 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d     || tempFile==
229a0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
229b0 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  E_EXCLUSIVE );. 
229c0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
229d0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
229e0 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61  SIVE==1 );.  pPa
229f0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
22a00 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c  de = (u8)tempFil
22a10 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68  e; .  pPager->ch
22a20 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
22a30 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
22a40 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  ;.  pPager->memD
22a50 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20  b = (u8)memDb;. 
22a60 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
22a70 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79  y = (u8)readOnly
22a80 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  ;.  /* pPager->n
22a90 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a  eedSync = 0; */.
22aa0 20 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f 75    assert( useJou
22ab0 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e  rnal || pPager->
22ac0 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70 50  tempFile );.  pP
22ad0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70  ager->noSync = p
22ae0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
22af0 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
22b00 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f  ync = pPager->no
22b10 53 79 6e 63 20 3f 30 3a 31 3b 0a 20 20 70 50 61  Sync ?0:1;.  pPa
22b20 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20  ger->sync_flags 
22b30 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
22b40 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65  RMAL;.  /* pPage
22b50 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a  r->pFirst = 0; *
22b60 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
22b70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b  FirstSynced = 0;
22b80 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
22b90 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  >pLast = 0; */. 
22ba0 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20   pPager->nExtra 
22bb0 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a 20  = (u16)nExtra;. 
22bc0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
22bd0 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49  SizeLimit = SQLI
22be0 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e  TE_DEFAULT_JOURN
22bf0 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20  AL_SIZE_LIMIT;. 
22c00 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
22c10 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74  pPager->fd) || t
22c20 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65 74  empFile );.  set
22c30 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
22c40 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a 6f  r);.  if( !useJo
22c50 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50 61  urnal ){.    pPa
22c60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
22c70 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
22c80 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73  MODE_OFF;.  }els
22c90 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20  e if( memDb ){. 
22ca0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
22cb0 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
22cc0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
22cd0 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67  Y;.  }.  /* pPag
22ce0 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
22cf0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
22d00 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
22d10 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20  erArg = 0; */.  
22d20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
22d30 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20 2f  r = xReinit;.  /
22d40 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d  * memset(pPager-
22d50 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  >aHash, 0, sizeo
22d60 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  f(pPager->aHash)
22d70 29 3b 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65  ); */..  *ppPage
22d80 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65  r = pPager;.  re
22d90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
22da0 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }..../*.** This 
22db0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
22dc0 65 64 20 61 66 74 65 72 20 74 72 61 6e 73 69 74  ed after transit
22dd0 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45  ioning from PAGE
22de0 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50  R_UNLOCK to.** P
22df0 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74  AGER_SHARED stat
22e00 65 2e 20 49 74 20 74 65 73 74 73 20 69 66 20 74  e. It tests if t
22e10 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
22e20 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e  urnal present in
22e30 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73  .** the file-sys
22e40 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65  tem for the give
22e50 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a  n pager. A hot j
22e60 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68  ournal is one th
22e70 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  at .** needs to 
22e80 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  be played back. 
22e90 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69  According to thi
22ea0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f  s function, a ho
22eb0 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  t-journal.** fil
22ec0 65 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20  e exists if the 
22ed0 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
22ee0 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a  ia are met:.**.*
22ef0 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61  *   * The journa
22f00 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e  l file exists in
22f10 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d   the file system
22f20 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20  , and.**   * No 
22f30 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20  process holds a 
22f40 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
22f50 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
22f60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61  database file, a
22f70 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61  nd.**   * The da
22f80 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65  tabase file itse
22f90 6c 66 20 69 73 20 67 72 65 61 74 65 72 20 74 68  lf is greater th
22fa0 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73 69  an 0 bytes in si
22fb0 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  ze, and.**   * T
22fc0 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
22fd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
22fe0 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20  e exists and is 
22ff0 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20  not 0x00..**.** 
23000 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  If the current s
23010 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
23020 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75  ase file is 0 bu
23030 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  t a journal file
23040 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74  .** exists, that
23050 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20   is probably an 
23060 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74  old journal left
23070 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69   over from a pri
23080 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77  or.** database w
23090 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
230a0 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
230b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
230c0 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65   is.** just dele
230d0 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65  ted using OsDele
230e0 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20  te, *pExists is 
230f0 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
23100 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
23110 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urned..**.** Thi
23120 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  s routine does n
23130 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68 65 72  ot check if ther
23140 65 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f  e is a master jo
23150 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a  urnal filename.*
23160 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
23170 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
23180 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20  re is, and that 
23190 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
231a0 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  ile.** does not 
231b0 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20  exist, then the 
231c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
231d0 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20  not really hot. 
231e0 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20  In this.** case 
231f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
23200 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65  l return a false
23210 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70  -positive. The p
23220 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a  ager_playback().
23230 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  ** routine will 
23240 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74 68  discover that th
23250 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
23260 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74  s not really hot
23270 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f   and .** will no
23280 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  t roll it back. 
23290 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d  .**.** If a hot-
232a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
232b0 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20  found to exist, 
232c0 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20  *pExists is set 
232d0 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c  to 1 and .** SQL
232e0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
232f0 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e   If no hot-journ
23300 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65  al file is prese
23310 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a  nt, *pExists is.
23320 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  ** set to 0 and 
23330 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
23340 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
23350 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
23360 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74  trying.** to det
23370 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
23380 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72  r not a hot-jour
23390 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
233a0 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a   the IO error.**
233b0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
233c0 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
233d0 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73 20 75  of *pExists is u
233e0 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
233f0 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f  tic int hasHotJo
23400 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
23410 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74  ger, int *pExist
23420 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  s){.  sqlite3_vf
23430 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
23440 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
23450 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
23460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23470 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
23480 0a 20 20 69 6e 74 20 65 78 69 73 74 73 3b 20 20  .  int exists;  
23490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234a0 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f   /* True if a jo
234b0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72  urnal file is pr
234c0 65 73 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65  esent */..  asse
234d0 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
234e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
234f0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
23500 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
23510 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
23520 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70  .  assert( !isOp
23530 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
23540 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
23550 67 65 72 2d 3e 73 74 61 74 65 20 3c 3d 20 50 41  ger->state <= PA
23560 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20  GER_SHARED );.. 
23570 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20   *pExists = 0;. 
23580 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
23590 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67  ccess(pVfs, pPag
235a0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  er->zJournal, SQ
235b0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
235c0 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20  TS, &exists);.  
235d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
235e0 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20  K && exists ){. 
235f0 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 3b 20 20     int locked;  
23600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23610 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70  * True if some p
23620 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52  rocess holds a R
23630 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a  ESERVED lock */.
23640 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e  .    /* Race con
23650 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e  dition here:  An
23660 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69  other process mi
23670 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f  ght have been ho
23680 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  lding the.    **
23690 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
236a0 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f  ck and have a jo
236b0 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68  urnal open at th
236c0 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  e sqlite3OsAcces
236d0 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  s() .    ** call
236e0 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e   above, but then
236f0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
23700 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65  nal and drop the
23710 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20   lock before.   
23720 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68   ** we get to th
23730 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69  e following sqli
23740 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
23750 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20  edLock() call.  
23760 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69  If that.    ** i
23770 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 69 73  s the case, this
23780 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74   routine might t
23790 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20  hink there is a 
237a0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  hot journal when
237b0 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20  .    ** in fact 
237c0 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20  there is none.  
237d0 54 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20  This results in 
237e0 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
237f0 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20   which will.    
23800 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68  ** be dealt with
23810 20 62 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b   by the playback
23820 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65   routine.  Ticke
23830 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a  t #3883..    */.
23840 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23850 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
23860 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
23870 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66  &locked);.    if
23880 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23890 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20  && !locked ){.  
238a0 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a      int nPage;..
238b0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
238c0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
238d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
238e0 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20   it consists of 
238f0 30 20 70 61 67 65 73 2c 0a 20 20 20 20 20 20 2a  0 pages,.      *
23900 2a 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68  * then delete th
23910 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
23920 53 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63  See the header c
23930 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 66 6f 72  omment above for
23940 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72   .      ** the r
23950 65 61 73 6f 6e 69 6e 67 20 68 65 72 65 2e 20 20  easoning here.  
23960 44 65 6c 65 74 65 20 74 68 65 20 6f 62 73 6f 6c  Delete the obsol
23970 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
23980 20 75 6e 64 65 72 0a 20 20 20 20 20 20 2a 2a 20   under.      ** 
23990 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
239a0 74 6f 20 61 76 6f 69 64 20 72 61 63 65 20 63 6f  to avoid race co
239b0 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20 74 6f 20  nditions and to 
239c0 61 76 6f 69 64 20 76 69 6f 6c 61 74 69 6e 67 0a  avoid violating.
239d0 20 20 20 20 20 20 2a 2a 20 5b 48 33 33 30 32 30        ** [H33020
239e0 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ]..      */.    
239f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
23a00 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
23a10 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
23a20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
23a30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
23a40 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
23a50 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
23a60 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
23a70 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20  loc();.         
23a80 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 4c 6f   if( sqlite3OsLo
23a90 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52  ck(pPager->fd, R
23aa0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53  ESERVED_LOCK)==S
23ab0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23ac0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
23ad0 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50  sDelete(pVfs, pP
23ae0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
23af0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
23b00 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
23b10 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52  pPager->fd, SHAR
23b20 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
23b30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23b40 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
23b50 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
23b60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23b70 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61     /* The journa
23b80 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
23b90 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  d no other conne
23ba0 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65  ction has a rese
23bb0 72 76 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  rved.          *
23bc0 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  * or greater loc
23bd0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
23be0 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63  e file. Now chec
23bf0 6b 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  k that there is.
23c00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20            ** at 
23c10 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65  least one non-ze
23c20 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65 20  ro bytes at the 
23c30 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
23c40 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
23c50 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65       ** If there
23c60 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e   is, then we con
23c70 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e  sider this journ
23c80 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66  al to be hot. If
23c90 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20   not, .         
23ca0 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67   ** it can be ig
23cb0 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20  nored..         
23cc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e   */.          in
23cd0 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  t f = SQLITE_OPE
23ce0 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
23cf0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
23d00 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 72  NAL;.          r
23d10 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
23d20 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
23d30 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
23d40 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20  ->jfd, f, &f);. 
23d50 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
23d60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23d70 20 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72            u8 fir
23d80 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
23d90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23da0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
23db0 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72  fd, (void *)&fir
23dc0 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  st, 1, 0);.     
23dd0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
23de0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
23df0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
23e00 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
23e10 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
23e20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23e30 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
23e40 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
23e50 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
23e60 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29  sts = (first!=0)
23e70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
23e80 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
23e90 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20  _CANTOPEN ){.   
23ea0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
23eb0 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68  e cannot open th
23ec0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
23ed0 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  al file in order
23ee0 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20   to see if.     
23ef0 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20 68 61         ** its ha
23f00 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c  s a zero header,
23f10 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 64   that might be d
23f20 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72  ue to an I/O err
23f30 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20  or, or.         
23f40 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62     ** it might b
23f50 65 20 64 75 65 20 74 6f 20 74 68 65 20 72 61 63  e due to the rac
23f60 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
23f70 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20  ribed above and 
23f80 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  in.            *
23f90 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20  * ticket #3883. 
23fa0 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 73 73   Either way, ass
23fb0 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ume that the jou
23fc0 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20  rnal is hot..   
23fd0 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73           ** This
23fe0 20 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c 73   might be a fals
23ff0 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74  e positive.  But
24000 20 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   if it is, then 
24010 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
24020 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75  ** automatic jou
24030 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e  rnal playback an
24040 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61  d recovery mecha
24050 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20  nism will deal. 
24060 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69             ** wi
24070 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45  th it under an E
24080 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68  XCLUSIVE lock wh
24090 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  ere we do not ne
240a0 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ed to.          
240b0 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75    ** worry so mu
240c0 63 68 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e  ch with race con
240d0 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20  ditions..       
240e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
240f0 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31      *pExists = 1
24100 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
24110 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
24120 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24130 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
24140 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
24150 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  rc;.}../*.** Ope
24160 6e 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  n a connection t
24170 6f 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61  o the write-ahea
24180 64 20 6c 6f 67 20 66 69 6c 65 20 66 6f 72 20 70  d log file for p
24190 61 67 65 72 20 70 50 61 67 65 72 2e 20 49 66 0a  ager pPager. If.
241a0 2a 2a 20 74 68 65 20 6c 6f 67 20 63 6f 6e 6e 65  ** the log conne
241b0 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79  ction is already
241c0 20 6f 70 65 6e 2c 20 74 68 69 73 20 66 75 6e 63   open, this func
241d0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
241e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
241f0 61 67 65 72 4f 70 65 6e 4c 6f 67 28 50 61 67 65  agerOpenLog(Page
24200 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
24210 28 20 21 70 50 61 67 65 72 2d 3e 70 4c 6f 67 20  ( !pPager->pLog 
24220 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20  ){.    int rc;  
24230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24240 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
24250 6f 64 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 42  ode */..    /* B
24260 65 66 6f 72 65 20 6f 70 65 6e 69 6e 67 20 74 68  efore opening th
24270 65 20 6c 6f 67 20 66 69 6c 65 2c 20 6f 62 74 61  e log file, obta
24280 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  in a SHARED lock
24290 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
242a0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 54 68  .    ** file. Th
242b0 69 73 20 6c 6f 63 6b 20 77 69 6c 6c 20 6e 6f 74  is lock will not
242c0 20 62 65 20 72 65 6c 65 61 73 65 64 20 75 6e 74   be released unt
242d0 69 6c 20 61 66 74 65 72 20 74 68 65 20 6c 6f 67  il after the log
242e0 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 63 6f 6e   file.    ** con
242f0 6e 65 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  nection has been
24300 20 63 6c 6f 73 65 64 2e 20 54 68 65 20 70 75 72   closed. The pur
24310 70 6f 73 65 20 6f 66 20 74 68 69 73 20 6c 6f 63  pose of this loc
24320 6b 20 69 73 20 74 6f 20 73 74 6f 70 0a 20 20 20  k is to stop.   
24330 20 2a 2a 20 61 6e 79 20 6f 74 68 65 72 20 70 72   ** any other pr
24340 6f 63 65 73 73 20 66 72 6f 6d 20 75 6e 6c 69 6e  ocess from unlin
24350 6b 69 6e 67 20 74 68 65 20 6c 6f 67 20 6f 72 20  king the log or 
24360 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 66 69 6c 65  log-summary file
24370 73 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74  s while.    ** t
24380 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  his connection s
24390 74 69 6c 6c 20 68 61 73 20 74 68 65 6d 20 6f 70  till has them op
243a0 65 6e 2e 20 41 6e 20 45 58 43 4c 55 53 49 56 45  en. An EXCLUSIVE
243b0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
243c0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
243d0 65 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  e is required to
243e0 20 75 6e 6c 69 6e 6b 20 65 69 74 68 65 72 20 6f   unlink either o
243f0 66 20 74 68 6f 73 65 20 74 77 6f 20 66 69 6c 65  f those two file
24400 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  s..    */.    as
24410 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
24420 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
24430 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  K );.    rc = pa
24440 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
24450 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
24460 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  LOCK);.    if( r
24470 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
24480 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
24490 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
244a0 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20  ER_UNLOCK );.   
244b0 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
244c0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
244d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
244e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
244f0 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  te>=SHARED_LOCK 
24500 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  );..    /* Open 
24510 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  the connection t
24520 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  o the log file. 
24530 49 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  If this operatio
24540 6e 20 66 61 69 6c 73 2c 20 0a 20 20 20 20 2a 2a  n fails, .    **
24550 20 28 65 2e 67 2e 20 64 75 65 20 74 6f 20 6d 61   (e.g. due to ma
24560 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 29 2c  lloc() failure),
24570 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
24580 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 0a 20  base file and . 
24590 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20     ** return an 
245a0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20  error code..    
245b0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
245c0 74 65 33 4c 6f 67 4f 70 65 6e 28 70 50 61 67 65  te3LogOpen(pPage
245d0 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
245e0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 70 50 61  >zFilename, &pPa
245f0 67 65 72 2d 3e 70 4c 6f 67 29 3b 0a 20 20 20 20  ger->pLog);.    
24600 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
24610 4b 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c  K ){.      osUnl
24620 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
24630 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 4e 4f 4e 45  SQLITE_LOCK_NONE
24640 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
24650 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
24660 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 72 65 74  NLOCK;.      ret
24670 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
24680 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
24690 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 77 61   the log file wa
246a0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  s already open, 
246b0 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70  check that the p
246c0 61 67 65 72 20 69 73 20 73 74 69 6c 6c 20 68 6f  ager is still ho
246d0 6c 64 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  lding.    ** the
246e0 20 72 65 71 75 69 72 65 64 20 53 48 41 52 45 44   required SHARED
246f0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
24700 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 20  abase file. .   
24710 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
24720 45 5f 44 45 42 55 47 0a 20 20 20 20 69 6e 74 20  E_DEBUG.    int 
24730 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 73 71  locktype;.    sq
24740 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
24750 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ol(pPager->fd, S
24760 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b  QLITE_FCNTL_LOCK
24770 53 54 41 54 45 2c 20 26 6c 6f 63 6b 74 79 70 65  STATE, &locktype
24780 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c  );.    assert( l
24790 6f 63 6b 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ocktype==SQLITE_
247a0 4c 4f 43 4b 5f 53 48 41 52 45 44 20 29 3b 0a 23  LOCK_SHARED );.#
247b0 65 6e 64 69 66 0a 20 20 20 20 70 50 61 67 65 72  endif.    pPager
247c0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
247d0 53 48 41 52 45 44 3b 0a 20 20 7d 0a 0a 20 20 72  SHARED;.  }..  r
247e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
247f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
24800 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
24810 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73  ed to obtain a s
24820 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
24830 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
24840 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61  .** It is illega
24850 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  l to call sqlite
24860 33 50 61 67 65 72 41 63 71 75 69 72 65 28 29 20  3PagerAcquire() 
24870 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 69 73  until after this
24880 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73   function.** has
24890 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c   been successful
248a0 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20  ly called. If a 
248b0 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61  shared-lock is a
248c0 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e  lready held when
248d0 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
248e0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
248f0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
24900 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
24910 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61  operations are a
24920 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79  lso performed by
24930 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
24940 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68  **.**   1) If th
24950 65 20 70 61 67 65 72 20 69 73 20 63 75 72 72 65  e pager is curre
24960 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f 55 4e  ntly in PAGER_UN
24970 4c 4f 43 4b 20 73 74 61 74 65 20 28 6e 6f 20 6c  LOCK state (no l
24980 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20  ock held.**     
24990 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
249a0 20 66 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20   file), then an 
249b0 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
249c0 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20  to obtain a.**  
249d0 20 20 20 20 53 48 41 52 45 44 20 6c 6f 63 6b 20      SHARED lock 
249e0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
249f0 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c  file. Immediatel
24a00 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e  y after obtainin
24a10 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 53 48  g.**      the SH
24a20 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66  ARED lock, the f
24a30 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 63 68  ile-system is ch
24a40 65 63 6b 65 64 20 66 6f 72 20 61 20 68 6f 74 2d  ecked for a hot-
24a50 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20  journal,.**     
24a60 20 77 68 69 63 68 20 69 73 20 70 6c 61 79 65 64   which is played
24a70 20 62 61 63 6b 20 69 66 20 70 72 65 73 65 6e 74   back if present
24a80 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20  . Following any 
24a90 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  hot-journal .** 
24aa0 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74       rollback, t
24ab0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
24ac0 68 65 20 63 61 63 68 65 20 61 72 65 20 76 61 6c  he cache are val
24ad0 69 64 61 74 65 64 20 62 79 20 63 68 65 63 6b 69  idated by checki
24ae0 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 27  ng.**      the '
24af0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20  change-counter' 
24b00 66 69 65 6c 64 20 6f 66 20 74 68 65 20 64 61 74  field of the dat
24b10 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65  abase file heade
24b20 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69  r and.**      di
24b30 73 63 61 72 64 65 64 20 69 66 20 74 68 65 79 20  scarded if they 
24b40 61 72 65 20 66 6f 75 6e 64 20 74 6f 20 62 65 20  are found to be 
24b50 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20  invalid..**.**  
24b60 20 32 29 20 49 66 20 74 68 65 20 70 61 67 65 72   2) If the pager
24b70 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
24b80 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61  xclusive-mode, a
24b90 6e 64 20 74 68 65 72 65 20 61 72 65 20 63 75 72  nd there are cur
24ba0 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e  rently.**      n
24bb0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
24bc0 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6e 79 20  ferences to any 
24bd0 70 61 67 65 73 2c 20 61 6e 64 20 69 73 20 69 6e  pages, and is in
24be0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
24bf0 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e 20 61  ,.**      then a
24c00 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
24c10 65 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 65  e to clear the e
24c20 72 72 6f 72 20 73 74 61 74 65 20 62 79 20 64 69  rror state by di
24c30 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20  scarding.**     
24c40 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
24c50 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
24c60 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  and rolling back
24c70 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61   any open journa
24c80 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a  l.**      file..
24c90 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 65  **.** If the ope
24ca0 72 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  ration described
24cb0 20 62 79 20 28 32 29 20 61 62 6f 76 65 20 69 73   by (2) above is
24cc0 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20   not attempted, 
24cd0 61 6e 64 20 69 66 20 74 68 65 0a 2a 2a 20 70 61  and if the.** pa
24ce0 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72  ger is in an err
24cf0 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74  or state other t
24d00 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  han SQLITE_FULL 
24d10 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  when this is cal
24d20 6c 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f  led,.** the erro
24d30 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f  r state error co
24d40 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
24d50 49 74 20 69 73 20 70 65 72 6d 69 74 74 65 64 20  It is permitted 
24d60 74 6f 20 72 65 61 64 20 74 68 65 0a 2a 2a 20 64  to read the.** d
24d70 61 74 61 62 61 73 65 20 77 68 65 6e 20 69 6e 20  atabase when in 
24d80 53 51 4c 49 54 45 5f 46 55 4c 4c 20 65 72 72 6f  SQLITE_FULL erro
24d90 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 4f  r state..**.** O
24da0 74 68 65 72 77 69 73 65 2c 20 69 66 20 65 76 65  therwise, if eve
24db0 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
24dc0 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
24dd0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
24de0 20 61 6e 0a 2a 2a 20 49 4f 20 65 72 72 6f 72 20   an.** IO error 
24df0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c 6f 63  occurs while loc
24e00 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  king the databas
24e10 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  e, checking for 
24e20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  a hot-journal.**
24e30 20 66 69 6c 65 20 6f 72 20 72 6f 6c 6c 69 6e 67   file or rolling
24e40 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
24e50 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65 72 72  file, the IO err
24e60 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
24e70 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
24e80 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f  te3PagerSharedLo
24e90 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
24ea0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
24eb0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
24ec0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
24ed0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
24ee0 69 73 45 72 72 6f 72 52 65 73 65 74 20 3d 20 30  isErrorReset = 0
24ef0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
24f00 2a 20 54 72 75 65 20 69 66 20 72 65 63 6f 76 65  * True if recove
24f10 72 69 6e 67 20 66 72 6f 6d 20 65 72 72 6f 72 20  ring from error 
24f20 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54  state */..  /* T
24f30 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
24f40 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  nly called from 
24f50 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20  b-tree and only 
24f60 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e  when there are n
24f70 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69  o.  ** outstandi
24f80 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 61 73  ng pages */.  as
24f90 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
24fa0 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
24fb0 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
24fc0 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 4d  );.  if( NEVER(M
24fd0 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
24fe0 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74 75  errCode) ){ retu
24ff0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
25000 64 65 3b 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  de; }..  /* If t
25010 68 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20  his database is 
25020 69 6e 20 61 6e 20 65 72 72 6f 72 2d 73 74 61 74  in an error-stat
25030 65 2c 20 6e 6f 77 20 69 73 20 61 20 63 68 61 6e  e, now is a chan
25040 63 65 20 74 6f 20 63 6c 65 61 72 0a 20 20 2a 2a  ce to clear.  **
25050 20 74 68 65 20 65 72 72 6f 72 2e 20 44 69 73 63   the error. Disc
25060 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ard the contents
25070 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
25080 63 68 65 20 61 6e 64 20 72 6f 6c 6c 62 61 63 6b  che and rollback
25090 0a 20 20 2a 2a 20 61 6e 79 20 68 6f 74 20 6a 6f  .  ** any hot jo
250a0 75 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c  urnal in the fil
250b0 65 2d 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20  e-system..  */. 
250c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
250d0 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Code ){.    if( 
250e0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
250f0 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 7a  fd) || pPager->z
25100 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
25110 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 3d 20   isErrorReset = 
25120 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  1;.    }.    pPa
25130 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53  ger->errCode = S
25140 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 61  QLITE_OK;.    pa
25150 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
25160 29 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20 70  );.  }...  if( p
25170 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
25180 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
25190 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20  LMODE_WAL ){.   
251a0 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30   int changed = 0
251b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
251c0 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 63 61  * True if the ca
251d0 63 68 65 20 6d 75 73 74 20 62 65 20 66 6c 75 73  che must be flus
251e0 68 65 64 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4f  hed */..    /* O
251f0 70 65 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65  pen the log file
25200 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
25210 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a  lready open. */.
25220 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
25230 65 6e 4c 6f 67 28 70 50 61 67 65 72 29 3b 0a 20  enLog(pPager);. 
25240 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
25250 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
25260 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
25270 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 6c 6f      /* Open a lo
25280 67 20 73 6e 61 70 73 68 6f 74 20 74 6f 20 72 65  g snapshot to re
25290 61 64 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20  ad from. */.    
252a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 4f  rc = sqlite3LogO
252b0 70 65 6e 53 6e 61 70 73 68 6f 74 28 70 50 61 67  penSnapshot(pPag
252c0 65 72 2d 3e 70 4c 6f 67 2c 20 26 63 68 61 6e 67  er->pLog, &chang
252d0 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
252e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
252f0 20 20 20 20 69 6e 74 20 64 75 6d 6d 79 3b 0a 20      int dummy;. 
25300 20 20 20 20 20 69 66 28 20 63 68 61 6e 67 65 64       if( changed
25310 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
25320 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
25330 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
25340 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
25350 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69   || pPager->dbSi
25360 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20  zeValid==0 );.  
25370 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
25380 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
25390 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
253a0 64 75 6d 6d 79 29 3b 0a 20 20 20 20 7d 0a 20 20  dummy);.    }.  
253b0 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
253c0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
253d0 4e 4c 4f 43 4b 20 7c 7c 20 69 73 45 72 72 6f 72  NLOCK || isError
253e0 52 65 73 65 74 20 29 7b 0a 20 20 20 20 73 71 6c  Reset ){.    sql
253f0 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
25400 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
25410 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 69 73  pVfs;.    int is
25420 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  HotJournal = 0;.
25430 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
25440 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  DB );.    assert
25450 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
25460 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
25470 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
25480 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
25490 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20  oReadlock ){.   
254a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
254b0 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20  r->readOnly );. 
254c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
254d0 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
254e0 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  D;.    }else{.  
254f0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
25500 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
25510 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
25520 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
25530 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25540 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
25550 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
25560 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  R_UNLOCK );.    
25570 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
25580 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
25590 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
255a0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
255b0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41  ager->state>=SHA
255c0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 20  RED_LOCK );..   
255d0 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
255e0 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
255f0 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
25600 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
25610 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
25620 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
25630 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
25640 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
25650 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
25660 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 45 72  */.    if( !isEr
25670 72 6f 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  rorReset ){.    
25680 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
25690 2d 3e 73 74 61 74 65 20 3c 3d 20 50 41 47 45 52  ->state <= PAGER
256a0 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 20  _SHARED );.     
256b0 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72   rc = hasHotJour
256c0 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 69 73 48  nal(pPager, &isH
256d0 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  otJournal);.    
256e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
256f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
25700 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
25710 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
25720 28 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 7c  ( isErrorReset |
25730 7c 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 29  | isHotJournal )
25740 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61  {.      /* Get a
25750 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
25760 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
25770 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70   file. At this p
25780 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20  oint it is.     
25790 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   ** important th
257a0 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  at a RESERVED lo
257b0 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e  ck is not obtain
257c0 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f  ed on the way to
257d0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58   the.      ** EX
257e0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
257f0 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65   it were, anothe
25800 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20  r process might 
25810 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  open the.      *
25820 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
25830 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45   detect the RESE
25840 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63  RVED lock, and c
25850 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65  onclude that the
25860 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
25870 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  se is safe to re
25880 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ad while this pr
25890 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72  ocess is still r
258a0 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20  olling the .    
258b0 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c    ** hot-journal
258c0 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20   back..      ** 
258d0 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73  .      ** Becaus
258e0 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  e the intermedia
258f0 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  te RESERVED lock
25900 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65   is not requeste
25910 64 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20  d, any.      ** 
25920 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 61 74  other process at
25930 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65  tempting to acce
25940 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ss the database 
25950 66 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f  file will get to
25960 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20   .      ** this 
25970 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64  point in the cod
25980 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62  e and fail to ob
25990 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43  tain its own EXC
259a0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20  LUSIVE lock .   
259b0 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74     ** on the dat
259c0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
259d0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
259e0 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 45 58 43  Pager->state<EXC
259f0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
25a00 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
25a10 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
25a20 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f  ->fd, EXCLUSIVE_
25a30 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69  LOCK);.        i
25a40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25a50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
25a60 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70   = pager_error(p
25a70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
25a80 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
25a90 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
25aa0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
25ab0 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
25ac0 53 49 56 45 3b 0a 20 20 20 20 20 20 7d 0a 20 0a  SIVE;.      }. .
25ad0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
25ae0 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65  e journal for re
25af0 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
25b00 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
25b10 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 65 78   in .      ** ex
25b20 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
25b30 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ode the file des
25b40 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20  criptor will be 
25b50 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20  kept open and.  
25b60 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20      ** possibly 
25b70 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73  used for a trans
25b80 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e  action later on.
25b90 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   On some systems
25ba0 2c 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f  , the.      ** O
25bb0 73 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c  sTruncate() call
25bc0 20 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69   used in exclusi
25bd0 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61  ve-access mode a
25be0 6c 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20  lso requires.   
25bf0 20 20 20 2a 2a 20 61 20 72 65 61 64 2f 77 72 69     ** a read/wri
25c00 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a  te file handle..
25c10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
25c20 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
25c30 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
25c40 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20     int res;.    
25c50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25c60 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 70 50  OsAccess(pVfs,pP
25c70 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 53  ager->zJournal,S
25c80 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
25c90 53 54 53 2c 26 72 65 73 29 3b 0a 20 20 20 20 20  STS,&res);.     
25ca0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
25cb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
25cc0 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
25cd0 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75           int fou
25ce0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
25cf0 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
25d00 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
25d10 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
25d20 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20  N_JOURNAL;.     
25d30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
25d40 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
25d50 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
25d60 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
25d70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
25d80 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
25d90 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74  r->jfd, f, &fout
25da0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
25db0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
25dc0 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
25dd0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
25de0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
25df0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
25e00 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
25e10 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  _READONLY ){.   
25e20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
25e30 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
25e40 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
25e50 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
25e60 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
25e70 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
25e80 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
25e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
25ea0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f  f the journal do
25eb0 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74  es not exist, it
25ec0 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74   usually means t
25ed0 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20  hat some .      
25ee0 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63        ** other c
25ef0 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65  onnection manage
25f00 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64 20  d to get in and 
25f10 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65 66  roll it back bef
25f20 6f 72 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  ore .           
25f30 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   ** this connect
25f40 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65  ion obtained the
25f50 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
25f60 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20  above. Or, it . 
25f70 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 61             ** ma
25f80 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20  y mean that the 
25f90 70 61 67 65 72 20 77 61 73 20 69 6e 20 74 68 65  pager was in the
25fa0 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65   error-state whe
25fb0 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  n this.         
25fc0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77     ** function w
25fd0 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68  as called and th
25fe0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
25ff0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 20  oes not exist.  
26000 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  */.            r
26010 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
26020 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
26030 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
26040 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
26050 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
26060 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26070 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
26080 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
26090 20 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20     /* Reset the 
260a0 6a 6f 75 72 6e 61 6c 20 73 74 61 74 75 73 20 66  journal status f
260b0 69 65 6c 64 73 20 74 6f 20 69 6e 64 69 63 61 74  ields to indicat
260c0 65 73 20 74 68 61 74 20 77 65 20 68 61 76 65 20  es that we have 
260d0 6e 6f 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c  no.      ** roll
260e0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 74 20  back journal at 
260f0 74 68 69 73 20 74 69 6d 65 2e 20 2a 2f 0a 20 20  this time. */.  
26100 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
26110 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
26120 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
26130 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
26140 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
26150 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  aster = 0;.     
26160 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
26170 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20  Hdr = 0;. .     
26180 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
26190 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
261a0 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74  as been synced t
261b0 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20 0a 20 20 20  o disk. */. .   
261c0 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61     /* Playback a
261d0 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  nd delete the jo
261e0 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65  urnal.  Drop the
261f0 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a   database write.
26200 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e        ** lock an
26210 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  d reacquire the 
26220 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65  read lock. Purge
26230 20 74 68 65 20 63 61 63 68 65 20 62 65 66 6f 72   the cache befor
26240 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69  e.      ** playi
26250 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74 2d  ng back the hot-
26260 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20  journal so that 
26270 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70 20  we don't end up 
26280 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e  with.      ** an
26290 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
262a0 63 68 65 2e 20 20 53 79 6e 63 20 74 68 65 20 68  che.  Sync the h
262b0 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  ot journal befor
262c0 65 20 70 6c 61 79 69 6e 67 0a 20 20 20 20 20 20  e playing.      
262d0 2a 2a 20 69 74 20 62 61 63 6b 20 73 69 6e 63 65  ** it back since
262e0 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
262f0 74 20 63 72 61 73 68 65 64 20 61 6e 64 20 6c 65  t crashed and le
26300 66 74 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e  ft the hot journ
26310 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  al.      ** prob
26320 61 62 6c 79 20 64 69 64 20 6e 6f 74 20 73 79 6e  ably did not syn
26330 63 20 69 74 20 61 6e 64 20 77 65 20 61 72 65 20  c it and we are 
26340 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c 77 61  required to alwa
26350 79 73 20 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a  ys sync.      **
26360 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
26370 6f 72 65 20 70 6c 61 79 69 6e 67 20 69 74 20 62  ore playing it b
26380 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ack..      */.  
26390 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
263a0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
263b0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
263c0 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28  rSyncHotJournal(
263d0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
263e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
263f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
26400 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
26410 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  ack(pPager, 1);.
26420 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26430 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
26440 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
26450 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f   rc = pager_erro
26460 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
26470 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61           goto fa
26480 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iled;.        }.
26490 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
264a0 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 73  sert( (pPager->s
264b0 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
264c0 45 44 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ED).           |
264d0 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  | (pPager->exclu
264e0 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
264f0 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f  er->state>PAGER_
26500 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 29 3b  SHARED).      );
26510 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
26520 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
26530 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  || sqlite3Pcache
26540 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
26550 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a  ->pPCache)>0 ){.
26560 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
26570 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73  red-lock has jus
26580 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20  t been acquired 
26590 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
265a0 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e  file.      ** an
265b0 64 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65  d there are alre
265c0 61 64 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  ady pages in the
265d0 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70   cache (from a p
265e0 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a  revious.      **
265f0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
26600 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68  ransaction).  Ch
26610 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
26620 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  e database.     
26630 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64   ** has been mod
26640 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64  ified.  If the d
26650 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e  atabase has chan
26660 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20  ged, flush the. 
26670 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20       ** cache.. 
26680 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
26690 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   Database change
266a0 73 20 69 73 20 64 65 74 65 63 74 65 64 20 62 79  s is detected by
266b0 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62   looking at 15 b
266c0 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20  ytes beginning. 
266d0 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65       ** at offse
266e0 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69  t 24 into the fi
266f0 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34  le.  The first 4
26700 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74   of these 16 byt
26710 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20  es are.      ** 
26720 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72  a 32-bit counter
26730 20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65   that is increme
26740 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63  nted with each c
26750 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20  hange.  The.    
26760 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73    ** other bytes
26770 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79   change randomly
26780 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20   with each file 
26790 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20  change when.    
267a0 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20    ** a codec is 
267b0 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a  in use..      **
267c0 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65   .      ** There
267d0 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c   is a vanishingl
267e0 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74  y small chance t
267f0 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c  hat a change wil
26800 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20  l not be .      
26810 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68  ** detected.  Th
26820 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75  e chance of an u
26830 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65  ndetected change
26840 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61   is so small tha
26850 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61  t.      ** it ca
26860 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a  n be neglected..
26870 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
26880 6e 74 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20  nt nPage;.      
26890 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
268a0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
268b0 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20  bFileVers)];.   
268c0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50     sqlite3PagerP
268d0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
268e0 20 26 6e 50 61 67 65 29 3b 0a 0a 20 20 20 20 20   &nPage);..     
268f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
26900 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Code ){.        
26910 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
26920 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 67 6f  Code;.        go
26930 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
26940 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 50   }..      if( nP
26950 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  age>0 ){.       
26960 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52   IOTRACE(("CKVER
26970 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  S %p %d\n", pPag
26980 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  er, sizeof(dbFil
26990 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20  eVers)));.      
269a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
269b0 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
269c0 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69   &dbFileVers, si
269d0 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
269e0 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69  , 24);.        i
269f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26a00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
26a10 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
26a20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
26a30 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
26a40 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20  (dbFileVers, 0, 
26a50 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
26a60 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  s));.      }..  
26a70 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
26a80 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
26a90 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73  s, dbFileVers, s
26aa0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
26ab0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
26ac0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
26ad0 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ger);.      }.  
26ae0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
26af0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
26b00 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
26b10 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
26b20 41 52 45 44 20 29 3b 0a 20 20 7d 0a 0a 20 66 61  ARED );.  }.. fa
26b30 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d  iled:.  if( rc!=
26b40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26b50 20 2f 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   /* pager_unlock
26b60 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  () is a no-op fo
26b70 72 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  r exclusive mode
26b80 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   and in-memory d
26b90 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20 20  atabases. */.   
26ba0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
26bb0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
26bc0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
26bd0 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   If the referenc
26be0 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63  e count has reac
26bf0 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61  hed zero, rollba
26c00 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a  ck any active.**
26c10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
26c20 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
26c30 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c  r..**.** Except,
26c40 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
26c50 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20  =EXCLUSIVE when 
26c60 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67  there is nothing
26c70 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f   to in.** the ro
26c80 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20  llback journal, 
26c90 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f  the unlock is no
26ca0 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20  t performed and 
26cb0 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68  there is.** noth
26cc0 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c  ing to rollback,
26cd0 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   so this routine
26ce0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20   is a no-op..*/ 
26cf0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
26d00 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
26d10 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
26d20 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 50  .  if( (sqlite3P
26d30 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
26d40 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
26d50 30 29 0a 20 20 20 26 26 20 28 21 70 50 61 67 65  0).   && (!pPage
26d60 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
26d70 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
26d80 6e 61 6c 4f 66 66 3e 30 29 20 0a 20 20 29 7b 0a  nalOff>0) .  ){.
26d90 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
26da0 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
26db0 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
26dc0 20 41 63 71 75 69 72 65 20 61 20 72 65 66 65 72   Acquire a refer
26dd0 65 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d  ence to page num
26de0 62 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65  ber pgno in page
26df0 72 20 70 50 61 67 65 72 20 28 61 20 70 61 67 65  r pPager (a page
26e00 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61  .** reference ha
26e10 73 20 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e  s type DbPage*).
26e20 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
26e30 64 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a  d reference is .
26e40 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ** successfully 
26e50 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20  obtained, it is 
26e60 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67  copied to *ppPag
26e70 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  e and SQLITE_OK 
26e80 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
26e90 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
26ea0 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
26eb0 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69   in the cache, i
26ec0 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  t is returned. .
26ed0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  ** Otherwise, a 
26ee0 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20  new page object 
26ef0 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
26f00 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
26f10 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f  data.** read fro
26f20 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
26f30 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73  ile. In some cas
26f40 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d  es, the pcache m
26f50 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f  odule may.** cho
26f60 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63  ose not to alloc
26f70 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f  ate a new page o
26f80 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65  bject and may re
26f90 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  use an existing.
26fa0 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e  ** object with n
26fb0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
26fc0 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  ferences..**.** 
26fd0 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61  The extra data a
26fe0 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67  ppended to a pag
26ff0 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  e is always init
27000 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73  ialized to zeros
27010 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74   the .** first t
27020 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f  ime a page is lo
27030 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
27040 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65  . If the page re
27050 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61  quested is .** a
27060 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
27070 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  che when this fu
27080 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
27090 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61  , then the extra
270a0 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74  .** data is left
270b0 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20   as it was when 
270c0 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20  the page object 
270d0 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a  was last used..*
270e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
270f0 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d  base image is sm
27100 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72  aller than the r
27110 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f 72  equested page or
27120 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65   if a .** non-ze
27130 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73 73  ro value is pass
27140 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74  ed as the noCont
27150 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e  ent parameter an
27160 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73  d the .** reques
27170 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20  ted page is not 
27180 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20 69  already stored i
27190 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68 65  n the cache, the
271a0 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20  n no .** actual 
271b0 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73  disk read occurs
271c0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
271d0 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  he memory image 
271e0 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20  of the .** page 
271f0 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
27200 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a  o all zeros. .**
27210 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
27220 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61   is true, it mea
27230 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
27240 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  t care about the
27250 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20   contents.** of 
27260 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f  the page. This o
27270 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73 65 70  ccurs in two sep
27280 65 72 61 74 65 20 73 63 65 6e 61 72 69 6f 73 3a  erate scenarios:
27290 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e  .**.**   a) When
272a0 20 72 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d   reading a free-
272b0 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 66  list leaf page f
272c0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
272d0 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29  , and.**.**   b)
272e0 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
272f0 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  t is being rolle
27300 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65  d back and we ne
27310 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20  ed to load.**   
27320 20 20 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e     a new page in
27330 74 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f 20  to the cache to 
27340 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  be filled with t
27350 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20  he data read.** 
27360 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61       from the sa
27370 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e  vepoint journal.
27380 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  .**.** If noCont
27390 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  ent is true, the
273a0 6e 20 74 68 65 20 64 61 74 61 20 72 65 74 75 72  n the data retur
273b0 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e  ned is zeroed in
273c0 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e  stead of.** bein
273d0 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  g read from the 
273e0 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69  database. Additi
273f0 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73  onally, the bits
27400 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
27410 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67  * to pgno in Pag
27420 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62  er.pInJournal (b
27430 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61  itvec of pages a
27440 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e 20 74  lready written t
27450 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  o the.** journal
27460 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50   file) and the P
27470 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
27480 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65  nSavepoint bitve
27490 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a  cs of any open.*
274a0 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  * savepoints are
274b0 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73   set. This means
274c0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
274d0 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 61 74  made writable at
274e0 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e   any.** point in
274f0 20 74 68 65 20 66 75 74 75 72 65 2c 20 75 73 69   the future, usi
27500 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  ng a call to sql
27510 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
27520 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  , its contents.*
27530 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f  * will not be jo
27540 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61  urnaled. This sa
27550 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68  ves IO..**.** Th
27560 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
27570 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
27580 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
27590 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
275a0 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
275b0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
275c0 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
275d0 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
275e0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
275f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
27600 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69  kup().  Both thi
27610 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f  s routine and Lo
27620 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
27630 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
27640 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
27650 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
27660 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
27670 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
27680 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
27690 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
276a0 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
276b0 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28   whereas Lookup(
276c0 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e  ).** just return
276d0 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69  s 0.  This routi
276e0 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65  ne acquires a re
276f0 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73  ad-lock the firs
27700 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73  t time it.** has
27710 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20   to go to disk, 
27720 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70  and could also p
27730 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a  layback an old j
27740 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
27750 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f  ary..** Since Lo
27760 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65  okup() never goe
27770 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65  s to disk, it ne
27780 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20  ver has to deal 
27790 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72  with locks.** or
277a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
277b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
277c0 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61  gerAcquire(.  Pa
277d0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
277e0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
277f0 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
27800 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
27810 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
27820 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
27830 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44   to fetch */.  D
27840 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  bPage **ppPage, 
27850 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f     /* Write a po
27860 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
27870 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
27880 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20  noContent       
27890 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72  /* Do not bother
278a0 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74   reading content
278b0 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72   from disk if tr
278c0 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ue */.){.  int r
278d0 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
278e0 0a 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ..  assert( asse
278f0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
27900 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
27910 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
27920 65 3e 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  e>PAGER_UNLOCK )
27930 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  ;..  if( pgno==0
27940 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
27950 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
27960 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  PT;.  }..  /* If
27970 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
27980 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
27990 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
279a0 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a  r immediately. .
279b0 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
279c0 72 65 71 75 65 73 74 20 74 68 65 20 70 61 67 65  request the page
279d0 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63 68 65   from the PCache
279e0 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28   layer. */.  if(
279f0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
27a00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  !=SQLITE_OK && p
27a10 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
27a20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
27a30 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
27a40 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65  errCode;.  }else
27a50 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
27a60 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
27a70 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
27a80 67 6e 6f 2c 20 31 2c 20 70 70 50 61 67 65 29 3b  gno, 1, ppPage);
27a90 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
27aa0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27ab0 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 63   /* Either the c
27ac0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63  all to sqlite3Pc
27ad0 61 63 68 65 46 65 74 63 68 28 29 20 72 65 74 75  acheFetch() retu
27ae0 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f 72  rned an error or
27af0 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
27b00 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 69 6e  r was already in
27b10 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65   the error-state
27b20 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
27b30 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a  ion was called..
27b40 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20 74      ** Set pPg t
27b50 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20  o 0 and jump to 
27b60 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68 61  the exception ha
27b70 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70  ndler.  */.    p
27b80 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  Pg = 0;.    goto
27b90 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
27ba0 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rr;.  }.  assert
27bb0 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e  ( (*ppPage)->pgn
27bc0 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  o==pgno );.  ass
27bd0 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e  ert( (*ppPage)->
27be0 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c  pPager==pPager |
27bf0 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61  | (*ppPage)->pPa
27c00 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  ger==0 );..  if(
27c10 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67   (*ppPage)->pPag
27c20 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74  er && !noContent
27c30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
27c40 69 73 20 63 61 73 65 20 74 68 65 20 70 63 61 63  is case the pcac
27c50 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61  he already conta
27c60 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a  ins an initializ
27c70 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a  ed copy of.    *
27c80 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65 74 75  * the page. Retu
27c90 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74 68  rn without furth
27ca0 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20  er ado.  */.    
27cb0 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41  assert( pgno<=PA
27cc0 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20  GER_MAX_PGNO && 
27cd0 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
27ce0 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20  GNO(pPager) );. 
27cf0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
27d00 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20  ager->nHit);.   
27d10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27d20 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K;..  }else{.   
27d30 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61   /* The pager ca
27d40 63 68 65 20 68 61 73 20 63 72 65 61 74 65 64 20  che has created 
27d50 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20  a new page. Its 
27d60 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f  content needs to
27d70 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74   .    ** be init
27d80 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 20 20 20  ialized.  */.   
27d90 20 69 6e 74 20 6e 4d 61 78 3b 0a 0a 20 20 20 20   int nMax;..    
27da0 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
27db0 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 70  r->nMiss);.    p
27dc0 50 67 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20  Pg = *ppPage;.  
27dd0 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20    pPg->pPager = 
27de0 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20  pPager;..    /* 
27df0 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  The maximum page
27e00 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e   number is 2^31.
27e10 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   Return SQLITE_C
27e20 4f 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65  ORRUPT if a page
27e30 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67  .    ** number g
27e40 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
27e50 2c 20 6f 72 20 74 68 65 20 75 6e 75 73 65 64 20  , or the unused 
27e60 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73  locking-page, is
27e70 20 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20   requested. */. 
27e80 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45     if( pgno>PAGE
27e90 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67  R_MAX_PGNO || pg
27ea0 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
27eb0 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
27ec0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
27ed0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
27ee0 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
27ef0 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d  quire_err;.    }
27f00 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
27f10 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
27f20 28 70 50 61 67 65 72 2c 20 26 6e 4d 61 78 29 3b  (pPager, &nMax);
27f30 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
27f40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27f50 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
27f60 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20  re_err;.    }.. 
27f70 20 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20     if( MEMDB || 
27f80 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c  nMax<(int)pgno |
27f90 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21  | noContent || !
27fa0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
27fb0 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  d) ){.      if( 
27fc0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50  pgno>pPager->mxP
27fd0 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72  gno ){.        r
27fe0 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
27ff0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
28000 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
28010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
28020 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  f( noContent ){.
28030 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75          /* Failu
28040 72 65 20 74 6f 20 73 65 74 20 74 68 65 20 62 69  re to set the bi
28050 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72  ts in the InJour
28060 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20  nal bit-vectors 
28070 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20  is benign..     
28080 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20     ** It merely 
28090 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69  means that we mi
280a0 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72  ght do some extr
280b0 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61  a work to journa
280c0 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  l a .        ** 
280d0 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
280e0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f  ot need to be jo
280f0 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74  urnaled.  Nevert
28100 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20  heless, be sure 
28110 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  .        ** to t
28120 65 73 74 20 74 68 65 20 63 61 73 65 20 77 68 65  est the case whe
28130 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  re a malloc erro
28140 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
28150 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20  rying to set .  
28160 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69        ** a bit i
28170 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a  n a bit vector..
28180 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
28190 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
281a0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
281b0 20 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c         if( pgno<
281c0 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
281d0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
281e0 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20   TESTONLY( rc = 
281f0 29 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  ) sqlite3BitvecS
28200 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  et(pPager->pInJo
28210 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20  urnal, pgno);.  
28220 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
28230 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
28240 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  EM );.        }.
28250 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59          TESTONLY
28260 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61  ( rc = ) addToSa
28270 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
28280 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
28290 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
282a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
282b0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
282c0 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
282d0 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  oc();.      }.  
282e0 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e      memset(pPg->
282f0 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72  pData, 0, pPager
28300 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
28310 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52     IOTRACE(("ZER
28320 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  O %p %d\n", pPag
28330 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  er, pgno));.    
28340 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
28350 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
28360 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20  ==pPager );.    
28370 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67    rc = readDbPag
28380 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66  e(pPg);.      if
28390 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
283a0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
283b0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
283c0 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
283d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
283e0 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
283f0 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
28400 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
28410 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  g);.#endif.  }..
28420 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28430 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75 69  OK;..pager_acqui
28440 72 65 5f 65 72 72 3a 0a 20 20 61 73 73 65 72 74  re_err:.  assert
28450 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28460 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
28470 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
28480 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a  eDrop(pPg);.  }.
28490 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
284a0 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 0a  nused(pPager);..
284b0 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
284c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
284d0 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
284e0 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72  age if it is alr
284f0 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d  eady in the in-m
28500 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f  emory cache.  Do
28510 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65  .** not read the
28520 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e   page from disk.
28530 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
28540 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a  er to the page,.
28550 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70  ** or 0 if the p
28560 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
28570 63 68 65 2e 20 41 6c 73 6f 2c 20 72 65 74 75 72  che. Also, retur
28580 6e 20 30 20 69 66 20 74 68 65 20 0a 2a 2a 20 70  n 0 if the .** p
28590 61 67 65 72 20 69 73 20 69 6e 20 50 41 47 45 52  ager is in PAGER
285a0 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 77 68  _UNLOCK state wh
285b0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
285c0 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 6f   is called,.** o
285d0 72 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  r if the pager i
285e0 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74  s in an error st
285f0 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ate other than S
28600 51 4c 49 54 45 5f 46 55 4c 4c 2e 0a 2a 2a 0a 2a  QLITE_FULL..**.*
28610 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
28620 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54  e3PagerGet().  T
28630 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
28640 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
28650 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  ne.** and sqlite
28660 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74  3PagerGet() is t
28670 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20  hat _get() will 
28680 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  go to the disk a
28690 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68  nd read.** in th
286a0 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61  e page if the pa
286b0 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
286c0 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69  y in cache.  Thi
286d0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
286e0 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
286f0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
28700 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69  cache or if a di
28710 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a  sk I/O error .**
28720 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e   has ever happen
28730 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73  ed..*/.DbPage *s
28740 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
28750 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
28760 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
28770 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20  gHdr *pPg = 0;. 
28780 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
28790 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
287a0 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73  pgno!=0 );.  ass
287b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43  ert( pPager->pPC
287c0 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  ache!=0 );.  ass
287d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
287e0 74 65 20 3e 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te > PAGER_UNLOC
287f0 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  K );.  sqlite3Pc
28800 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72  acheFetch(pPager
28810 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
28820 20 30 2c 20 26 70 50 67 29 3b 0a 20 20 72 65 74   0, &pPg);.  ret
28830 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn pPg;.}../*.*
28840 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65  * Release a page
28850 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a   reference..**.*
28860 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
28870 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
28880 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74   the page drop t
28890 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
288a0 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65  .** page is adde
288b0 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73  d to the LRU lis
288c0 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66  t.  When all ref
288d0 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70  erences to all p
288e0 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65  ages.** are rele
288f0 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ased, a rollback
28900 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
28910 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
28920 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76  base is.** remov
28930 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
28940 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62  te3PagerUnref(Db
28950 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66  Page *pPg){.  if
28960 28 20 70 50 67 20 29 7b 0a 20 20 20 20 50 61 67  ( pPg ){.    Pag
28970 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
28980 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71  ->pPager;.    sq
28990 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
289a0 73 65 28 70 50 67 29 3b 0a 20 20 20 20 70 61 67  se(pPg);.    pag
289b0 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
289c0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a  (pPager);.  }.}.
289d0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61  ./*.** If the ma
289e0 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
289f0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
28a00 20 6f 70 65 6e 65 64 2c 20 65 6e 73 75 72 65 20   opened, ensure 
28a10 74 68 61 74 20 74 68 65 0a 2a 2a 20 73 75 62 2d  that the.** sub-
28a20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
28a30 6f 70 65 6e 20 74 6f 6f 2e 20 49 66 20 74 68 65  open too. If the
28a40 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73   main journal is
28a50 20 6e 6f 74 20 6f 70 65 6e 2c 0a 2a 2a 20 74 68   not open,.** th
28a60 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
28a70 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51   no-op..**.** SQ
28a80 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
28a90 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e  ned if everythin
28aa0 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67  g goes according
28ab0 20 74 6f 20 70 6c 61 6e 2e 20 0a 2a 2a 20 41 6e   to plan. .** An
28ac0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58   SQLITE_IOERR_XX
28ad0 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  X error code is 
28ae0 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 63 61  returned if a ca
28af0 6c 6c 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65  ll to .** sqlite
28b00 33 4f 73 4f 70 65 6e 28 29 20 66 61 69 6c 73 2e  3OsOpen() fails.
28b10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
28b20 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61  penSubJournal(Pa
28b30 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
28b40 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
28b50 4f 4b 3b 0a 20 20 69 66 28 20 28 70 61 67 65 72  OK;.  if( (pager
28b60 55 73 65 4c 6f 67 28 70 50 61 67 65 72 29 20 7c  UseLog(pPager) |
28b70 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
28b80 3e 6a 66 64 29 29 20 26 26 20 21 69 73 4f 70 65  >jfd)) && !isOpe
28b90 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
28ba0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
28bb0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
28bc0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
28bd0 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67  E_MEMORY || pPag
28be0 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  er->subjInMemory
28bf0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
28c00 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  3MemJournalOpen(
28c10 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20  pPager->sjfd);. 
28c20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28c30 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65  rc = pagerOpente
28c40 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  mp(pPager, pPage
28c50 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f  r->sjfd, SQLITE_
28c60 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29  OPEN_SUBJOURNAL)
28c70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
28c80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
28c90 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
28ca0 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65  is called at the
28cb0 20 73 74 61 72 74 20 6f 66 20 65 76 65 72 79 20   start of every 
28cc0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
28cd0 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  n..** There must
28ce0 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45   already be a RE
28cf0 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
28d00 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
28d10 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c  database .** fil
28d20 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
28d30 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
28d40 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f  *.** Open the jo
28d50 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
28d60 61 67 65 72 20 70 50 61 67 65 72 20 61 6e 64 20  ager pPager and 
28d70 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20  write a journal 
28d80 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65  header.** to the
28d90 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66   start of it. If
28da0 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
28db0 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70  e savepoints, op
28dc0 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
28dd0 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54  al.** as well. T
28de0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
28df0 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74  only used when t
28e00 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
28e10 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65  is being .** ope
28e20 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61 20 72  ned to write a r
28e30 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20  ollback log for 
28e40 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  a transaction. I
28e50 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a  t is not used .*
28e60 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * when opening a
28e70 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot journal fil
28e80 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
28e90 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
28ea0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
28eb0 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73  already open (as
28ec0 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78   it may be in ex
28ed0 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a  clusive mode),.*
28ee0 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * then this func
28ef0 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73  tion just writes
28f00 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
28f10 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
28f20 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79  f the.** already
28f30 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a   open file. .**.
28f40 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** Whether or no
28f50 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
28f60 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20  le is opened by 
28f70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74  this function, t
28f80 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a  he.** Pager.pInJ
28f90 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74  ournal bitvec st
28fa0 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
28fb0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ated..**.** Retu
28fc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
28fd0 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
28fe0 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77  ccessful. Otherw
28ff0 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  ise, return .** 
29000 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
29010 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61  the attempt to a
29020 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49  llocate Pager.pI
29030 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20  nJournal fails, 
29040 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72  or .** an IO err
29050 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69  or code if openi
29060 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
29070 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
29080 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
29090 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  int pager_open_j
290a0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
290b0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
290c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
290d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290e0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
290f0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  de */.  int nPag
29100 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
29110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29120 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61     /* Size of da
29130 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
29140 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
29150 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
29160 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c  er->pVfs;   /* L
29170 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66  ocal cache of vf
29180 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20  s pointer */..  
29190 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
291a0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
291b0 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72  ERVED );.  asser
291c0 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
291d0 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
291e0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
291f0 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
29200 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b  URNALMODE_OFF );
29210 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
29220 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
29230 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61   );.  .  /* If a
29240 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72  lready in the er
29250 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73 20  ror state, this 
29260 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
29270 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a  -op.  But on.  *
29280 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  * the other hand
29290 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
292a0 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69  s never called i
292b0 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79  f we are already
292c0 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f   in.  ** an erro
292d0 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66  r state. */.  if
292e0 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
292f0 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
29300 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
29310 65 3b 0a 0a 20 20 74 65 73 74 63 61 73 65 28 20  e;..  testcase( 
29320 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
29330 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d  lid==0 );.  rc =
29340 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
29350 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
29360 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  nPage);.  if( rc
29370 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
29380 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
29390 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  al = sqlite3Bitv
293a0 65 63 43 72 65 61 74 65 28 6e 50 61 67 65 29 3b  ecCreate(nPage);
293b0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70  .  if( pPager->p
293c0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a  InJournal==0 ){.
293d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
293e0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
293f0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
29400 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69  nal file if it i
29410 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
29420 65 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  en. */.  if( !is
29430 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
29440 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ) ){.    if( pPa
29450 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
29460 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
29470 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  ODE_MEMORY ){.  
29480 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f      sqlite3MemJo
29490 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72  urnalOpen(pPager
294a0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73  ->jfd);.    }els
294b0 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  e{.      const i
294c0 6e 74 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20  nt flags =      
294d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
294e0 56 46 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65  VFS flags to ope
294f0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  n journal file *
29500 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
29510 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
29520 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
29530 54 45 7c 0a 20 20 20 20 20 20 20 20 28 70 50 61  TE|.        (pPa
29540 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20  ger->tempFile ? 
29550 0a 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49  .          (SQLI
29560 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
29570 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45  CLOSE|SQLITE_OPE
29580 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a  N_TEMP_JOURNAL):
29590 0a 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49  .          (SQLI
295a0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
295b0 52 4e 41 4c 29 0a 20 20 20 20 20 20 20 20 29 3b  RNAL).        );
295c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
295d0 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
295e0 54 45 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  TE.      rc = sq
295f0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e  lite3JournalOpen
29600 28 0a 20 20 20 20 20 20 20 20 20 20 70 56 66 73  (.          pVfs
29610 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
29620 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
29630 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66   flags, jrnlBuff
29640 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20  erSize(pPager). 
29650 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20       );.#else.  
29660 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29670 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
29680 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
29690 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67  Pager->jfd, flag
296a0 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  s, 0);.#endif.  
296b0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
296c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
296d0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
296e0 6a 66 64 29 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20  jfd) );.  }...  
296f0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 72  /* Write the fir
29700 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
29710 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r to the journal
29720 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a   file and open .
29730 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75    ** the sub-jou
29740 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
29750 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  y..  */.  if( rc
29760 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
29770 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63     /* TODO: Chec
29780 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73  k if all of thes
29790 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71  e are really req
297a0 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 70 50  uired. */.    pP
297b0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
297c0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
297d0 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  e;.    pPager->j
297e0 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
297f0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  0;.    pPager->n
29800 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
29810 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
29820 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  0;.    pPager->j
29830 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
29840 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
29850 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 50  ster = 0;.    pP
29860 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
29870 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 77   = 0;.    rc = w
29880 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
29890 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
298a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
298b0 26 26 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  && pPager->nSave
298c0 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 72 63 20  point ){.    rc 
298d0 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  = openSubJournal
298e0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
298f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29900 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
29910 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
29920 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
29930 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  l);.    pPager->
29940 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
29950 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
29960 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
29970 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
29980 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69  ion on the speci
29990 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63  fied pager objec
299a0 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74  t. If a .** writ
299b0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e-transaction ha
299c0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  s already been o
299d0 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63  pened, this func
299e0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
299f0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
29a00 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73  Flag argument is
29a10 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71   false, then acq
29a20 75 69 72 65 20 61 74 20 6c 65 61 73 74 20 61 20  uire at least a 
29a30 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b  RESERVED.** lock
29a40 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
29a50 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67   file. If exFlag
29a60 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61   is true, then a
29a70 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a  cquire at least.
29a80 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ** an EXCLUSIVE 
29a90 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20  lock. If such a 
29aa0 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
29ab0 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67  held, no locking
29ac0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e   .** functions n
29ad0 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a  eed be called..*
29ae0 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20  *.** If this is 
29af0 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20  not a temporary 
29b00 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  or in-memory fil
29b10 65 20 61 6e 64 2c 20 74 68 65 20 6a 6f 75 72 6e  e and, the journ
29b20 61 6c 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 6f  al file is .** o
29b30 70 65 6e 65 64 20 69 66 20 69 74 20 68 61 73 20  pened if it has 
29b40 6e 6f 74 20 62 65 65 6e 20 61 6c 72 65 61 64 79  not been already
29b50 2e 20 46 6f 72 20 61 20 74 65 6d 70 6f 72 61 72  . For a temporar
29b60 79 20 66 69 6c 65 2c 20 74 68 65 20 6f 70 65 6e  y file, the open
29b70 69 6e 67 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6a  ing .** of the j
29b80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64  ournal file is d
29b90 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68  eferred until th
29ba0 65 72 65 20 69 73 20 61 6e 20 61 63 74 75 61 6c  ere is an actual
29bb0 20 6e 65 65 64 20 74 6f 20 0a 2a 2a 20 77 72 69   need to .** wri
29bc0 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
29bd0 6c 2e 20 54 4f 44 4f 3a 20 57 68 79 20 68 61 6e  l. TODO: Why han
29be0 64 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  dle temporary fi
29bf0 6c 65 73 20 64 69 66 66 65 72 65 6e 74 6c 79 3f  les differently?
29c00 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
29c10 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
29c20 65 6e 65 64 20 28 6f 72 20 69 66 20 69 74 20 69  ened (or if it i
29c30 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c  s already open),
29c40 20 74 68 65 6e 20 61 0a 2a 2a 20 6a 6f 75 72 6e   then a.** journ
29c50 61 6c 2d 68 65 61 64 65 72 20 69 73 20 77 72 69  al-header is wri
29c60 74 74 65 6e 20 74 6f 20 74 68 65 20 73 74 61 72  tten to the star
29c70 74 20 6f 66 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49  t of it..**.** I
29c80 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f  f the subjInMemo
29c90 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ry argument is n
29ca0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e  on-zero, then an
29cb0 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70  y sub-journal op
29cc0 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ened.** within t
29cd0 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  his transaction 
29ce0 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61  will be opened a
29cf0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  s an in-memory f
29d00 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73  ile. This.** has
29d10 20 6e 6f 20 65 66 66 65 63 74 20 69 66 20 74 68   no effect if th
29d20 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  e sub-journal is
29d30 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
29d40 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 77 68  (as it may be wh
29d50 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e  en.** running in
29d60 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29   exclusive mode)
29d70 20 6f 72 20 69 66 20 74 68 65 20 74 72 61 6e 73   or if the trans
29d80 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  action does not 
29d90 72 65 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62  require a.** sub
29da0 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65  -journal. If the
29db0 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72   subjInMemory ar
29dc0 67 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20  gument is zero, 
29dd0 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65  then any require
29de0 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d.** sub-journal
29df0 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
29e00 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61  in-memory if pPa
29e10 67 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  ger is an in-mem
29e20 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a  ory database, .*
29e30 2a 20 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d  * or using a tem
29e40 70 6f 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65  porary file othe
29e50 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rwise..*/.int sq
29e60 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
29e70 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
29e80 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73  nt exFlag, int s
29e90 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20  ubjInMemory){.  
29ea0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
29eb0 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  OK;.  assert( pP
29ec0 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
29ed0 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 70  ER_UNLOCK );.  p
29ee0 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d  Pager->subjInMem
29ef0 6f 72 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e  ory = (u8)subjIn
29f00 4d 65 6d 6f 72 79 3b 0a 20 20 69 66 28 20 70 50  Memory;.  if( pP
29f10 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
29f20 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  ER_SHARED ){.   
29f30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
29f40 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
29f50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  ;.    assert( !M
29f60 45 4d 44 42 20 26 26 20 21 70 50 61 67 65 72 2d  EMDB && !pPager-
29f70 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20  >tempFile );..  
29f80 20 20 69 66 28 20 70 61 67 65 72 55 73 65 4c 6f    if( pagerUseLo
29f90 67 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  g(pPager) ){.   
29fa0 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77     /* Grab the w
29fb0 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
29fc0 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75   log file. If su
29fd0 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64  ccessful, upgrad
29fe0 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41  e to.      ** PA
29ff0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 73 74  GER_EXCLUSIVE st
2a000 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
2a010 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
2a020 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
2a030 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  er..      ** The
2a040 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73   busy-handler is
2a050 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20   not invoked if 
2a060 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  another connecti
2a070 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20  on already.     
2a080 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72   ** holds the wr
2a090 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73  ite-lock. If pos
2a0a0 73 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72  sible, the upper
2a0b0 20 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c   layer will call
2a0c0 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   it..      */.  
2a0d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2a0e0 4c 6f 67 57 72 69 74 65 4c 6f 63 6b 28 70 50 61  LogWriteLock(pPa
2a0f0 67 65 72 2d 3e 70 4c 6f 67 2c 20 31 29 3b 0a 20  ger->pLog, 1);. 
2a100 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2a110 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2a120 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67    pPager->dbOrig
2a130 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
2a140 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 70  bSize;.        p
2a150 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
2a160 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20  AGER_RESERVED;. 
2a170 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2a180 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69  {.      /* Obtai
2a190 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
2a1a0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2a1b0 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65  e file. If the e
2a1c0 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a  xFlag parameter.
2a1d0 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65        ** is true
2a1e0 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65  , then immediate
2a1f0 6c 79 20 75 70 67 72 61 64 65 20 74 68 69 73 20  ly upgrade this 
2a200 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
2a210 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20  lock. The.      
2a220 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  ** busy-handler 
2a230 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20  callback can be 
2a240 75 73 65 64 20 77 68 65 6e 20 75 70 67 72 61 64  used when upgrad
2a250 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55  ing to the EXCLU
2a260 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  SIVE.      ** lo
2a270 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e  ck, but not when
2a280 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52   obtaining the R
2a290 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20  ESERVED lock..  
2a2a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2a2b0 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
2a2c0 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45  pPager->fd, RESE
2a2d0 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  RVED_LOCK);.    
2a2e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2a2f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
2a300 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
2a310 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20  AGER_RESERVED;. 
2a320 20 20 20 20 20 20 20 69 66 28 20 65 78 46 6c 61         if( exFla
2a330 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  g ){.          r
2a340 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
2a350 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
2a360 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
2a370 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a380 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2a390 4e 6f 20 6e 65 65 64 20 74 6f 20 6f 70 65 6e 20  No need to open 
2a3a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2a3b0 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20   at this time.  
2a3c0 49 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a  It will be.    *
2a3d0 2a 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  * opened before 
2a3e0 69 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  it is written to
2a3f0 2e 20 20 49 66 20 77 65 20 64 65 66 65 72 20 6f  .  If we defer o
2a400 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  pening the journ
2a410 61 6c 2c 0a 20 20 20 20 2a 2a 20 77 65 20 6d 69  al,.    ** we mi
2a420 67 68 74 20 73 61 76 65 20 74 68 65 20 77 6f 72  ght save the wor
2a430 6b 20 6f 66 20 63 72 65 61 74 69 6e 67 20 61 20  k of creating a 
2a440 66 69 6c 65 20 69 66 20 74 68 65 20 74 72 61 6e  file if the tran
2a450 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 65  saction.    ** e
2a460 6e 64 73 20 75 70 20 62 65 69 6e 67 20 61 20 6e  nds up being a n
2a470 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 7d  o-op..    */.  }
2a480 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e 28  else if( isOpen(
2a490 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
2a4a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2a4b0 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ff==0 ){.    /* 
2a4c0 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
2a4d0 6e 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  n the pager was 
2a4e0 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
2a4f0 65 73 73 20 6d 6f 64 65 20 74 68 65 20 6c 61 73  ess mode the las
2a500 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20 61 20  t.    ** time a 
2a510 28 72 65 61 64 20 6f 72 20 77 72 69 74 65 29 20  (read or write) 
2a520 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
2a530 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e  successfully con
2a540 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20 62 79  cluded.    ** by
2a550 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
2a560 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64 65 6c  . Instead of del
2a570 65 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  eting the journa
2a580 6c 20 66 69 6c 65 20 69 74 20 77 61 73 20 0a 20  l file it was . 
2a590 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20     ** kept open 
2a5a0 61 6e 64 20 65 69 74 68 65 72 20 77 61 73 20 74  and either was t
2a5b0 72 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79  runcated to 0 by
2a5c0 74 65 73 20 6f 72 20 69 74 73 20 68 65 61 64 65  tes or its heade
2a5d0 72 20 77 61 73 0a 20 20 20 20 2a 2a 20 6f 76 65  r was.    ** ove
2a5e0 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 7a 65  rwritten with ze
2a5f0 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ros..    */.    
2a600 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
2a610 4c 6f 67 28 70 50 61 67 65 72 29 3d 3d 30 20 29  Log(pPager)==0 )
2a620 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2a630 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b  ager->nRec==0 );
2a640 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2a650 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
2a660 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2a670 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
2a680 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72  rnal==0 );.    r
2a690 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
2a6a0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
2a6b0 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43    }..  PAGERTRAC
2a6c0 45 28 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20  E(("TRANSACTION 
2a6d0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
2a6e0 50 61 67 65 72 29 29 29 3b 0a 20 20 69 66 28 20  Pager)));.  if( 
2a6f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2a700 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
2a710 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
2a720 20 29 3b 0a 20 20 20 20 2f 2a 20 49 67 6e 6f 72   );.    /* Ignor
2a730 65 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 74  e any IO error t
2a740 68 61 74 20 6f 63 63 75 72 73 20 77 69 74 68 69  hat occurs withi
2a750 6e 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  n pager_end_tran
2a760 73 61 63 74 69 6f 6e 28 29 2e 20 54 68 65 0a 20  saction(). The. 
2a770 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 20 6f 66     ** purpose of
2a780 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f   this call is to
2a790 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65 72   reset the inter
2a7a0 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
2a7b0 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 73 75   pager.    ** su
2a7c0 62 2d 73 79 73 74 65 6d 2e 20 49 74 20 64 6f 65  b-system. It doe
2a7d0 73 6e 27 74 20 6d 61 74 74 65 72 20 69 66 20 74  sn't matter if t
2a7e0 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
2a7f0 69 73 20 6e 6f 74 20 70 72 6f 70 65 72 6c 79 0a  is not properly.
2a800 20 20 20 20 2a 2a 20 66 69 6e 61 6c 69 7a 65 64      ** finalized
2a810 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 28   at this point (
2a820 73 69 6e 63 65 20 69 74 20 69 73 20 6e 6f 74 20  since it is not 
2a830 61 20 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20  a valid journal 
2a840 66 69 6c 65 20 61 6e 79 77 61 79 29 2e 0a 20 20  file anyway)..  
2a850 20 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 65    */.    pager_e
2a860 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
2a870 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20  Pager, 0);.  }. 
2a880 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2a890 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67  *.** Mark a sing
2a8a0 6c 65 20 64 61 74 61 20 70 61 67 65 20 61 73 20  le data page as 
2a8b0 77 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70  writeable. The p
2a8c0 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
2a8d0 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e  nto the .** main
2a8e0 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d   journal or sub-
2a8f0 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69  journal as requi
2a900 72 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65  red. If the page
2a910 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
2a920 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a  .** one of the j
2a930 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72  ournals, the cor
2a940 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69  responding bit i
2a950 73 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a  s set in the .**
2a960 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
2a970 6c 20 62 69 74 76 65 63 20 61 6e 64 20 74 68 65  l bitvec and the
2a980 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
2a990 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74  pInSavepoint bit
2a9a0 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f  vecs.** of any o
2a9b0 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61  pen savepoints a
2a9c0 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a  s appropriate..*
2a9d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
2a9e0 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a  er_write(PgHdr *
2a9f0 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44  pPg){.  void *pD
2aa00 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
2aa10 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
2aa20 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
2aa30 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2aa40 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69  TE_OK;..  /* Thi
2aa50 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  s routine is not
2aa60 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61   called unless a
2aa70 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
2aa80 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20   already been.  
2aa90 2a 2a 20 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f  ** started..  */
2aaa0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2aab0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
2aac0 52 45 53 45 52 56 45 44 20 29 3b 0a 0a 20 20 2f  RESERVED );..  /
2aad0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  * If an error ha
2aae0 73 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c  s been previousl
2aaf0 79 20 64 65 74 65 63 74 65 64 2c 20 72 65 70 6f  y detected, repo
2ab00 72 74 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f  rt the same erro
2ab10 72 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 0a 20 20  r.  ** again..  
2ab20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
2ab30 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
2ab40 29 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  )  return pPager
2ab50 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a  ->errCode;..  /*
2ab60 20 48 69 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f   Higher-level ro
2ab70 75 74 69 6e 65 73 20 6e 65 76 65 72 20 63 61 6c  utines never cal
2ab80 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  l this function 
2ab90 69 66 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  if database is n
2aba0 6f 74 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c 65  ot.  ** writable
2abb0 2e 20 20 42 75 74 20 63 68 65 63 6b 20 61 6e 79  .  But check any
2abc0 77 61 79 2c 20 6a 75 73 74 20 66 6f 72 20 72 6f  way, just for ro
2abd0 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69  bustness. */.  i
2abe0 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
2abf0 3e 72 65 61 64 4f 6e 6c 79 29 20 29 20 72 65 74  >readOnly) ) ret
2ac00 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
2ac10 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
2ac20 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
2ac30 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28  ;..  CHECK_PAGE(
2ac40 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b  pPg);..  /* Mark
2ac50 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
2ac60 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ty.  If the page
2ac70 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
2ac80 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  n written.  ** t
2ac90 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  o the journal th
2aca0 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e  en we can return
2acb0 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a   right away..  *
2acc0 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  /.  sqlite3Pcach
2acd0 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b  eMakeDirty(pPg);
2ace0 0a 20 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75  .  if( pageInJou
2acf0 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21 73 75  rnal(pPg) && !su
2ad00 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
2ad10 50 67 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Pg) ){.    asser
2ad20 74 28 20 21 70 61 67 65 72 55 73 65 4c 6f 67 28  t( !pagerUseLog(
2ad30 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 70  pPager) );.    p
2ad40 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
2ad50 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 1;.  }else{.
2ad60 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65  .    /* If we ge
2ad70 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
2ad80 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
2ad90 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  ge needs to be. 
2ada0 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f     ** written to
2adb0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2adc0 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20   journal or the 
2add0 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  ckeckpoint journ
2ade0 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74  al.    ** or bot
2adf0 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  h..    **.    **
2ae00 20 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72 6f   Higher level ro
2ae10 75 74 69 6e 65 73 20 73 68 6f 75 6c 64 20 68 61  utines should ha
2ae20 76 65 20 61 6c 72 65 61 64 79 20 73 74 61 72 74  ve already start
2ae30 65 64 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ed a transaction
2ae40 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 6d  ,.    ** which m
2ae50 65 61 6e 73 20 74 68 65 79 20 68 61 76 65 20 61  eans they have a
2ae60 63 71 75 69 72 65 64 20 74 68 65 20 6e 65 63 65  cquired the nece
2ae70 73 73 61 72 79 20 6c 6f 63 6b 73 20 62 75 74 20  ssary locks but 
2ae80 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 20  the rollback.   
2ae90 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68   ** journal migh
2aea0 74 20 6e 6f 74 20 79 65 74 20 62 65 20 6f 70 65  t not yet be ope
2aeb0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  n..    */.    rc
2aec0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
2aed0 65 67 69 6e 28 70 50 61 67 65 72 2c 20 30 2c 20  egin(pPager, 0, 
2aee0 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65  pPager->subjInMe
2aef0 6d 6f 72 79 29 3b 0a 20 20 20 20 69 66 28 20 72  mory);.    if( r
2af00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2af10 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2af20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
2af30 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2af40 66 64 29 20 0a 20 20 20 20 20 26 26 20 70 50 61  fd) .     && pPa
2af50 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2af60 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
2af70 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 26 26  ODE_OFF .     &&
2af80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2af90 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
2afa0 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
2afb0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2afc0 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
2afd0 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20 72 63  rnal );.      rc
2afe0 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
2aff0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
2b000 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2b010 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
2b020 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  rc;.    }.    pP
2b030 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
2b040 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20   = 1;.  .    /* 
2b050 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  The transaction 
2b060 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73  journal now exis
2b070 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61  ts and we have a
2b080 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a   RESERVED or an.
2b090 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
2b0a0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69   lock on the mai
2b0b0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
2b0c0 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72    Write the curr
2b0d0 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20  ent page to.    
2b0e0 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
2b0f0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74  on journal if it
2b100 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
2b110 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
2b120 20 20 69 66 28 20 21 70 61 67 65 49 6e 4a 6f 75    if( !pageInJou
2b130 72 6e 61 6c 28 70 50 67 29 20 26 26 20 69 73 4f  rnal(pPg) && isO
2b140 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2b150 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2b160 28 20 21 70 61 67 65 72 55 73 65 4c 6f 67 28 70  ( !pagerUseLog(p
2b170 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
2b180 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  if( pPg->pgno<=p
2b190 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
2b1a0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32  e ){.        u32
2b1b0 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20   cksum;.        
2b1c0 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20  char *pData2;.. 
2b1d0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f         /* We sho
2b1e0 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20  uld never write 
2b1f0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
2b200 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61  ile the page tha
2b210 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  t.        ** con
2b220 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61  tains the databa
2b230 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66  se locks.  The f
2b240 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
2b250 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20  verifies.       
2b260 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
2b270 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ot. */.        a
2b280 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f  ssert( pPg->pgno
2b290 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
2b2a0 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20  pPager) );..    
2b2b0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2b2c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
2b2d0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
2b2e0 6c 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 20 20  lOff );.        
2b2f0 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
2b300 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
2b310 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   7, return SQLIT
2b320 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29  E_NOMEM, pData2)
2b330 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20  ;.        cksum 
2b340 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  = pager_cksum(pP
2b350 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61  ager, (u8*)pData
2b360 32 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  2);.        rc =
2b370 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
2b380 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
2b390 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50  ->journalOff, pP
2b3a0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
2b3b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2b3c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2b3d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
2b3e0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
2b3f0 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
2b400 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
2b410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b420 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
2b430 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 20 34  ->journalOff + 4
2b440 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
2b450 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
2b460 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
2b470 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20 20 7d  ize+4;.        }
2b480 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
2b490 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b4a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
2b4b0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
2b4c0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
2b4d0 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d 29  urnalOff, cksum)
2b4e0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
2b4f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
2b500 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 4;.        }. 
2b510 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
2b520 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64  "JOUT %p %d %lld
2b530 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
2b540 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  pPg->pgno, .    
2b550 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
2b560 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
2b570 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
2b580 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  e));.        PAG
2b590 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
2b5a0 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75  pager_writej_cou
2b5b0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  nt);.        PAG
2b5c0 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41  ERTRACE(("JOURNA
2b5d0 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  L %d page %d nee
2b5e0 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30  dSync=%d hash(%0
2b5f0 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
2b600 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
2b610 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
2b620 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28   .             (
2b630 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
2b640 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
2b650 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ), pager_pagehas
2b660 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20 20 20  h(pPg)));..     
2b670 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e     /* Even if an
2b680 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20   IO or diskfull 
2b690 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 77  error occurred w
2b6a0 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  hile journalling
2b6b0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
2b6c0 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f 63  page in the bloc
2b6d0 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68 65  k above, set the
2b6e0 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67 20   need-sync flag 
2b6f0 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20 20  for the page..  
2b700 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69        ** Otherwi
2b710 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72 61  se, when the tra
2b720 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
2b730 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67  ed back, the log
2b740 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ic in.        **
2b750 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61   playback_one_pa
2b760 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20  ge() will think 
2b770 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
2b780 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72  eds to be restor
2b790 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  ed.        ** in
2b7a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b7b0 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f  le. And if an IO
2b7c0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
2b7d0 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20  ile doing so,.  
2b7e0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 6f        ** then co
2b7f0 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c  rruption may fol
2b800 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  low..        */.
2b810 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
2b820 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
2b830 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c           pPg->fl
2b840 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
2b850 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20  D_SYNC;.        
2b860 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
2b870 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
2b880 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  }..        /* An
2b890 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
2b8a0 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74  red writing to t
2b8b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
2b8c0 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   The .        **
2b8d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
2b8e0 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l be rolled back
2b8f0 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61 62   by the layer ab
2b900 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ove..        */.
2b910 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2b920 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b930 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2b940 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
2b950 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
2b960 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  c++;.        ass
2b970 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
2b980 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
2b990 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2b9a0 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
2b9b0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
2b9c0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
2b9d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
2b9e0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
2b9f0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2ba00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ba10 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
2ba20 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 72  MEM );.        r
2ba30 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  c |= addToSavepo
2ba40 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
2ba50 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
2ba60 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2ba70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ba80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
2ba90 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
2baa0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
2bab0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
2bac0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2bad0 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
2bae0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
2baf0 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  d && !pPager->no
2bb00 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
2bb10 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
2bb20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
2bb30 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
2bb40 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
2bb50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2bb60 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2bb70 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
2bb80 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
2bb90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2bba0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
2bbb0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20  ), pPg->pgno,.  
2bbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70               ((p
2bbd0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2bbe0 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29  NEED_SYNC)?1:0))
2bbf0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2bc00 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
2bc10 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
2bc20 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  nal is open and 
2bc30 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
2bc40 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68  in it,.    ** th
2bc50 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72  en write the cur
2bc60 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65  rent page to the
2bc70 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
2bc80 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  al.  Note that. 
2bc90 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d     ** the statem
2bca0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ent journal form
2bcb0 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  at differs from 
2bcc0 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75  the standard jou
2bcd0 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20  rnal format.    
2bce0 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d  ** in that it om
2bcf0 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d  its the checksum
2bd00 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72  s and the header
2bd10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2bd20 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
2bd30 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20  e(pPg) ){.      
2bd40 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
2bd50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  age(pPg);.    }.
2bd60 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
2bd70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
2bd80 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ze and return.. 
2bd90 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
2bda0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
2bdb0 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69  ER_SHARED );.  i
2bdc0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
2bdd0 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20  e<pPg->pgno ){. 
2bde0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
2bdf0 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  e = pPg->pgno;. 
2be00 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2be10 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
2be20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
2be30 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72 6f 75  teable. This rou
2be40 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c  tine must be cal
2be50 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20 6d  led before .** m
2be60 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f  aking changes to
2be70 20 61 20 70 61 67 65 2e 20 54 68 65 20 63 61 6c   a page. The cal
2be80 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b 20 74  ler must check t
2be90 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
2bea0 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75 6e 63  .** of this func
2beb0 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61 72 65  tion and be care
2bec0 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61 6e 67  ful not to chang
2bed0 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
2bee0 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69 73 20  unless .** this 
2bef0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
2bf00 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
2bf10 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
2bf20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e  between this fun
2bf30 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f  ction and pager_
2bf40 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74 20  write() is that 
2bf50 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
2bf60 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68   also deals with
2bf70 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
2bf80 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72  e where 2 or mor
2bf90 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f  e pages.** fit o
2bfa0 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20  n a single disk 
2bfb0 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20  sector. In this 
2bfc0 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69  case all co-resi
2bfd0 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75  dent pages.** mu
2bfe0 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  st have been wri
2bff0 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
2c000 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20  nal file before 
2c010 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
2c020 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2c030 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  urs, SQLITE_NOME
2c040 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  M or an IO error
2c050 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2c060 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70 72 69  d.** as appropri
2c070 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
2c080 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
2c090 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
2c0a0 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  ite(DbPage *pDbP
2c0b0 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
2c0c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50   SQLITE_OK;..  P
2c0d0 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50  gHdr *pPg = pDbP
2c0e0 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  age;.  Pager *pP
2c0f0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
2c100 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  er;.  Pgno nPage
2c110 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61  PerSector = (pPa
2c120 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f  ger->sectorSize/
2c130 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
2c140 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67 65 50  );..  if( nPageP
2c150 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20  erSector>1 ){.  
2c160 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e    Pgno nPageCoun
2c170 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
2c180 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
2c190 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
2c1a0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e   file */.    Pgn
2c1b0 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20  o pg1;          
2c1c0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
2c1d0 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74  page of the sect
2c1e0 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65  or pPg is locate
2c1f0 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  d on. */.    int
2c200 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
2c210 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2c220 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69   of pages starti
2c230 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75  ng at pg1 to jou
2c240 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rnal */.    int 
2c250 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
2c260 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2c270 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  unter */.    int
2c280 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 20   needSync = 0;  
2c290 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2c2a0 66 20 61 6e 79 20 70 61 67 65 20 68 61 73 20 50  f any page has P
2c2b0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a  GHDR_NEED_SYNC *
2c2c0 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  /..    /* Set th
2c2d0 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67  e doNotSync flag
2c2e0 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62   to 1. This is b
2c2f0 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74  ecause we cannot
2c300 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c   allow a journal
2c310 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74  .    ** header t
2c320 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 74  o be written bet
2c330 77 65 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a  ween the pages j
2c340 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68 69 73  ournaled by this
2c350 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a   function..    *
2c360 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  /.    assert( !M
2c370 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65  EMDB );.    asse
2c380 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
2c390 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  tSync==0 );.    
2c3a0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
2c3b0 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54  c = 1;..    /* T
2c3c0 68 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65  his trick assume
2c3d0 73 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20  s that both the 
2c3e0 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
2c3f0 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20  ctor-size are.  
2c400 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20    ** an integer 
2c410 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73  power of 2. It s
2c420 65 74 73 20 76 61 72 69 61 62 6c 65 20 70 67 31  ets variable pg1
2c430 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69   to the identifi
2c440 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  er.    ** of the
2c450 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
2c460 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73  he sector pPg is
2c470 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20   located on..   
2c480 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28   */.    pg1 = ((
2c490 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e  pPg->pgno-1) & ~
2c4a0 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  (nPagePerSector-
2c4b0 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 72 63  1)) + 1;..    rc
2c4c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
2c4d0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
2c4e0 20 28 69 6e 74 20 2a 29 26 6e 50 61 67 65 43 6f   (int *)&nPageCo
2c4f0 75 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  unt);.    if( rc
2c500 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2c510 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e    if( pPg->pgno>
2c520 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
2c530 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67      nPage = (pPg
2c540 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b  ->pgno - pg1)+1;
2c550 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
2c560 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74  pg1+nPagePerSect
2c570 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74  or-1)>nPageCount
2c580 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
2c590 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70  = nPageCount+1-p
2c5a0 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g1;.    }else{. 
2c5b0 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
2c5c0 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20  gePerSector;.   
2c5d0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50   }.    assert(nP
2c5e0 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65  age>0);.    asse
2c5f0 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e  rt(pg1<=pPg->pgn
2c600 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28  o);.    assert((
2c610 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e  pg1+nPage)>pPg->
2c620 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28  pgno);..    for(
2c630 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26  ii=0; ii<nPage &
2c640 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
2c650 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67   ii++){.      Pg
2c660 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a  no pg = pg1+ii;.
2c670 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
2c680 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67  ge;.      if( pg
2c690 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21  ==pPg->pgno || !
2c6a0 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
2c6b0 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
2c6c0 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20  rnal, pg) ){.   
2c6d0 20 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47       if( pg!=PAG
2c6e0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
2c6f0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
2c700 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2c710 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c  rGet(pPager, pg,
2c720 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &pPage);.      
2c730 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2c740 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2c750 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
2c760 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
2c770 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
2c780 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  age->flags&PGHDR
2c790 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20  _NEED_SYNC ){.  
2c7a0 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 65 64              need
2c7b0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
2c7c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
2c7d0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29  Pager->needSync)
2c7e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2c7f0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2c800 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
2c810 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2c820 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2c830 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61    }else if( (pPa
2c840 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ge = pager_looku
2c850 70 28 70 50 61 67 65 72 2c 20 70 67 29 29 21 3d  p(pPager, pg))!=
2c860 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
2c870 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47   pPage->flags&PG
2c880 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
2c890 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53  .          needS
2c8a0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
2c8b0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
2c8c0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
2c8d0 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
2c8e0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
2c8f0 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
2c900 43 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f  C flag is set fo
2c910 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61  r any of the nPa
2c920 67 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a  ge pages .    **
2c930 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31   starting at pg1
2c940 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20  , then it needs 
2c950 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c  to be set for al
2c960 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75  l of them. Becau
2c970 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e  se.    ** writin
2c980 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73  g to any of thes
2c990 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61  e nPage pages ma
2c9a0 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68  y damage the oth
2c9b0 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20  ers, the.    ** 
2c9c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
2c9d0 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29  t contain sync()
2c9e0 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c  ed copies of all
2c9f0 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20   of them.    ** 
2ca00 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68  before any of th
2ca10 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  em can be writte
2ca20 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  n out to the dat
2ca30 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
2ca40 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
2ca50 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 65 65 64  QLITE_OK && need
2ca60 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73  Sync ){.      as
2ca70 73 65 72 74 28 20 21 4d 45 4d 44 42 20 26 26 20  sert( !MEMDB && 
2ca80 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d  pPager->noSync==
2ca90 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  0 );.      for(i
2caa0 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 3b 20 69  i=0; ii<nPage; i
2cab0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50 67  i++){.        Pg
2cac0 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61 67  Hdr *pPage = pag
2cad0 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
2cae0 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20 20  , pg1+ii);.     
2caf0 20 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a     if( pPage ){.
2cb00 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d            pPage-
2cb10 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
2cb20 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20  NEED_SYNC;.     
2cb30 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
2cb40 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
2cb50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2cb60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50  .      assert(pP
2cb70 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b  ager->needSync);
2cb80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
2cb90 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
2cba0 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20  tSync==1 );.    
2cbb0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
2cbc0 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
2cbd0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
2cbe0 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
2cbf0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2cc00 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2cc10 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65  TRUE if the page
2cc20 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
2cc30 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69  gument was previ
2cc40 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20  ously passed.** 
2cc50 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
2cc60 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65  rite().  In othe
2cc70 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
2cc80 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b  TRUE if it is ok
2cc90 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
2cca0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
2ccb0 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65   page..*/.#ifnde
2ccc0 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  f NDEBUG.int sql
2ccd0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2cce0 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67  able(DbPage *pPg
2ccf0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  ){.  return pPg-
2cd00 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
2cd10 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TY;.}.#endif../*
2cd20 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
2cd30 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
2cd40 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
2cd50 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
2cd60 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20  ary to.** write 
2cd70 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
2cd80 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63 6b  on page pPg back
2cd90 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76   to the disk, ev
2cda0 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61  en though.** tha
2cdb0 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20  t page might be 
2cdc0 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
2cdd0 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20    This happens, 
2cde0 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
2cdf0 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 68 61  n.** the page ha
2ce00 73 20 62 65 65 6e 20 61 64 64 65 64 20 61 73 20  s been added as 
2ce10 61 20 6c 65 61 66 20 6f 66 20 74 68 65 20 66 72  a leaf of the fr
2ce20 65 65 6c 69 73 74 20 61 6e 64 20 73 6f 20 69 74  eelist and so it
2ce30 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20  s.** content no 
2ce40 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72 73 2e 0a  longer matters..
2ce50 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79  **.** The overly
2ce60 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79  ing software lay
2ce70 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
2ce80 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f  utine when all o
2ce90 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e  f the data.** on
2cea0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
2ceb0 69 73 20 75 6e 75 73 65 64 2e 20 54 68 65 20 70  is unused. The p
2cec0 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70  ager marks the p
2ced0 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a  age as clean so.
2cee0 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  ** that it does 
2cef0 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20  not get written 
2cf00 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54  to disk..**.** T
2cf10 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74  ests show that t
2cf20 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
2cf30 20 63 61 6e 20 71 75 61 64 72 75 70 6c 65 20 74   can quadruple t
2cf40 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67  he speed of larg
2cf50 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20 6f 70 65  e .** DELETE ope
2cf60 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64  rations..*/.void
2cf70 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
2cf80 74 57 72 69 74 65 28 50 67 48 64 72 20 2a 70 50  tWrite(PgHdr *pP
2cf90 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
2cfa0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
2cfb0 72 3b 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66  r;.  if( (pPg->f
2cfc0 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
2cfd0 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53 61  ) && pPager->nSa
2cfe0 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20 20  vepoint==0 ){.  
2cff0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 44    PAGERTRACE(("D
2d000 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25  ONT_WRITE page %
2d010 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d  d of %d\n", pPg-
2d020 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
2d030 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 49 4f  Pager)));.    IO
2d040 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70  TRACE(("CLEAN %p
2d050 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
2d060 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20  pPg->pgno)).    
2d070 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
2d080 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b 0a  HDR_DONT_WRITE;.
2d090 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
2d0a0 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
2d0b0 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
2d0c0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
2d0d0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a  );.#endif.  }.}.
2d0e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2d0f0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
2d100 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   increment the v
2d110 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61  alue of the data
2d120 62 61 73 65 20 66 69 6c 65 20 0a 2a 2a 20 63 68  base file .** ch
2d130 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 20 73 74  ange-counter, st
2d140 6f 72 65 64 20 61 73 20 61 20 34 2d 62 79 74 65  ored as a 4-byte
2d150 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
2d160 67 65 72 20 73 74 61 72 74 69 6e 67 20 61 74 20  ger starting at 
2d170 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73 65 74 20  .** byte offset 
2d180 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  24 of the pager 
2d190 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  file..**.** If t
2d1a0 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20  he isDirectMode 
2d1b0 66 6c 61 67 20 69 73 20 7a 65 72 6f 2c 20 74 68  flag is zero, th
2d1c0 65 6e 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20  en this is done 
2d1d0 62 79 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73  by calling .** s
2d1e0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2d1f0 28 29 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68  () on page 1, th
2d200 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  en modifying the
2d210 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d220 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 20 49  .** page data. I
2d230 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
2d240 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 70 64  file will be upd
2d250 61 74 65 64 20 77 68 65 6e 20 74 68 65 20 63 75  ated when the cu
2d260 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  rrent.** transac
2d270 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
2d280 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44  d..**.** The isD
2d290 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 6d  irectMode flag m
2d2a0 61 79 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a  ay only be non-z
2d2b0 65 72 6f 20 69 66 20 74 68 65 20 6c 69 62 72 61  ero if the libra
2d2c0 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a  ry was compiled.
2d2d0 2a 2a 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ** with the SQLI
2d2e0 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
2d2f0 5f 57 52 49 54 45 20 6d 61 63 72 6f 20 64 65 66  _WRITE macro def
2d300 69 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ined. In this ca
2d310 73 65 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72 65  se,.** if isDire
2d320 63 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ct is non-zero, 
2d330 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  then the databas
2d340 65 20 66 69 6c 65 20 69 73 20 75 70 64 61 74 65  e file is update
2d350 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79  d directly.** by
2d360 20 77 72 69 74 69 6e 67 20 61 6e 20 75 70 64 61   writing an upda
2d370 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70  ted version of p
2d380 61 67 65 20 31 20 75 73 69 6e 67 20 61 20 63 61  age 1 using a ca
2d390 6c 6c 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71  ll to the .** sq
2d3a0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 66  lite3OsWrite() f
2d3b0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
2d3c0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63  ic int pager_inc
2d3d0 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
2d3e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
2d3f0 6e 74 20 69 73 44 69 72 65 63 74 4d 6f 64 65 29  nt isDirectMode)
2d400 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2d410 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 44 65  ITE_OK;..  /* De
2d420 63 6c 61 72 65 20 61 6e 64 20 69 6e 69 74 69 61  clare and initia
2d430 6c 69 7a 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e  lize constant in
2d440 74 65 67 65 72 20 27 69 73 44 69 72 65 63 74 27  teger 'isDirect'
2d450 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 61 74  . If the.  ** at
2d460 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
2d470 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c  ization is enabl
2d480 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  ed in this build
2d490 2c 20 74 68 65 6e 20 69 73 44 69 72 65 63 74 0a  , then isDirect.
2d4a0 20 20 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 69    ** is initiali
2d4b0 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65  zed to the value
2d4c0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 69   passed as the i
2d4d0 73 44 69 72 65 63 74 4d 6f 64 65 20 70 61 72 61  sDirectMode para
2d4e0 6d 65 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68  meter.  ** to th
2d4f0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68  is function. Oth
2d500 65 72 77 69 73 65 2c 20 69 74 20 69 73 20 61 6c  erwise, it is al
2d510 77 61 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  ways set to zero
2d520 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
2d530 69 64 65 61 20 69 73 20 74 68 61 74 20 69 66 20  idea is that if 
2d540 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
2d550 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
2d560 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61 62 6c 65   not.  ** enable
2d570 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  d at compile tim
2d580 65 2c 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  e, the compiler 
2d590 63 61 6e 20 6f 6d 69 74 20 74 68 65 20 74 65 73  can omit the tes
2d5a0 74 73 20 6f 66 0a 20 20 2a 2a 20 27 69 73 44 69  ts of.  ** 'isDi
2d5b0 72 65 63 74 27 20 62 65 6c 6f 77 2c 20 61 73 20  rect' below, as 
2d5c0 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6c 6f 63  well as the bloc
2d5d0 6b 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 74 68  k enclosed in th
2d5e0 65 0a 20 20 2a 2a 20 22 69 66 28 20 69 73 44 69  e.  ** "if( isDi
2d5f0 72 65 63 74 20 29 22 20 63 6f 6e 64 69 74 69 6f  rect )" conditio
2d600 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  n..  */.#ifndef 
2d610 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
2d620 4f 4d 49 43 5f 57 52 49 54 45 0a 23 20 64 65 66  OMIC_WRITE.# def
2d630 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20  ine DIRECT_MODE 
2d640 30 0a 20 20 61 73 73 65 72 74 28 20 69 73 44 69  0.  assert( isDi
2d650 72 65 63 74 4d 6f 64 65 3d 3d 30 20 29 3b 0a 20  rectMode==0 );. 
2d660 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2d670 52 28 69 73 44 69 72 65 63 74 4d 6f 64 65 29 3b  R(isDirectMode);
2d680 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
2d690 44 49 52 45 43 54 5f 4d 4f 44 45 20 69 73 44 69  DIRECT_MODE isDi
2d6a0 72 65 63 74 4d 6f 64 65 0a 23 65 6e 64 69 66 0a  rectMode.#endif.
2d6b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2d6c0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
2d6d0 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 69 66  RESERVED );.  if
2d6e0 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  ( !pPager->chang
2d6f0 65 43 6f 75 6e 74 44 6f 6e 65 20 26 26 20 70 50  eCountDone && pP
2d700 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29  ager->dbSize>0 )
2d710 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
2d720 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Hdr;            
2d730 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65      /* Reference
2d740 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20   to page 1 */.  
2d750 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
2d760 6e 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  nter;           
2d770 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65  /* Initial value
2d780 20 6f 66 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74   of change-count
2d790 65 72 20 66 69 65 6c 64 20 2a 2f 0a 0a 20 20 20  er field */..   
2d7a0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
2d7b0 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 69 73  ->tempFile && is
2d7c0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2d7d0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e   );..    /* Open
2d7e0 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66   page 1 of the f
2d7f0 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ile for writing.
2d800 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2d810 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
2d820 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29  ger, 1, &pPgHdr)
2d830 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2d840 67 48 64 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  gHdr==0 || rc==S
2d850 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20  QLITE_OK );..   
2d860 20 2f 2a 20 49 66 20 70 61 67 65 20 6f 6e 65 20   /* If page one 
2d870 77 61 73 20 66 65 74 63 68 65 64 20 73 75 63 63  was fetched succ
2d880 65 73 73 66 75 6c 6c 79 2c 20 61 6e 64 20 74 68  essfully, and th
2d890 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  is function is n
2d8a0 6f 74 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  ot.    ** operat
2d8b0 69 6e 67 20 69 6e 20 64 69 72 65 63 74 2d 6d 6f  ing in direct-mo
2d8c0 64 65 2c 20 6d 61 6b 65 20 70 61 67 65 20 31 20  de, make page 1 
2d8d0 77 72 69 74 61 62 6c 65 2e 20 20 57 68 65 6e 20  writable.  When 
2d8e0 6e 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 64  not in .    ** d
2d8f0 69 72 65 63 74 20 6d 6f 64 65 2c 20 70 61 67 65  irect mode, page
2d900 20 31 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c   1 is always hel
2d910 64 20 69 6e 20 63 61 63 68 65 20 61 6e 64 20 68  d in cache and h
2d920 65 6e 63 65 20 74 68 65 20 50 61 67 65 72 47 65  ence the PagerGe
2d930 74 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  t().    ** above
2d940 20 69 73 20 61 6c 77 61 79 73 20 73 75 63 63 65   is always succe
2d950 73 73 66 75 6c 20 2d 20 68 65 6e 63 65 20 74 68  ssful - hence th
2d960 65 20 41 4c 57 41 59 53 20 6f 6e 20 72 63 3d 3d  e ALWAYS on rc==
2d970 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 20 20 2a  SQLITE_OK..    *
2d980 2f 0a 20 20 20 20 69 66 28 20 21 44 49 52 45 43  /.    if( !DIREC
2d990 54 5f 4d 4f 44 45 20 26 26 20 41 4c 57 41 59 53  T_MODE && ALWAYS
2d9a0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  (rc==SQLITE_OK) 
2d9b0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
2d9c0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2d9d0 70 50 67 48 64 72 29 3b 0a 20 20 20 20 7d 0a 0a  pPgHdr);.    }..
2d9e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2d9f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
2da00 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
2da10 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20  value just read 
2da20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63  and write it bac
2da30 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f  k to byte 24. */
2da40 0a 20 20 20 20 20 20 63 68 61 6e 67 65 5f 63 6f  .      change_co
2da50 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47  unter = sqlite3G
2da60 65 74 34 62 79 74 65 28 28 75 38 2a 29 70 50 61  et4byte((u8*)pPa
2da70 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
2da80 3b 0a 20 20 20 20 20 20 63 68 61 6e 67 65 5f 63  ;.      change_c
2da90 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20  ounter++;.      
2daa0 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
2dab0 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29  *)pPgHdr->pData)
2dac0 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e  +24, change_coun
2dad0 74 65 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ter);..      /* 
2dae0 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65 20 53  Also store the S
2daf0 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75  QLite version nu
2db00 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20 39 36  mber in bytes 96
2db10 2e 2e 39 39 20 2a 2f 0a 20 20 20 20 20 20 70 75  ..99 */.      pu
2db20 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
2db30 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 39  pPgHdr->pData)+9
2db40 36 2c 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f  6, SQLITE_VERSIO
2db50 4e 5f 4e 55 4d 42 45 52 29 3b 0a 0a 20 20 20 20  N_NUMBER);..    
2db60 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20    /* If running 
2db70 69 6e 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20  in direct mode, 
2db80 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  write the conten
2db90 74 73 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20  ts of page 1 to 
2dba0 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  the file. */.   
2dbb0 20 20 20 69 66 28 20 44 49 52 45 43 54 5f 4d 4f     if( DIRECT_MO
2dbc0 44 45 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  DE ){.        co
2dbd0 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 20 3d  nst void *zBuf =
2dbe0 20 70 50 67 48 64 72 2d 3e 70 44 61 74 61 3b 0a   pPgHdr->pData;.
2dbf0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2dc00 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
2dc10 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ze>0 );.        
2dc20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
2dc30 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
2dc40 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61  zBuf, pPager->pa
2dc50 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20  geSize, 0);.    
2dc60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2dc70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2dc80 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
2dc90 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a  eCountDone = 1;.
2dca0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2dcb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
2dcc0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
2dcd0 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20  ntDone = 1;.    
2dce0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
2dcf0 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61  * Release the pa
2dd00 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f  ge reference. */
2dd10 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
2dd20 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a  rUnref(pPgHdr);.
2dd30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2dd40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
2dd50 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 74 6f  he pager file to
2dd60 20 64 69 73 6b 2e 20 54 68 69 73 20 69 73 20 61   disk. This is a
2dd70 20 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d 65   no-op for in-me
2dd80 6d 6f 72 79 20 66 69 6c 65 73 0a 2a 2a 20 6f 72  mory files.** or
2dd90 20 70 61 67 65 73 20 77 69 74 68 20 74 68 65 20   pages with the 
2dda0 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61  Pager.noSync fla
2ddb0 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  g set..**.** If 
2ddc0 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 63  successful, or c
2ddd0 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67 65 72  alled on a pager
2dde0 20 66 6f 72 20 77 68 69 63 68 20 69 74 20 69 73   for which it is
2ddf0 20 61 20 6e 6f 2d 6f 70 2c 20 74 68 69 73 0a 2a   a no-op, this.*
2de00 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
2de10 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74  ns SQLITE_OK. Ot
2de20 68 65 72 77 69 73 65 2c 20 61 6e 20 49 4f 20 65  herwise, an IO e
2de30 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2de40 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
2de50 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 50  lite3PagerSync(P
2de60 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2de70 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2de80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de90 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2dea0 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  code */.  assert
2deb0 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66  ( !MEMDB );.  if
2dec0 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
2ded0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
2dee0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
2def0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2df00 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
2df10 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
2df20 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 72  _flags);.  }.  r
2df30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2df40 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  ** Sync the data
2df50 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
2df60 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20  e pager pPager. 
2df70 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
2df80 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66  o the name.** of
2df90 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
2dfa0 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
2dfb0 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
2dfc0 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  to the individua
2dfd0 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  l.** journal fil
2dfe0 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62  e. zMaster may b
2dff0 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73  e NULL, which is
2e000 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
2e010 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  no master.** jou
2e020 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64  rnal (a single d
2e030 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
2e040 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ion)..**.** This
2e050 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73   routine ensures
2e060 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   that:.**.**   *
2e070 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
2e080 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  le change-counte
2e090 72 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a  r is updated,.**
2e0a0 20 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c     * the journal
2e0b0 20 69 73 20 73 79 6e 63 65 64 20 28 75 6e 6c 65   is synced (unle
2e0c0 73 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ss the atomic-wr
2e0d0 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
2e0e0 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20 20 20   is used),.**   
2e0f0 2a 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  * all dirty page
2e100 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f  s are written to
2e110 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e120 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68 65 20  le, .**   * the 
2e130 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
2e140 20 74 72 75 6e 63 61 74 65 64 20 28 69 66 20 72   truncated (if r
2e150 65 71 75 69 72 65 64 29 2c 20 61 6e 64 0a 2a 2a  equired), and.**
2e160 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
2e170 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 0a  e file synced. .
2e180 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74  **.** The only t
2e190 68 69 6e 67 20 74 68 61 74 20 72 65 6d 61 69 6e  hing that remain
2e1a0 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20  s to commit the 
2e1b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74  transaction is t
2e1c0 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20 28  o finalize .** (
2e1d0 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74 65  delete, truncate
2e1e0 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 66 69 72   or zero the fir
2e1f0 73 74 20 70 61 72 74 20 6f 66 29 20 74 68 65 20  st part of) the 
2e200 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72  journal file (or
2e210 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20   .** delete the 
2e220 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
2e230 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64  ile if specified
2e240 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  )..**.** Note th
2e250 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e  at if zMaster==N
2e260 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e  ULL, this does n
2e270 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70  ot overwrite a p
2e280 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a  revious value.**
2e290 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71   passed to an sq
2e2a0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
2e2b0 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e  PhaseOne() call.
2e2c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
2e2d0 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 2d 20  nal parameter - 
2e2e0 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72 75 65  noSync - is true
2e2f0 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62  , then the datab
2e300 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 0a  ase file itself.
2e310 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64  ** is not synced
2e320 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  . The caller mus
2e330 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  t call sqlite3Pa
2e340 67 65 72 53 79 6e 63 28 29 20 64 69 72 65 63 74  gerSync() direct
2e350 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68  ly to.** sync th
2e360 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2e370 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43  before calling C
2e380 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
2e390 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a  to delete the.**
2e3a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
2e3b0 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69   this case..*/.i
2e3c0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
2e3d0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a 20  ommitPhaseOne(. 
2e3e0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
2e3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e400 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
2e410 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2e420 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20 20 20   *zMaster,      
2e430 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20        /* If not 
2e440 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74 65 72  NULL, the master
2e450 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f   journal name */
2e460 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20 20 20  .  int noSync   
2e470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e480 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d     /* True to om
2e490 69 74 20 74 68 65 20 78 53 79 6e 63 20 6f 6e 20  it the xSync on 
2e4a0 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a 29  the db file */.)
2e4b0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2e4c0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2e4d0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2e4e0 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  de */..  /* The 
2e4f0 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 6e 65  dbOrigSize is ne
2e500 76 65 72 20 73 65 74 20 69 66 20 6a 6f 75 72 6e  ver set if journ
2e510 61 6c 5f 6d 6f 64 65 3d 4f 46 46 20 2a 2f 0a 20  al_mode=OFF */. 
2e520 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2e530 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
2e540 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2e550 4f 46 46 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  OFF || pPager->d
2e560 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29 3b 0a  bOrigSize==0 );.
2e570 0a 20 20 2f 2a 20 49 66 20 61 20 70 72 69 6f 72  .  /* If a prior
2e580 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
2e590 20 72 65 70 6f 72 74 20 74 68 61 74 20 65 72 72   report that err
2e5a0 6f 72 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 69  or again. */.  i
2e5b0 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
2e5c0 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75  >errCode) ) retu
2e5d0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
2e5e0 64 65 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43  de;..  PAGERTRAC
2e5f0 45 28 28 22 44 41 54 41 42 41 53 45 20 53 59 4e  E(("DATABASE SYN
2e600 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74  C: File=%s zMast
2e610 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e  er=%s nSize=%d\n
2e620 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  ", .      pPager
2e630 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61  ->zFilename, zMa
2e640 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62  ster, pPager->db
2e650 53 69 7a 65 29 29 3b 0a 0a 20 20 69 66 28 20 4d  Size));..  if( M
2e660 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
2e670 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a 20 20  dbModified ){.  
2e680 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
2e690 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c  an in-memory db,
2e6a0 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76   or no pages hav
2e6b0 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
2e6c0 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 20 20 2a  o, or this.    *
2e6d0 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61  * function has a
2e6e0 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
2e6f0 65 64 2c 20 69 74 20 69 73 20 6d 6f 73 74 6c 79  ed, it is mostly
2e700 20 61 20 6e 6f 2d 6f 70 2e 20 20 48 6f 77 65 76   a no-op.  Howev
2e710 65 72 2c 20 61 6e 79 0a 20 20 20 20 2a 2a 20 62  er, any.    ** b
2e720 61 63 6b 75 70 20 69 6e 20 70 72 6f 67 72 65 73  ackup in progres
2e730 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  s needs to be re
2e740 73 74 61 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  started..    */.
2e750 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
2e760 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d  pRestart(pPager-
2e770 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 7d 65 6c  >pBackup);.  }el
2e780 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  se if( pPager->s
2e790 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43  tate!=PAGER_SYNC
2e7a0 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  ED && pPager->db
2e7b0 4d 6f 64 69 66 69 65 64 20 29 7b 0a 20 20 20 20  Modified ){.    
2e7c0 69 66 28 20 70 61 67 65 72 55 73 65 4c 6f 67 28  if( pagerUseLog(
2e7d0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
2e7e0 20 50 67 48 64 72 20 2a 70 4c 69 73 74 20 3d 20   PgHdr *pList = 
2e7f0 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
2e800 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
2e810 50 43 61 63 68 65 29 3b 0a 20 20 20 20 20 20 69  PCache);.      i
2e820 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
2e830 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e840 4c 6f 67 46 72 61 6d 65 73 28 70 50 61 67 65 72  LogFrames(pPager
2e850 2d 3e 70 4c 6f 67 2c 20 70 50 61 67 65 72 2d 3e  ->pLog, pPager->
2e860 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c  pageSize, pList,
2e870 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
2e880 67 65 72 2d 3e 64 62 53 69 7a 65 2c 20 31 2c 20  ger->dbSize, 1, 
2e890 28 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e  (pPager->fullSyn
2e8a0 63 20 3f 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  c ? pPager->sync
2e8b0 5f 66 6c 61 67 73 20 3a 20 30 29 0a 20 20 20 20  _flags : 0).    
2e8c0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
2e8d0 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
2e8e0 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65  heCleanAll(pPage
2e8f0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20  r->pPCache);.   
2e900 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
2e910 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
2e920 6c 6f 63 6b 20 75 70 64 61 74 65 73 20 74 68 65  lock updates the
2e930 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e   change-counter.
2e940 20 45 78 61 63 74 6c 79 20 68 6f 77 20 69 74 0a   Exactly how it.
2e950 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 74 68        ** does th
2e960 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68  is depends on wh
2e970 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
2e980 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f   atomic-update o
2e990 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20  ptimization.    
2e9a0 20 20 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65 64    ** was enabled
2e9b0 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
2e9c0 2c 20 61 6e 64 20 69 66 20 74 68 69 73 20 74 72  , and if this tr
2e9d0 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65 74 73 20  ansaction meets 
2e9e0 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 72 75  the .      ** ru
2e9f0 6e 74 69 6d 65 20 63 72 69 74 65 72 69 61 20 74  ntime criteria t
2ea00 6f 20 75 73 65 20 74 68 65 20 6f 70 65 72 61 74  o use the operat
2ea10 69 6f 6e 3a 20 0a 20 20 20 20 20 20 2a 2a 0a 20  ion: .      **. 
2ea20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 65       **    * The
2ea30 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70   file-system sup
2ea40 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63  ports the atomic
2ea50 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74 79 20  -write property 
2ea60 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  for.      **    
2ea70 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65    blocks of size
2ea80 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 20   page-size, and 
2ea90 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 54  .      **    * T
2eaa0 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f  his commit is no
2eab0 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74  t part of a mult
2eac0 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69  i-file transacti
2ead0 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  on, and.      **
2eae0 20 20 20 20 2a 20 45 78 61 63 74 6c 79 20 6f 6e      * Exactly on
2eaf0 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
2eb00 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f  modified and sto
2eb10 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
2eb20 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  l file..      **
2eb30 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
2eb40 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61   optimization wa
2eb50 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61 74  s not enabled at
2eb60 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74   compile time, t
2eb70 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hen the.      **
2eb80 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
2eb90 67 65 63 6f 75 6e 74 65 72 28 29 20 66 75 6e 63  gecounter() func
2eba0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
2ebb0 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
2ebc0 6e 67 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 75  nge.      ** cou
2ebd0 6e 74 65 72 20 69 6e 20 27 69 6e 64 69 72 65 63  nter in 'indirec
2ebe0 74 2d 6d 6f 64 65 27 2e 20 49 66 20 74 68 65 20  t-mode'. If the 
2ebf0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
2ec00 63 6f 6d 70 69 6c 65 64 20 69 6e 20 62 75 74 0a  compiled in but.
2ec10 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
2ec20 61 70 70 6c 69 63 61 62 6c 65 20 74 6f 20 74 68  applicable to th
2ec30 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
2ec40 63 61 6c 6c 20 73 71 6c 69 74 65 33 4a 6f 75 72  call sqlite3Jour
2ec50 6e 61 6c 43 72 65 61 74 65 28 29 0a 20 20 20 20  nalCreate().    
2ec60 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72    ** to make sur
2ec70 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2ec80 6c 65 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20  le has actually 
2ec90 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 74 68  been created, th
2eca0 65 6e 20 63 61 6c 6c 0a 20 20 20 20 20 20 2a 2a  en call.      **
2ecb0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
2ecc0 67 65 63 6f 75 6e 74 65 72 28 29 20 74 6f 20 75  gecounter() to u
2ecd0 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
2ece0 2d 63 6f 75 6e 74 65 72 20 69 6e 20 69 6e 64 69  -counter in indi
2ecf0 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 6d 6f  rect.      ** mo
2ed00 64 65 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  de. .      **.  
2ed10 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
2ed20 2c 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  , if the optimiz
2ed30 61 74 69 6f 6e 20 69 73 20 62 6f 74 68 20 65 6e  ation is both en
2ed40 61 62 6c 65 64 20 61 6e 64 20 61 70 70 6c 69 63  abled and applic
2ed50 61 62 6c 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74  able,.      ** t
2ed60 68 65 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f 69  hen call pager_i
2ed70 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
2ed80 72 28 29 20 74 6f 20 75 70 64 61 74 65 20 74 68  r() to update th
2ed90 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
2eda0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 27 64 69  .      ** in 'di
2edb0 72 65 63 74 27 20 6d 6f 64 65 2e 20 49 6e 20 74  rect' mode. In t
2edc0 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75  his case the jou
2edd0 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e  rnal file will n
2ede0 65 76 65 72 20 62 65 0a 20 20 20 20 20 20 2a 2a  ever be.      **
2edf0 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 69   created for thi
2ee00 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  s transaction.. 
2ee10 20 20 20 20 20 2a 2f 0a 20 20 23 69 66 64 65 66       */.  #ifdef
2ee20 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
2ee30 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
2ee40 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
2ee50 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
2ee60 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
2ee70 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
2ee80 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
2ee90 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b  URNALMODE_OFF );
2eea0 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73  .      if( !zMas
2eeb0 74 65 72 20 26 26 20 69 73 4f 70 65 6e 28 70 50  ter && isOpen(pP
2eec0 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20  ager->jfd) .    
2eed0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
2eee0 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75  urnalOff==jrnlBu
2eef0 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
2ef00 20 0a 20 20 20 20 20 20 20 26 26 20 70 50 61 67   .       && pPag
2ef10 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61 67  er->dbSize>=pPag
2ef20 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20  er->dbFileSize. 
2ef30 20 20 20 20 20 20 26 26 20 28 30 3d 3d 28 70 50        && (0==(pP
2ef40 67 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  g = sqlite3Pcach
2ef50 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
2ef60 72 2d 3e 70 50 43 61 63 68 65 29 29 20 7c 7c 20  r->pPCache)) || 
2ef70 30 3d 3d 70 50 67 2d 3e 70 44 69 72 74 79 29 0a  0==pPg->pDirty).
2ef80 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2ef90 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
2efa0 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f  b file change co
2efb0 75 6e 74 65 72 20 76 69 61 20 74 68 65 20 64 69  unter via the di
2efc0 72 65 63 74 2d 77 72 69 74 65 20 6d 65 74 68 6f  rect-write metho
2efd0 64 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20  d. The .        
2efe0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  ** following cal
2eff0 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 20 74 68  l will modify th
2f000 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
2f010 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61  esentation of pa
2f020 67 65 20 31 20 0a 20 20 20 20 20 20 20 20 2a 2a  ge 1 .        **
2f030 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20   to include the 
2f040 75 70 64 61 74 65 64 20 63 68 61 6e 67 65 20 63  updated change c
2f050 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20  ounter and then 
2f060 77 72 69 74 65 20 70 61 67 65 20 31 20 0a 20 20  write page 1 .  
2f070 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c        ** directl
2f080 79 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  y to the databas
2f090 65 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20  e file. Because 
2f0a0 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  of the atomic-wr
2f0b0 69 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ite .        ** 
2f0c0 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
2f0d0 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d  host file-system
2f0e0 2c 20 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a  , this is safe..
2f0f0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2f100 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
2f110 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
2f120 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
2f130 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f140 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
2f150 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67  urnalCreate(pPag
2f160 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
2f170 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2f180 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2f190 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
2f1a0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
2f1b0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
2f1c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 23     }.      }.  #
2f1d0 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20  else.      rc = 
2f1e0 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
2f1f0 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c  ecounter(pPager,
2f200 20 30 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20   0);.  #endif.  
2f210 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2f220 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
2f230 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
2f240 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20  it;.  .      /* 
2f250 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  If this transact
2f260 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65  ion has made the
2f270 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65   database smalle
2f280 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  r, then all page
2f290 73 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67  s.      ** being
2f2a0 20 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68   discarded by th
2f2b0 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73  e truncation mus
2f2c0 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  t be written to 
2f2d0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
2f2e0 20 20 2a 2a 20 66 69 6c 65 2e 20 54 68 69 73 20    ** file. This 
2f2f0 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
2f300 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  in auto-vacuum m
2f310 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ode..      **.  
2f320 20 20 20 20 2a 2a 20 42 65 66 6f 72 65 20 72 65      ** Before re
2f330 61 64 69 6e 67 20 74 68 65 20 70 61 67 65 73 20  ading the pages 
2f340 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
2f350 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
2f360 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72  e .      ** curr
2f370 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67  ent value of Pag
2f380 65 72 2e 64 62 53 69 7a 65 2c 20 73 65 74 20 64  er.dbSize, set d
2f390 62 53 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68  bSize back to th
2f3a0 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a  e value.      **
2f3b0 20 74 68 61 74 20 69 74 20 74 6f 6f 6b 20 61 74   that it took at
2f3c0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
2f3d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4f  e transaction. O
2f3e0 74 68 65 72 77 69 73 65 2c 20 74 68 65 0a 20 20  therwise, the.  
2f3f0 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20      ** calls to 
2f400 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
2f410 29 20 72 65 74 75 72 6e 20 7a 65 72 6f 65 64 20  ) return zeroed 
2f420 70 61 67 65 73 20 69 6e 73 74 65 61 64 20 6f 66  pages instead of
2f430 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 69   .      ** readi
2f440 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ng data from the
2f450 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2f460 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2f470 2a 20 57 68 65 6e 20 6a 6f 75 72 6e 61 6c 5f 6d  * When journal_m
2f480 6f 64 65 3d 3d 4f 46 46 20 74 68 65 20 64 62 4f  ode==OFF the dbO
2f490 72 69 67 53 69 7a 65 20 69 73 20 61 6c 77 61 79  rigSize is alway
2f4a0 73 20 7a 65 72 6f 2c 20 73 6f 20 74 68 69 73 0a  s zero, so this.
2f4b0 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6e        ** block n
2f4c0 65 76 65 72 20 72 75 6e 73 20 69 66 20 6a 6f 75  ever runs if jou
2f4d0 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 2e 0a 20  rnal_mode=OFF.. 
2f4e0 20 20 20 20 20 2a 2f 0a 20 20 23 69 66 6e 64 65       */.  #ifnde
2f4f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2f500 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
2f510 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
2f520 65 3c 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  e<pPager->dbOrig
2f530 53 69 7a 65 20 0a 20 20 20 20 20 20 20 26 26 20  Size .       && 
2f540 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e 6a  ALWAYS(pPager->j
2f550 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
2f560 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
2f570 46 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  F).      ){.    
2f580 20 20 20 20 50 67 6e 6f 20 69 3b 20 20 20 20 20      Pgno i;     
2f590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f5b0 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
2f5c0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f  le */.        co
2f5d0 6e 73 74 20 50 67 6e 6f 20 69 53 6b 69 70 20 3d  nst Pgno iSkip =
2f5e0 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
2f5f0 50 61 67 65 72 29 3b 20 2f 2a 20 50 65 6e 64 69  Pager); /* Pendi
2f600 6e 67 20 6c 6f 63 6b 20 70 61 67 65 20 2a 2f 0a  ng lock page */.
2f610 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67          const Pg
2f620 6e 6f 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67  no dbSize = pPag
2f630 65 72 2d 3e 64 62 53 69 7a 65 3b 20 20 20 20 20  er->dbSize;     
2f640 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6d    /* Database im
2f650 61 67 65 20 73 69 7a 65 20 2a 2f 20 0a 20 20 20  age size */ .   
2f660 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
2f670 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
2f680 4f 72 69 67 53 69 7a 65 3b 0a 20 20 20 20 20 20  OrigSize;.      
2f690 20 20 66 6f 72 28 20 69 3d 64 62 53 69 7a 65 2b    for( i=dbSize+
2f6a0 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 64 62  1; i<=pPager->db
2f6b0 4f 72 69 67 53 69 7a 65 3b 20 69 2b 2b 20 29 7b  OrigSize; i++ ){
2f6c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
2f6d0 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
2f6e0 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
2f6f0 72 6e 61 6c 2c 20 69 29 20 26 26 20 69 21 3d 69  rnal, i) && i!=i
2f700 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Skip ){.        
2f710 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
2f720 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2f730 20 50 61 67 65 20 74 6f 20 6a 6f 75 72 6e 61 6c   Page to journal
2f740 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2f750 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2f760 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20  rGet(pPager, i, 
2f770 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  &pPage);.       
2f780 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2f790 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f  ITE_OK ) goto co
2f7a0 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
2f7b0 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xit;.           
2f7c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2f7d0 65 72 57 72 69 74 65 28 70 50 61 67 65 29 3b 0a  erWrite(pPage);.
2f7e0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2f7f0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
2f800 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2f810 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2f820 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
2f830 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
2f840 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2f850 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f860 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
2f870 20 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d   dbSize;.      }
2f880 20 0a 20 20 23 65 6e 64 69 66 0a 20 20 0a 20 20   .  #endif.  .  
2f890 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
2f8a0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2f8b0 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
2f8c0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61  urnal file. If a
2f8d0 20 6d 61 73 74 65 72 20 0a 20 20 20 20 20 20 2a   master .      *
2f8e0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
2f8f0 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ame has already 
2f900 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
2f910 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f920 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 69  , .      ** or i
2f930 66 20 7a 4d 61 73 74 65 72 20 69 73 20 4e 55 4c  f zMaster is NUL
2f940 4c 20 28 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  L (no master jou
2f950 72 6e 61 6c 29 2c 20 74 68 65 6e 20 74 68 69 73  rnal), then this
2f960 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
2f970 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2f980 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65   rc = writeMaste
2f990 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  rJournal(pPager,
2f9a0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
2f9b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2f9c0 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
2f9d0 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
2f9e0 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 53 79 6e  .  .      /* Syn
2f9f0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
2fa00 6c 65 2e 20 49 66 20 74 68 65 20 61 74 6f 6d 69  le. If the atomi
2fa10 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a  c-update optimiz
2fa20 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 0a 20  ation is being. 
2fa30 20 20 20 20 20 2a 2a 20 75 73 65 64 2c 20 74 68       ** used, th
2fa40 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74  is call will not
2fa50 20 63 72 65 61 74 65 20 74 68 65 20 6a 6f 75 72   create the jour
2fa60 6e 61 6c 20 66 69 6c 65 20 6f 72 20 70 65 72 66  nal file or perf
2fa70 6f 72 6d 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a  orm any.      **
2fa80 20 72 65 61 6c 20 49 4f 2e 0a 20 20 20 20 20 20   real IO..      
2fa90 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79  */.      rc = sy
2faa0 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
2fab0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2fac0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2fad0 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
2fae0 6e 65 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20 20  ne_exit;.  .    
2faf0 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64    /* Write all d
2fb00 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68  irty pages to th
2fb10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2fb20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70   */.      rc = p
2fb30 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
2fb40 69 73 74 28 73 71 6c 69 74 65 33 50 63 61 63 68  ist(sqlite3Pcach
2fb50 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
2fb60 72 2d 3e 70 50 43 61 63 68 65 29 29 3b 0a 20 20  r->pPCache));.  
2fb70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2fb80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2fb90 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
2fba0 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
2fbb0 44 20 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  D );.        got
2fbc0 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
2fbd0 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  ne_exit;.      }
2fbe0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
2fbf0 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
2fc00 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
2fc10 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68   .      /* If th
2fc20 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
2fc30 73 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 73  s not the same s
2fc40 69 7a 65 20 61 73 20 74 68 65 20 64 61 74 61 62  ize as the datab
2fc50 61 73 65 20 69 6d 61 67 65 2c 0a 20 20 20 20 20  ase image,.     
2fc60 20 2a 2a 20 74 68 65 6e 20 75 73 65 20 70 61 67   ** then use pag
2fc70 65 72 5f 74 72 75 6e 63 61 74 65 20 74 6f 20 67  er_truncate to g
2fc80 72 6f 77 20 6f 72 20 73 68 72 69 6e 6b 20 74 68  row or shrink th
2fc90 65 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20  e file here..   
2fca0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
2fcb0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 21 3d  pPager->dbSize!=
2fcc0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
2fcd0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  ze ){.        Pg
2fce0 6e 6f 20 6e 4e 65 77 20 3d 20 70 50 61 67 65 72  no nNew = pPager
2fcf0 2d 3e 64 62 53 69 7a 65 20 2d 20 28 70 50 61 67  ->dbSize - (pPag
2fd00 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 41 47 45  er->dbSize==PAGE
2fd10 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
2fd20 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ));.        asse
2fd30 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
2fd40 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
2fd50 56 45 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  VE );.        rc
2fd60 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
2fd70 65 28 70 50 61 67 65 72 2c 20 6e 4e 65 77 29 3b  e(pPager, nNew);
2fd80 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
2fd90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2fda0 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
2fdb0 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  ne_exit;.      }
2fdc0 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e  .  .      /* Fin
2fdd0 61 6c 6c 79 2c 20 73 79 6e 63 20 74 68 65 20 64  ally, sync the d
2fde0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
2fdf0 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
2fe00 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e  er->noSync && !n
2fe10 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  oSync ){.       
2fe20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
2fe30 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ync(pPager->fd, 
2fe40 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
2fe50 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gs);.      }.   
2fe60 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 53     IOTRACE(("DBS
2fe70 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
2fe80 72 29 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  r)).    }..    p
2fe90 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
2fea0 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d  AGER_SYNCED;.  }
2feb0 0a 0a 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  ..commit_phase_o
2fec0 6e 65 5f 65 78 69 74 3a 0a 20 20 72 65 74 75 72  ne_exit:.  retur
2fed0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2fee0 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
2fef0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
2ff00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2ff10 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74  has been complet
2ff20 65 6c 79 0a 2a 2a 20 75 70 64 61 74 65 64 20 74  ely.** updated t
2ff30 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20 63 68  o reflect the ch
2ff40 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
2ff50 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
2ff60 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 73 79 6e  ction and.** syn
2ff70 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 54 68 65  ced to disk. The
2ff80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 74   journal file st
2ff90 69 6c 6c 20 65 78 69 73 74 73 20 69 6e 20 74 68  ill exists in th
2ffa0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a  e file-system .*
2ffb0 2a 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 69 66  * though, and if
2ffc0 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
2ffd0 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
2ffe0 69 74 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c  it will eventual
2fff0 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 61 73  ly.** be used as
30000 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61   a hot-journal a
30010 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
30020 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 65  ransaction rolle
30030 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  d back..**.** Th
30040 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 61  is function fina
30050 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e 61  lizes the journa
30060 6c 20 66 69 6c 65 2c 20 65 69 74 68 65 72 20 62  l file, either b
30070 79 20 64 65 6c 65 74 69 6e 67 2c 20 0a 2a 2a 20  y deleting, .** 
30080 74 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 70 61  truncating or pa
30090 72 74 69 61 6c 6c 79 20 7a 65 72 6f 69 6e 67 20  rtially zeroing 
300a0 69 74 2c 20 73 6f 20 74 68 61 74 20 69 74 20 63  it, so that it c
300b0 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 0a 2a  annot be used .*
300c0 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f 75 72 6e 61  * for hot-journa
300d0 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 6e 63 65  l rollback. Once
300e0 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 74 68   this is done th
300f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
30100 0a 2a 2a 20 69 72 72 65 76 6f 63 61 62 6c 79 20  .** irrevocably 
30110 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
30120 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
30130 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72  urs, an IO error
30140 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
30150 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 0a  d and the pager.
30160 2a 2a 20 6d 6f 76 65 73 20 69 6e 74 6f 20 74 68  ** moves into th
30170 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 4f  e error state. O
30180 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
30190 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
301a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
301b0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
301c0 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  wo(Pager *pPager
301d0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
301e0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
301f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
30200 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
30210 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
30220 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c  hould not be cal
30230 6c 65 64 20 69 66 20 61 20 70 72 69 6f 72 20 65  led if a prior e
30240 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
30250 64 2e 0a 20 20 2a 2a 20 42 75 74 20 69 66 20 28  d..  ** But if (
30260 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20  due to a coding 
30270 65 72 72 6f 72 20 65 6c 73 65 77 68 65 72 65 20  error elsewhere 
30280 69 6e 20 74 68 65 20 73 79 73 74 65 6d 29 20 69  in the system) i
30290 74 20 64 6f 65 73 20 67 65 74 0a 20 20 2a 2a 20  t does get.  ** 
302a0 63 61 6c 6c 65 64 2c 20 6a 75 73 74 20 72 65 74  called, just ret
302b0 75 72 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72  urn the same err
302c0 6f 72 20 63 6f 64 65 20 77 69 74 68 6f 75 74 20  or code without 
302d0 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
302e0 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
302f0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
30300 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
30310 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20  >errCode;..  /* 
30320 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
30330 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c  ould not be call
30340 65 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ed if the pager 
30350 69 73 20 6e 6f 74 20 69 6e 20 61 74 20 6c 65 61  is not in at lea
30360 73 74 0a 20 20 2a 2a 20 50 41 47 45 52 5f 52 45  st.  ** PAGER_RE
30370 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 41 6e  SERVED state. An
30380 64 20 69 6e 64 65 65 64 20 53 51 4c 69 74 65 20  d indeed SQLite 
30390 6e 65 76 65 72 20 64 6f 65 73 20 74 68 69 73 2e  never does this.
303a0 20 42 75 74 20 69 74 20 69 73 0a 20 20 2a 2a 20   But it is.  ** 
303b0 6e 69 63 65 20 74 6f 20 68 61 76 65 20 74 68 69  nice to have thi
303c0 73 20 64 65 66 65 6e 73 69 76 65 20 74 65 73 74  s defensive test
303d0 20 68 65 72 65 20 61 6e 79 77 61 79 2e 0a 20 20   here anyway..  
303e0 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
303f0 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
30400 45 52 5f 52 45 53 45 52 56 45 44 29 20 29 20 72  ER_RESERVED) ) r
30410 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
30420 4f 52 3b 0a 0a 20 20 2f 2a 20 41 6e 20 6f 70 74  OR;..  /* An opt
30430 69 6d 69 7a 61 74 69 6f 6e 2e 20 49 66 20 74 68  imization. If th
30440 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6e  e database was n
30450 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69  ot actually modi
30460 66 69 65 64 20 64 75 72 69 6e 67 0a 20 20 2a 2a  fied during.  **
30470 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
30480 6e 2c 20 74 68 65 20 70 61 67 65 72 20 69 73 20  n, the pager is 
30490 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
304a0 73 69 76 65 2d 6d 6f 64 65 20 61 6e 64 20 69 73  sive-mode and is
304b0 0a 20 20 2a 2a 20 75 73 69 6e 67 20 70 65 72 73  .  ** using pers
304c0 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2c  istent journals,
304d0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
304e0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
304f0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 74    **.  ** The st
30500 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
30510 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  al file currentl
30520 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e  y contains a sin
30530 67 6c 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  gle journal .  *
30540 2a 20 68 65 61 64 65 72 20 77 69 74 68 20 74 68  * header with th
30550 65 20 6e 52 65 63 20 66 69 65 6c 64 20 73 65 74  e nRec field set
30560 20 74 6f 20 30 2e 20 49 66 20 73 75 63 68 20 61   to 0. If such a
30570 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75 73 65 64   journal is used
30580 20 61 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a   as.  ** a hot-j
30590 6f 75 72 6e 61 6c 20 64 75 72 69 6e 67 20 68 6f  ournal during ho
305a0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
305b0 63 6b 2c 20 30 20 63 68 61 6e 67 65 73 20 77 69  ck, 0 changes wi
305c0 6c 6c 20 62 65 20 6d 61 64 65 0a 20 20 2a 2a 20  ll be made.  ** 
305d0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
305e0 66 69 6c 65 2e 20 53 6f 20 74 68 65 72 65 20 69  file. So there i
305f0 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 7a 65 72  s no need to zer
30600 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  o the journal . 
30610 20 2a 2a 20 68 65 61 64 65 72 2e 20 53 69 6e 63   ** header. Sinc
30620 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  e the pager is i
30630 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
30640 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  , there is no ne
30650 65 64 0a 20 20 2a 2a 20 74 6f 20 64 72 6f 70 20  ed.  ** to drop 
30660 61 6e 79 20 6c 6f 63 6b 73 20 65 69 74 68 65 72  any locks either
30670 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
30680 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d  ger->dbModified=
30690 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 78  =0 && pPager->ex
306a0 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
306b0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
306c0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
306d0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
306e0 54 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72  T.  ){.    asser
306f0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
30700 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
30710 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
30720 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
30730 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50 41  TE_OK;.  }..  PA
30740 47 45 52 54 52 41 43 45 28 28 22 43 4f 4d 4d 49  GERTRACE(("COMMI
30750 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  T %d\n", PAGERID
30760 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 61 73  (pPager)));.  as
30770 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
30780 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate==PAGER_SYNCE
30790 44 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 21 70  D || MEMDB || !p
307a0 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
307b0 64 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65  d );.  rc = page
307c0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
307d0 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  n(pPager, pPager
307e0 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20  ->setMaster);.  
307f0 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
30800 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
30810 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
30820 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 54  k all changes. T
30830 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c  he database fall
30840 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  s back to PAGER_
30850 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 0a  SHARED mode..**.
30860 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
30870 20 70 65 72 66 6f 72 6d 73 20 74 77 6f 20 74 61   performs two ta
30880 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  sks:.**.**   1) 
30890 49 74 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68  It rolls back th
308a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
308b0 72 65 73 74 6f 72 69 6e 67 20 61 6c 6c 20 64 61  restoring all da
308c0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
308d0 0a 2a 2a 20 20 20 20 20 20 69 6e 2d 6d 65 6d 6f  .**      in-memo
308e0 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20 74  ry cache pages t
308f0 6f 20 74 68 65 20 73 74 61 74 65 20 74 68 65 79  o the state they
30900 20 77 65 72 65 20 69 6e 20 77 68 65 6e 20 74 68   were in when th
30910 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e transaction.**
30920 20 20 20 20 20 20 77 61 73 20 6f 70 65 6e 65 64        was opened
30930 2c 20 61 6e 64 0a 2a 2a 20 20 20 32 29 20 49 74  , and.**   2) It
30940 20 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a   finalizes the j
30950 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 6f 20  ournal file, so 
30960 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 75  that it is not u
30970 73 65 64 20 66 6f 72 20 68 6f 74 0a 2a 2a 20 20  sed for hot.**  
30980 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20      rollback at 
30990 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  any point in the
309a0 20 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 73   future..**.** s
309b0 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 66 6f  ubject to the fo
309c0 6c 6c 6f 77 69 6e 67 20 71 75 61 6c 69 66 69 63  llowing qualific
309d0 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20  ations:.**.** * 
309e0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
309f0 69 6c 65 20 69 73 20 6e 6f 74 20 79 65 74 20 6f  ile is not yet o
30a00 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75  pen when this fu
30a10 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
30a20 2c 0a 2a 2a 20 20 20 74 68 65 6e 20 6f 6e 6c 79  ,.**   then only
30a30 20 28 32 29 20 69 73 20 70 65 72 66 6f 72 6d 65   (2) is performe
30a40 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
30a50 74 68 65 72 65 20 69 73 20 6e 6f 20 6a 6f 75 72  there is no jour
30a60 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 74 6f  nal file.**   to
30a70 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a 2a 0a 2a   roll back..**.*
30a80 2a 20 2a 20 49 66 20 69 6e 20 61 6e 20 65 72 72  * * If in an err
30a90 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74  or state other t
30aa0 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c  han SQLITE_FULL,
30ab0 20 74 68 65 6e 20 74 61 73 6b 20 28 31 29 20 69   then task (1) i
30ac0 73 20 0a 2a 2a 20 20 20 70 65 72 66 6f 72 6d 65  s .**   performe
30ad0 64 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  d. If successful
30ae0 2c 20 74 61 73 6b 20 28 32 29 2e 20 52 65 67 61  , task (2). Rega
30af0 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75  rdless of the ou
30b00 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66 20 65 69  tcome.**   of ei
30b10 74 68 65 72 2c 20 74 68 65 20 65 72 72 6f 72 20  ther, the error 
30b20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  state error code
30b30 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
30b40 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20  the caller.**   
30b50 28 69 2e 65 2e 20 65 69 74 68 65 72 20 53 51 4c  (i.e. either SQL
30b60 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c  ITE_IOERR or SQL
30b70 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a  ITE_CORRUPT)..**
30b80 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20 70 61 67  .** * If the pag
30b90 65 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f 52  er is in PAGER_R
30ba0 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
30bb0 68 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29 2e  hen attempt (1).
30bc0 20 57 68 65 74 68 65 72 0a 2a 2a 20 20 20 6f 72   Whether.**   or
30bd0 20 6e 6f 74 20 28 31 29 20 69 73 20 73 75 63 63   not (1) is succ
30be0 75 73 73 66 75 6c 2c 20 61 6c 73 6f 20 61 74 74  ussful, also att
30bf0 65 6d 70 74 20 28 32 29 2e 20 49 66 20 73 75 63  empt (2). If suc
30c00 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a  cessful, return.
30c10 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  **   SQLITE_OK. 
30c20 4f 74 68 65 72 77 69 73 65 2c 20 65 6e 74 65 72  Otherwise, enter
30c30 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
30c40 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
30c50 66 69 72 73 74 20 0a 2a 2a 20 20 20 65 72 72 6f  first .**   erro
30c60 72 20 63 6f 64 65 20 65 6e 63 6f 75 6e 74 65 72  r code encounter
30c70 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20  ed. .**.**   In 
30c80 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
30c90 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61  is no chance tha
30ca0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  t the database w
30cb0 61 73 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 0a  as written to. .
30cc0 2a 2a 20 20 20 53 6f 20 69 73 20 73 61 66 65 20  **   So is safe 
30cd0 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
30ce0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 76 65  journal file eve
30cf0 6e 20 69 66 20 74 68 65 20 70 6c 61 79 62 61 63  n if the playbac
30d00 6b 20 0a 2a 2a 20 20 20 28 6f 70 65 72 61 74 69  k .**   (operati
30d10 6f 6e 20 31 29 20 66 61 69 6c 65 64 2e 20 48 6f  on 1) failed. Ho
30d20 77 65 76 65 72 20 74 68 65 20 70 61 67 65 72 20  wever the pager 
30d30 6d 75 73 74 20 65 6e 74 65 72 20 74 68 65 20 65  must enter the e
30d40 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20 20  rror state.**   
30d50 61 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  as the contents 
30d60 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  of the in-memory
30d70 20 63 61 63 68 65 20 61 72 65 20 6e 6f 77 20 73   cache are now s
30d80 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 2a 20  uspect..**.** * 
30d90 46 69 6e 61 6c 6c 79 2c 20 69 66 20 69 6e 20 50  Finally, if in P
30da0 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 73  AGER_EXCLUSIVE s
30db0 74 61 74 65 2c 20 74 68 65 6e 20 61 74 74 65 6d  tate, then attem
30dc0 70 74 20 28 31 29 2e 20 4f 6e 6c 79 0a 2a 2a 20  pt (1). Only.** 
30dd0 20 20 61 74 74 65 6d 70 74 20 28 32 29 20 69 66    attempt (2) if
30de0 20 28 31 29 20 69 73 20 73 75 63 63 65 73 73 66   (1) is successf
30df0 75 6c 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  ul. Return SQLIT
30e00 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
30e10 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65 72 77 69  ul,.**   otherwi
30e20 73 65 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  se enter the err
30e30 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72 65 74  or state and ret
30e40 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
30e50 64 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20  de from the .** 
30e60 20 20 66 61 69 6c 69 6e 67 20 6f 70 65 72 61 74    failing operat
30e70 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20  ion..**.**   In 
30e80 74 68 69 73 20 63 61 73 65 20 74 68 65 20 64 61  this case the da
30e90 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61 79 20  tabase file may 
30ea0 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
30eb0 6e 20 74 6f 2e 20 53 6f 20 69 66 20 74 68 65 0a  n to. So if the.
30ec0 2a 2a 20 20 20 70 6c 61 79 62 61 63 6b 20 6f 70  **   playback op
30ed0 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20  eration did not 
30ee0 73 75 63 63 65 65 64 20 69 74 20 77 6f 75 6c 64  succeed it would
30ef0 20 6e 6f 74 20 62 65 20 73 61 66 65 20 74 6f 20   not be safe to 
30f00 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20 74 68  finalize.**   th
30f10 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
30f20 49 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c  It needs to be l
30f30 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  eft in the file-
30f40 73 79 73 74 65 6d 20 73 6f 20 74 68 61 74 0a 2a  system so that.*
30f50 2a 20 20 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  *   some other p
30f60 72 6f 63 65 73 73 20 63 61 6e 20 75 73 65 20 69  rocess can use i
30f70 74 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  t to restore the
30f80 20 64 61 74 61 62 61 73 65 20 73 74 61 74 65 20   database state 
30f90 28 62 79 0a 2a 2a 20 20 20 68 6f 74 2d 6a 6f 75  (by.**   hot-jou
30fa0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a  rnal rollback)..
30fb0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
30fc0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  gerRollback(Page
30fd0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
30fe0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
30ff0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31000 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
31010 65 20 2a 2f 0a 20 20 50 41 47 45 52 54 52 41 43  e */.  PAGERTRAC
31020 45 28 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c  E(("ROLLBACK %d\
31030 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
31040 65 72 29 29 29 3b 0a 20 20 69 66 28 20 70 61 67  er)));.  if( pag
31050 65 72 55 73 65 4c 6f 67 28 70 50 61 67 65 72 29  erUseLog(pPager)
31060 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
31070 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
31080 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28  3PagerSavepoint(
31090 70 50 61 67 65 72 2c 20 53 41 56 45 50 4f 49 4e  pPager, SAVEPOIN
310a0 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 2d 31 29 3b  T_ROLLBACK, -1);
310b0 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72  .    rc2 = pager
310c0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
310d0 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
310e0 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 20  >setMaster);.   
310f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31100 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  OK ) rc = rc2;. 
31110 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
31120 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 7c  er->dbModified |
31130 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  | !isOpen(pPager
31140 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 72 63  ->jfd) ){.    rc
31150 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
31160 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
31170 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
31180 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  er);.  }else if(
31190 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
311a0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
311b0 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode!=SQLITE_FULL
311c0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
311d0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
311e0 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20  _EXCLUSIVE ){.  
311f0 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61      pager_playba
31200 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  ck(pPager, 0);. 
31210 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 50     }.    rc = pP
31220 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
31230 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
31240 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
31250 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
31260 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  .      int rc2;.
31270 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
31280 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
31290 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 32 20  , 0);.      rc2 
312a0 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
312b0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
312c0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
312d0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
312e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
312f0 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b         rc = rc2;
31300 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
31310 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
31320 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
31330 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ager, 0);.    }.
31340 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
31350 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
31360 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30  >dbSizeValid = 0
31370 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
31380 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
31390 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c  rs during a ROLL
313a0 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20  BACK, we can no 
313b0 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68 65  longer trust the
313c0 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 63 61   pager.    ** ca
313d0 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67  che. So call pag
313e0 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74 68  er_error() on th
313f0 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b  e way out to mak
31400 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20 20  e any error .   
31410 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a   ** persistent..
31420 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
31430 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
31440 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72  er, rc);.  }.  r
31450 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
31460 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
31470 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
31480 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65  ile is opened re
31490 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e  ad-only.  Return
314a0 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65   FALSE.** if the
314b0 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69 6e   database is (in
314c0 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c   theory) writabl
314d0 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33  e..*/.u8 sqlite3
314e0 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28  PagerIsreadonly(
314f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
31500 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
31510 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a  >readOnly;.}../*
31520 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
31530 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
31540 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 72  ces to the pager
31550 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
31560 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50 61  PagerRefcount(Pa
31570 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
31580 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63  return sqlite3Pc
31590 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
315a0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d  ger->pPCache);.}
315b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
315c0 68 65 20 61 70 70 72 6f 78 69 6d 61 74 65 20 6e  he approximate n
315d0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
315e0 66 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e 74  f memory current
315f0 6c 79 0a 2a 2a 20 75 73 65 64 20 62 79 20 74 68  ly.** used by th
31600 65 20 70 61 67 65 72 20 61 6e 64 20 69 74 73 20  e pager and its 
31610 61 73 73 6f 63 69 61 74 65 64 20 63 61 63 68 65  associated cache
31620 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
31630 50 61 67 65 72 4d 65 6d 55 73 65 64 28 50 61 67  PagerMemUsed(Pag
31640 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
31650 6e 74 20 70 65 72 50 61 67 65 53 69 7a 65 20 3d  nt perPageSize =
31660 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
31670 65 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  e + pPager->nExt
31680 72 61 20 2b 20 32 30 3b 0a 20 20 72 65 74 75 72  ra + 20;.  retur
31690 6e 20 70 65 72 50 61 67 65 53 69 7a 65 2a 73 71  n perPageSize*sq
316a0 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63  lite3PcachePagec
316b0 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
316c0 61 63 68 65 29 0a 20 20 20 20 20 20 20 20 20 20  ache).          
316d0 20 2b 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   + sqlite3Malloc
316e0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a  Size(pPager);.}.
316f0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
31700 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
31710 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 70  rences to the sp
31720 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
31730 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
31740 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 44 62  rPageRefcount(Db
31750 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
31760 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63  return sqlite3Pc
31770 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74  achePageRefcount
31780 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 23 69 66 64  (pPage);.}..#ifd
31790 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
317a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
317b0 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  e is used for te
317c0 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
317d0 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  is only..*/.int 
317e0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61  *sqlite3PagerSta
317f0 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
31800 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
31810 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20  a[11];.  a[0] = 
31820 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
31830 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
31840 43 61 63 68 65 29 3b 0a 20 20 61 5b 31 5d 20 3d  Cache);.  a[1] =
31850 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
31860 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
31870 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 32 5d  pPCache);.  a[2]
31880 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
31890 47 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61  GetCachesize(pPa
318a0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
318b0 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[3] = pPager->
318c0 64 62 53 69 7a 65 56 61 6c 69 64 20 3f 20 28 69  dbSizeValid ? (i
318d0 6e 74 29 20 70 50 61 67 65 72 2d 3e 64 62 53 69  nt) pPager->dbSi
318e0 7a 65 20 3a 20 2d 31 3b 0a 20 20 61 5b 34 5d 20  ze : -1;.  a[4] 
318f0 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b  = pPager->state;
31900 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72  .  a[5] = pPager
31910 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36  ->errCode;.  a[6
31920 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74  ] = pPager->nHit
31930 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65  ;.  a[7] = pPage
31940 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d  r->nMiss;.  a[8]
31950 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74   = 0;  /* Used t
31960 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76  o be pPager->nOv
31970 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70  fl */.  a[9] = p
31980 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20  Pager->nRead;.  
31990 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e  a[10] = pPager->
319a0 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e  nWrite;.  return
319b0 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   a;.}.#endif../*
319c0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
319d0 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  if this is an in
319e0 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a  -memory pager..*
319f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
31a00 65 72 49 73 4d 65 6d 64 62 28 50 61 67 65 72 20  erIsMemdb(Pager 
31a10 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
31a20 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 0a 2f 2a 0a  rn MEMDB;.}../*.
31a30 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  ** Check that th
31a40 65 72 65 20 61 72 65 20 61 74 20 6c 65 61 73 74  ere are at least
31a50 20 6e 53 61 76 65 70 6f 69 6e 74 20 73 61 76 65   nSavepoint save
31a60 70 6f 69 6e 74 73 20 6f 70 65 6e 2e 20 49 66 20  points open. If 
31a70 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 63 75 72  there are.** cur
31a80 72 65 6e 74 6c 79 20 6c 65 73 73 20 74 68 61 6e  rently less than
31a90 20 6e 53 61 76 65 70 6f 69 6e 74 73 20 6f 70 65   nSavepoints ope
31aa0 6e 2c 20 74 68 65 6e 20 6f 70 65 6e 20 6f 6e 65  n, then open one
31ab0 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69   or more savepoi
31ac0 6e 74 73 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 75  nts.** to make u
31ad0 70 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  p the difference
31ae0 2e 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  . If the number 
31af0 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 20 69 73  of savepoints is
31b00 20 61 6c 72 65 61 64 79 0a 2a 2a 20 65 71 75 61   already.** equa
31b10 6c 20 74 6f 20 6e 53 61 76 65 70 6f 69 6e 74 2c  l to nSavepoint,
31b20 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
31b30 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
31b40 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
31b50 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
31b60 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ls, SQLITE_NOMEM
31b70 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
31b80 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63   an error .** oc
31b90 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69  curs while openi
31ba0 6e 67 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ng the sub-journ
31bb0 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 61 6e  al file, then an
31bc0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
31bd0 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f  s.** returned. O
31be0 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
31bf0 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
31c00 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
31c10 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61  point(Pager *pPa
31c20 67 65 72 2c 20 69 6e 74 20 6e 53 61 76 65 70 6f  ger, int nSavepo
31c30 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
31c40 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
31c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c60 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
31c70 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 72 65   */.  int nCurre
31c80 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 61  nt = pPager->nSa
31c90 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20  vepoint;        
31ca0 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d 62 65  /* Current numbe
31cb0 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 20  r of savepoints 
31cc0 2a 2f 0a 0a 20 20 69 66 28 20 6e 53 61 76 65 70  */..  if( nSavep
31cd0 6f 69 6e 74 3e 6e 43 75 72 72 65 6e 74 20 26 26  oint>nCurrent &&
31ce0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
31cf0 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  nal ){.    int i
31d00 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
31d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
31d30 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 50  ariable */.    P
31d40 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61  agerSavepoint *a
31d50 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
31d60 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 50 61         /* New Pa
31d70 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
31d80 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rray */.    int 
31d90 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
31da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31db0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
31dc0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
31dd0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
31de0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
31df0 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
31e00 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
31e10 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 2f 2a  turn rc;..    /*
31e20 20 47 72 6f 77 20 74 68 65 20 50 61 67 65 72 2e   Grow the Pager.
31e30 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72 61 79  aSavepoint array
31e40 20 75 73 69 6e 67 20 72 65 61 6c 6c 6f 63 28 29   using realloc()
31e50 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
31e60 4e 4f 4d 45 4d 0a 20 20 20 20 2a 2a 20 69 66 20  NOMEM.    ** if 
31e70 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  the allocation f
31e80 61 69 6c 73 2e 20 4f 74 68 65 72 77 69 73 65 2c  ails. Otherwise,
31e90 20 7a 65 72 6f 20 74 68 65 20 6e 65 77 20 70 6f   zero the new po
31ea0 72 74 69 6f 6e 20 69 6e 20 63 61 73 65 20 61 20  rtion in case a 
31eb0 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 66  .    ** malloc f
31ec0 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
31ed0 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 69  ile populating i
31ee0 74 20 69 6e 20 74 68 65 20 66 6f 72 28 2e 2e 2e  t in the for(...
31ef0 29 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e 0a 20 20  ) loop below..  
31f00 20 20 2a 2f 0a 20 20 20 20 61 4e 65 77 20 3d 20    */.    aNew = 
31f10 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20  (PagerSavepoint 
31f20 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  *)sqlite3Realloc
31f30 28 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  (.        pPager
31f40 2d 3e 61 53 61 76 65 70 6f 69 6e 74 2c 20 73 69  ->aSavepoint, si
31f50 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65 70 6f  zeof(PagerSavepo
31f60 69 6e 74 29 2a 6e 53 61 76 65 70 6f 69 6e 74 0a  int)*nSavepoint.
31f70 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
31f80 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 65  aNew ){.      re
31f90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
31fa0 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  M;.    }.    mem
31fb0 73 65 74 28 26 61 4e 65 77 5b 6e 43 75 72 72 65  set(&aNew[nCurre
31fc0 6e 74 5d 2c 20 30 2c 20 28 6e 53 61 76 65 70 6f  nt], 0, (nSavepo
31fd0 69 6e 74 2d 6e 43 75 72 72 65 6e 74 29 20 2a 20  int-nCurrent) * 
31fe0 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65  sizeof(PagerSave
31ff0 70 6f 69 6e 74 29 29 3b 0a 20 20 20 20 70 50 61  point));.    pPa
32000 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20  ger->aSavepoint 
32010 3d 20 61 4e 65 77 3b 0a 20 20 20 20 70 50 61 67  = aNew;.    pPag
32020 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d  er->nSavepoint =
32030 20 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 0a 20 20   nSavepoint;..  
32040 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
32050 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
32060 20 73 74 72 75 63 74 75 72 65 73 20 6a 75 73 74   structures just
32070 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a 20   allocated. */. 
32080 20 20 20 66 6f 72 28 69 69 3d 6e 43 75 72 72 65     for(ii=nCurre
32090 6e 74 3b 20 69 69 3c 6e 53 61 76 65 70 6f 69 6e  nt; ii<nSavepoin
320a0 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  t; ii++){.      
320b0 61 4e 65 77 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d  aNew[ii].nOrig =
320c0 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66   nPage;.      if
320d0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
320e0 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d  >jfd) && pPager-
320f0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 29 7b  >journalOff>0 ){
32100 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69 69  .        aNew[ii
32110 5d 2e 69 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ].iOffset = pPag
32120 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
32130 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32140 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f       aNew[ii].iO
32150 66 66 73 65 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f  ffset = JOURNAL_
32160 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
32170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 4e        }.      aN
32180 65 77 5b 69 69 5d 2e 69 53 75 62 52 65 63 20 3d  ew[ii].iSubRec =
32190 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63   pPager->nSubRec
321a0 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d  ;.      aNew[ii]
321b0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  .pInSavepoint = 
321c0 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
321d0 61 74 65 28 6e 50 61 67 65 29 3b 0a 20 20 20 20  ate(nPage);.    
321e0 20 20 69 66 28 20 21 61 4e 65 77 5b 69 69 5d 2e    if( !aNew[ii].
321f0 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  pInSavepoint ){.
32200 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
32210 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
32220 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
32230 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d  /* Open the sub-
32240 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
32250 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
32260 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 72 63 20  ened. */.    rc 
32270 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  = openSubJournal
32280 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73  (pPager);.    as
32290 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
322a0 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 3b 0a  traint(pPager);.
322b0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
322c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
322d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
322e0 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f  ed to rollback o
322f0 72 20 72 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69  r release (commi
32300 74 29 20 61 20 73 61 76 65 70 6f 69 6e 74 2e 0a  t) a savepoint..
32310 2a 2a 20 54 68 65 20 73 61 76 65 70 6f 69 6e 74  ** The savepoint
32320 20 74 6f 20 72 65 6c 65 61 73 65 20 6f 72 20 72   to release or r
32330 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 20 6e 6f 74  ollback need not
32340 20 62 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63   be the most rec
32350 65 6e 74 6c 79 20 0a 2a 2a 20 63 72 65 61 74 65  ently .** create
32360 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a  d savepoint..**.
32370 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6f 70 20  ** Parameter op 
32380 69 73 20 61 6c 77 61 79 73 20 65 69 74 68 65 72  is always either
32390 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
323a0 41 43 4b 20 6f 72 20 53 41 56 45 50 4f 49 4e 54  ACK or SAVEPOINT
323b0 5f 52 45 4c 45 41 53 45 2e 0a 2a 2a 20 49 66 20  _RELEASE..** If 
323c0 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  it is SAVEPOINT_
323d0 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 72 65  RELEASE, then re
323e0 6c 65 61 73 65 20 61 6e 64 20 64 65 73 74 72 6f  lease and destro
323f0 79 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  y the savepoint 
32400 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 69 53  with.** index iS
32410 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 74 20  avepoint. If it 
32420 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  is SAVEPOINT_ROL
32430 4c 42 41 43 4b 2c 20 74 68 65 6e 20 72 6f 6c 6c  LBACK, then roll
32440 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73  back all changes
32450 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 6f 63  .** that have oc
32460 63 75 72 72 65 64 20 73 69 6e 63 65 20 74 68 65  curred since the
32470 20 73 70 65 63 69 66 69 65 64 20 73 61 76 65 70   specified savep
32480 6f 69 6e 74 20 77 61 73 20 63 72 65 61 74 65 64  oint was created
32490 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 76 65  ..**.** The save
324a0 70 6f 69 6e 74 20 74 6f 20 72 6f 6c 6c 62 61 63  point to rollbac
324b0 6b 20 6f 72 20 72 65 6c 65 61 73 65 20 69 73 20  k or release is 
324c0 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
324d0 72 61 6d 65 74 65 72 20 0a 2a 2a 20 69 53 61 76  rameter .** iSav
324e0 65 70 6f 69 6e 74 2e 20 41 20 76 61 6c 75 65 20  epoint. A value 
324f0 6f 66 20 30 20 6d 65 61 6e 73 20 74 6f 20 6f 70  of 0 means to op
32500 65 72 61 74 65 20 6f 6e 20 74 68 65 20 6f 75 74  erate on the out
32510 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e 74  ermost savepoint
32520 0a 2a 2a 20 28 74 68 65 20 66 69 72 73 74 20 63  .** (the first c
32530 72 65 61 74 65 64 29 2e 20 41 20 76 61 6c 75 65  reated). A value
32540 20 6f 66 20 28 50 61 67 65 72 2e 6e 53 61 76 65   of (Pager.nSave
32550 70 6f 69 6e 74 2d 31 29 20 6d 65 61 6e 73 20 6f  point-1) means o
32560 70 65 72 61 74 65 0a 2a 2a 20 6f 6e 20 74 68 65  perate.** on the
32570 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
32580 72 65 61 74 65 64 20 73 61 76 65 70 6f 69 6e 74  reated savepoint
32590 2e 20 49 66 20 69 53 61 76 65 70 6f 69 6e 74 20  . If iSavepoint 
325a0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  is greater than.
325b0 2a 2a 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70  ** (Pager.nSavep
325c0 6f 69 6e 74 2d 31 29 2c 20 74 68 65 6e 20 74 68  oint-1), then th
325d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
325e0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
325f0 20 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75   a negative valu
32600 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74  e is passed to t
32610 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  his function, th
32620 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  en the current.*
32630 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
32640 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68   rolled back. Th
32650 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  is is different 
32660 74 6f 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73  to calling .** s
32670 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
32680 61 63 6b 28 29 20 62 65 63 61 75 73 65 20 74 68  ack() because th
32690 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
326a0 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 0a 2a   not terminate.*
326b0 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
326c0 6e 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 20  n or unlock the 
326d0 64 61 74 61 62 61 73 65 2c 20 69 74 20 6a 75 73  database, it jus
326e0 74 20 72 65 73 74 6f 72 65 73 20 74 68 65 20 0a  t restores the .
326f0 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
32700 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
32710 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
32720 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 79  e. .**.** In any
32730 20 63 61 73 65 2c 20 61 6c 6c 20 73 61 76 65 70   case, all savep
32740 6f 69 6e 74 73 20 77 69 74 68 20 61 6e 20 69 6e  oints with an in
32750 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e  dex greater than
32760 20 69 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20   iSavepoint .** 
32770 61 72 65 20 64 65 73 74 72 6f 79 65 64 2e 20 49  are destroyed. I
32780 66 20 74 68 69 73 20 69 73 20 61 20 72 65 6c 65  f this is a rele
32790 61 73 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6f  ase operation (o
327a0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
327b0 45 41 53 45 29 2c 0a 2a 2a 20 74 68 65 6e 20 73  EASE),.** then s
327c0 61 76 65 70 6f 69 6e 74 20 69 53 61 76 65 70 6f  avepoint iSavepo
327d0 69 6e 74 20 69 73 20 61 6c 73 6f 20 64 65 73 74  int is also dest
327e0 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  royed..**.** Thi
327f0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72  s function may r
32800 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
32810 45 4d 20 69 66 20 61 20 6d 65 6d 6f 72 79 20 61  EM if a memory a
32820 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
32830 0a 2a 2a 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  .** or an IO err
32840 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 49 4f  or code if an IO
32850 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32860 69 6c 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  ile rolling back
32870 20 61 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74   a .** savepoint
32880 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 73 20 6f  . If no errors o
32890 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ccur, SQLITE_OK 
328a0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 20  is returned..*/ 
328b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
328c0 72 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72  rSavepoint(Pager
328d0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6f 70   *pPager, int op
328e0 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  , int iSavepoint
328f0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
32900 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
32910 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  rt( op==SAVEPOIN
32920 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d  T_RELEASE || op=
32930 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
32940 41 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ACK );.  assert(
32950 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c   iSavepoint>=0 |
32960 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  | op==SAVEPOINT_
32970 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 0a 20 20 69  ROLLBACK );..  i
32980 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 70 50  f( iSavepoint<pP
32990 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
329a0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 20   ){.    int ii; 
329b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
329c0 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
329d0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 3b  */.    int nNew;
329e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
329f0 62 65 72 20 6f 66 20 72 65 6d 61 69 6e 69 6e 67  ber of remaining
32a00 20 73 61 76 65 70 6f 69 6e 74 73 20 61 66 74 65   savepoints afte
32a10 72 20 74 68 69 73 20 6f 70 2e 20 2a 2f 0a 0a 20  r this op. */.. 
32a20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
32a30 20 68 6f 77 20 6d 61 6e 79 20 73 61 76 65 70 6f   how many savepo
32a40 69 6e 74 73 20 77 69 6c 6c 20 73 74 69 6c 6c 20  ints will still 
32a50 62 65 20 61 63 74 69 76 65 20 61 66 74 65 72 20  be active after 
32a60 74 68 69 73 0a 20 20 20 20 2a 2a 20 6f 70 65 72  this.    ** oper
32a70 61 74 69 6f 6e 2e 20 53 74 6f 72 65 20 74 68 69  ation. Store thi
32a80 73 20 76 61 6c 75 65 20 69 6e 20 6e 4e 65 77 2e  s value in nNew.
32a90 20 54 68 65 6e 20 66 72 65 65 20 72 65 73 6f 75   Then free resou
32aa0 72 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  rces associated 
32ab0 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e 79  .    ** with any
32ac0 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68 61 74   savepoints that
32ad0 20 61 72 65 20 64 65 73 74 72 6f 79 65 64 20 62   are destroyed b
32ae0 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
32af0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 65  ..    */.    nNe
32b00 77 20 3d 20 69 53 61 76 65 70 6f 69 6e 74 20 2b  w = iSavepoint +
32b10 20 28 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   (( op==SAVEPOIN
32b20 54 5f 52 45 4c 45 41 53 45 20 29 20 3f 20 30 20  T_RELEASE ) ? 0 
32b30 3a 20 31 29 3b 0a 20 20 20 20 66 6f 72 28 69 69  : 1);.    for(ii
32b40 3d 6e 4e 65 77 3b 20 69 69 3c 70 50 61 67 65 72  =nNew; ii<pPager
32b50 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
32b60 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
32b70 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
32b80 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
32b90 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f  nt[ii].pInSavepo
32ba0 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  int);.    }.    
32bb0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
32bc0 6e 74 20 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20 20  nt = nNew;..    
32bd0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
32be0 72 65 6c 65 61 73 65 20 6f 66 20 74 68 65 20 6f  release of the o
32bf0 75 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69  utermost savepoi
32c00 6e 74 2c 20 74 72 75 6e 63 61 74 65 20 0a 20 20  nt, truncate .  
32c10 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75    ** the sub-jou
32c20 72 6e 61 6c 20 74 6f 20 7a 65 72 6f 20 62 79 74  rnal to zero byt
32c30 65 73 20 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20  es in size. */. 
32c40 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50     if( op==SAVEP
32c50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a  OINT_RELEASE ){.
32c60 20 20 20 20 20 20 69 66 28 20 6e 4e 65 77 3d 3d        if( nNew==
32c70 30 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  0 && isOpen(pPag
32c80 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20  er->sjfd) ){.   
32c90 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74 72 75       /* Only tru
32ca0 6e 63 61 74 65 20 69 66 20 69 74 20 69 73 20 61  ncate if it is a
32cb0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d  n in-memory sub-
32cc0 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20  journal. */.    
32cd0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
32ce0 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sMemJournal(pPag
32cf0 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20  er->sjfd) ){.   
32d00 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
32d10 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
32d20 61 67 65 72 2d 3e 73 6a 66 64 2c 20 30 29 3b 0a  ager->sjfd, 0);.
32d30 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
32d40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32d50 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
32d60 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75       pPager->nSu
32d70 62 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  bRec = 0;.      
32d80 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45  }.    }.    /* E
32d90 6c 73 65 20 74 68 69 73 20 69 73 20 61 20 72 6f  lse this is a ro
32da0 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
32db0 2c 20 70 6c 61 79 62 61 63 6b 20 74 68 65 20 73  , playback the s
32dc0 70 65 63 69 66 69 65 64 20 73 61 76 65 70 6f 69  pecified savepoi
32dd0 6e 74 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68  nt..    ** If th
32de0 69 73 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  is is a temp-fil
32df0 65 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  e, it is possibl
32e00 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
32e10 61 6c 20 66 69 6c 65 20 68 61 73 0a 20 20 20 20  al file has.    
32e20 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ** not yet been 
32e30 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  opened. In this 
32e40 63 61 73 65 20 74 68 65 72 65 20 68 61 76 65 20  case there have 
32e50 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20  been no changes 
32e60 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  to.    ** the da
32e70 74 61 62 61 73 65 20 66 69 6c 65 2c 20 73 6f 20  tabase file, so 
32e80 74 68 65 20 70 6c 61 79 62 61 63 6b 20 6f 70 65  the playback ope
32e90 72 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 73 6b  ration can be sk
32ea0 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ipped..    */.  
32eb0 20 20 65 6c 73 65 20 69 66 28 20 70 61 67 65 72    else if( pager
32ec0 55 73 65 4c 6f 67 28 70 50 61 67 65 72 29 20 7c  UseLog(pPager) |
32ed0 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
32ee0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 50  >jfd) ){.      P
32ef0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
32f00 53 61 76 65 70 6f 69 6e 74 20 3d 20 28 6e 4e 65  Savepoint = (nNe
32f10 77 3d 3d 30 29 3f 30 3a 26 70 50 61 67 65 72 2d  w==0)?0:&pPager-
32f20 3e 61 53 61 76 65 70 6f 69 6e 74 5b 6e 4e 65 77  >aSavepoint[nNew
32f30 2d 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  -1];.      rc = 
32f40 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76  pagerPlaybackSav
32f50 65 70 6f 69 6e 74 28 70 50 61 67 65 72 2c 20 70  epoint(pPager, p
32f60 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
32f70 20 20 61 73 73 65 72 74 28 72 63 21 3d 53 51 4c    assert(rc!=SQL
32f80 49 54 45 5f 44 4f 4e 45 29 3b 0a 20 20 20 20 7d  ITE_DONE);.    }
32f90 0a 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  .  .  }.  return
32fa0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
32fb0 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61  turn the full pa
32fc0 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  thname of the da
32fd0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
32fe0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
32ff0 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65  te3PagerFilename
33000 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
33010 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
33020 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  ->zFilename;.}..
33030 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
33040 20 56 46 53 20 73 74 72 75 63 74 75 72 65 20 66   VFS structure f
33050 6f 72 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f  or the pager..*/
33060 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 76  .const sqlite3_v
33070 66 73 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  fs *sqlite3Pager
33080 56 66 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  Vfs(Pager *pPage
33090 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
330a0 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a  ger->pVfs;.}../*
330b0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
330c0 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20 74  ile handle for t
330d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
330e0 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
330f0 69 74 68 20 74 68 65 20 70 61 67 65 72 2e 20 20  ith the pager.  
33100 54 68 69 73 20 6d 69 67 68 74 20 72 65 74 75 72  This might retur
33110 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66 69  n NULL if the fi
33120 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65  le has.** not ye
33130 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a  t been opened..*
33140 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  /.sqlite3_file *
33150 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
33160 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
33170 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
33180 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ->fd;.}../*.** R
33190 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
331a0 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a  athname of the j
331b0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a  ournal file..*/.
331c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
331d0 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e  te3PagerJournaln
331e0 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
331f0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
33200 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d  ger->zJournal;.}
33210 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
33220 72 75 65 20 69 66 20 66 73 79 6e 63 28 29 20 63  rue if fsync() c
33230 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65  alls are disable
33240 64 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  d for this pager
33250 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a  .  Return FALSE.
33260 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20 61  ** if fsync()s a
33270 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d  re executed norm
33280 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ally..*/.int sql
33290 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28  ite3PagerNosync(
332a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
332b0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
332c0 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64  >noSync;.}..#ifd
332d0 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
332e0 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72  DEC./*.** Set or
332f0 20 72 65 74 72 69 65 76 65 20 74 68 65 20 63 6f   retrieve the co
33300 64 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67  dec for this pag
33310 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  er.*/.static voi
33320 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
33330 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20  tCodec(.  Pager 
33340 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20  *pPager,.  void 
33350 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
33360 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
33370 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  ,.  void (*xCode
33380 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a  cSizeChng)(void*
33390 2c 69 6e 74 2c 69 6e 74 29 2c 0a 20 20 76 6f 69  ,int,int),.  voi
333a0 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29 28  d (*xCodecFree)(
333b0 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 20 2a  void*),.  void *
333c0 70 43 6f 64 65 63 0a 29 7b 0a 20 20 69 66 28 20  pCodec.){.  if( 
333d0 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72  pPager->xCodecFr
333e0 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f  ee ) pPager->xCo
333f0 64 65 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e  decFree(pPager->
33400 70 43 6f 64 65 63 29 3b 0a 20 20 70 50 61 67 65  pCodec);.  pPage
33410 72 2d 3e 78 43 6f 64 65 63 20 3d 20 70 50 61 67  r->xCodec = pPag
33420 65 72 2d 3e 6d 65 6d 44 62 20 3f 20 30 20 3a 20  er->memDb ? 0 : 
33430 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72  xCodec;.  pPager
33440 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  ->xCodecSizeChng
33450 20 3d 20 78 43 6f 64 65 63 53 69 7a 65 43 68 6e   = xCodecSizeChn
33460 67 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  g;.  pPager->xCo
33470 64 65 63 46 72 65 65 20 3d 20 78 43 6f 64 65 63  decFree = xCodec
33480 46 72 65 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Free;.  pPager->
33490 70 43 6f 64 65 63 20 3d 20 70 43 6f 64 65 63 3b  pCodec = pCodec;
334a0 0a 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69  .  pagerReportSi
334b0 7a 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 73 74  ze(pPager);.}.st
334c0 61 74 69 63 20 76 6f 69 64 20 2a 73 71 6c 69 74  atic void *sqlit
334d0 65 33 50 61 67 65 72 47 65 74 43 6f 64 65 63 28  e3PagerGetCodec(
334e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
334f0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
33500 3e 70 43 6f 64 65 63 3b 0a 7d 0a 23 65 6e 64 69  >pCodec;.}.#endi
33510 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
33520 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
33530 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  M./*.** Move the
33540 20 70 61 67 65 20 70 50 67 20 74 6f 20 6c 6f 63   page pPg to loc
33550 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68  ation pgno in th
33560 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
33570 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72  ere must be no r
33580 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
33590 20 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79   page previously
335a0 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20 70   located at.** p
335b0 67 6e 6f 20 28 77 68 69 63 68 20 77 65 20 63 61  gno (which we ca
335c0 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f 75 67  ll pPgOld) thoug
335d0 68 20 74 68 61 74 20 70 61 67 65 20 69 73 20 61  h that page is a
335e0 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a 20  llowed to be.** 
335f0 69 6e 20 63 61 63 68 65 2e 20 20 49 66 20 74 68  in cache.  If th
33600 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c  e page previousl
33610 79 20 6c 6f 63 61 74 65 64 20 61 74 20 70 67 6e  y located at pgn
33620 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  o is not already
33630 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  .** in the rollb
33640 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ack journal, it 
33650 69 73 20 6e 6f 74 20 70 75 74 20 74 68 65 72 65  is not put there
33660 20 62 79 20 62 79 20 74 68 69 73 20 72 6f 75 74   by by this rout
33670 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72  ine..**.** Refer
33680 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
33690 65 20 70 50 67 20 72 65 6d 61 69 6e 20 76 61 6c  e pPg remain val
336a0 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79  id. Updating any
336b0 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73  .** meta-data as
336c0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50  sociated with pP
336d0 67 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f  g (i.e. data sto
336e0 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72  red in the nExtr
336f0 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63  a bytes.** alloc
33700 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  ated along with 
33710 74 68 65 20 70 61 67 65 29 20 69 73 20 74 68 65  the page) is the
33720 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
33730 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  of the caller..*
33740 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69  *.** A transacti
33750 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69 76  on must be activ
33760 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
33770 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49  ine is called. I
33780 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20  t used to be.** 
33790 72 65 71 75 69 72 65 64 20 74 68 61 74 20 61 20  required that a 
337a0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
337b0 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63  ction was not ac
337c0 74 69 76 65 2c 20 62 75 74 20 74 68 69 73 20 72  tive, but this r
337d0 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61  estriction.** ha
337e0 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28  s been removed (
337f0 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65  CREATE INDEX nee
33800 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67  ds to move a pag
33810 65 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65  e when a stateme
33820 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
33830 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2a  n is active)..**
33840 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 75 72 74  .** If the fourt
33850 68 20 61 72 67 75 6d 65 6e 74 2c 20 69 73 43 6f  h argument, isCo
33860 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e 2d 7a 65 72  mmit, is non-zer
33870 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67  o, then this pag
33880 65 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 6d 6f  e is being.** mo
33890 76 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  ved as part of a
338a0 20 64 61 74 61 62 61 73 65 20 72 65 6f 72 67 61   database reorga
338b0 6e 69 7a 61 74 69 6f 6e 20 6a 75 73 74 20 62 65  nization just be
338c0 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
338d0 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 62 65 69 6e  tion .** is bein
338e0 67 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 6e 20  g committed. In 
338f0 74 68 69 73 20 63 61 73 65 2c 20 69 74 20 69 73  this case, it is
33900 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
33910 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61   the database pa
33920 67 65 20 0a 2a 2a 20 70 50 67 20 72 65 66 65 72  ge .** pPg refer
33930 73 20 74 6f 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s to will not be
33940 20 77 72 69 74 74 65 6e 20 74 6f 20 61 67 61 69   written to agai
33950 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  n within this tr
33960 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
33970 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
33980 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
33990 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20  _NOMEM or an IO 
339a0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
339b0 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73   error.** occurs
339c0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
339d0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
339e0 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
339f0 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 50  3PagerMovepage(P
33a00 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44 62  ager *pPager, Db
33a10 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20  Page *pPg, Pgno 
33a20 70 67 6e 6f 2c 20 69 6e 74 20 69 73 43 6f 6d 6d  pgno, int isComm
33a30 69 74 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  it){.  PgHdr *pP
33a40 67 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  gOld;           
33a50 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
33a60 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65  being overwritte
33a70 6e 2e 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 65  n. */.  Pgno nee
33a80 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 20 20  dSyncPgno = 0;  
33a90 20 20 20 20 20 2f 2a 20 4f 6c 64 20 76 61 6c 75       /* Old valu
33aa0 65 20 6f 66 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  e of pPg->pgno, 
33ab0 69 66 20 73 79 6e 63 20 69 73 20 72 65 71 75 69  if sync is requi
33ac0 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  red */.  int rc;
33ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33ae0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
33af0 63 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f  code */.  Pgno o
33b00 72 69 67 50 67 6e 6f 3b 20 20 20 20 20 20 20 20  rigPgno;        
33b10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 72         /* The or
33b20 69 67 69 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62  iginal page numb
33b30 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
33b40 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
33b50 0a 20 20 2f 2a 20 49 6e 20 6f 72 64 65 72 20 74  .  /* In order t
33b60 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c  o be able to rol
33b70 6c 62 61 63 6b 2c 20 61 6e 20 69 6e 2d 6d 65 6d  lback, an in-mem
33b80 6f 72 79 20 64 61 74 61 62 61 73 65 20 6d 75 73  ory database mus
33b90 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 74  t journal.  ** t
33ba0 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 6d  he page we are m
33bb0 6f 76 69 6e 67 20 66 72 6f 6d 2e 0a 20 20 2a 2f  oving from..  */
33bc0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
33bd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33be0 50 61 67 65 72 57 72 69 74 65 28 70 50 67 29 3b  PagerWrite(pPg);
33bf0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
33c00 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
33c10 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 62  /* If the page b
33c20 65 69 6e 67 20 6d 6f 76 65 64 20 69 73 20 64 69  eing moved is di
33c30 72 74 79 20 61 6e 64 20 68 61 73 20 6e 6f 74 20  rty and has not 
33c40 62 65 65 6e 20 73 61 76 65 64 20 62 79 20 74 68  been saved by th
33c50 65 20 6c 61 74 65 73 74 0a 20 20 2a 2a 20 73 61  e latest.  ** sa
33c60 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20 73 61  vepoint, then sa
33c70 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ve the current c
33c80 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
33c90 61 67 65 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  age into the .  
33ca0 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6e  ** sub-journal n
33cb0 6f 77 2e 20 54 68 69 73 20 69 73 20 72 65 71 75  ow. This is requ
33cc0 69 72 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74  ired to handle t
33cd0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65  he following sce
33ce0 6e 61 72 69 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nario:.  **.  **
33cf0 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20     BEGIN;.  **  
33d00 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65     <journal page
33d10 20 58 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 20   X, then modify 
33d20 69 74 20 69 6e 20 6d 65 6d 6f 72 79 3e 0a 20 20  it in memory>.  
33d30 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54  **     SAVEPOINT
33d40 20 6f 6e 65 3b 0a 20 20 2a 2a 20 20 20 20 20 20   one;.  **      
33d50 20 3c 4d 6f 76 65 20 70 61 67 65 20 58 20 74 6f   <Move page X to
33d60 20 6c 6f 63 61 74 69 6f 6e 20 59 3e 0a 20 20 2a   location Y>.  *
33d70 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54  *     ROLLBACK T
33d80 4f 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  O one;.  **.  **
33d90 20 49 66 20 70 61 67 65 20 58 20 77 65 72 65 20   If page X were 
33da0 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  not written to t
33db0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 68  he sub-journal h
33dc0 65 72 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f  ere, it would no
33dd0 74 0a 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62  t.  ** be possib
33de0 6c 65 20 74 6f 20 72 65 73 74 6f 72 65 20 69 74  le to restore it
33df0 73 20 63 6f 6e 74 65 6e 74 73 20 77 68 65 6e 20  s contents when 
33e00 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  the "ROLLBACK TO
33e10 20 6f 6e 65 22 0a 20 20 2a 2a 20 73 74 61 74 65   one".  ** state
33e20 6d 65 6e 74 20 77 65 72 65 20 69 73 20 70 72 6f  ment were is pro
33e30 63 65 73 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  cessed..  **.  *
33e40 2a 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  * subjournalPage
33e50 28 29 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 61  () may need to a
33e60 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 74 6f  llocate space to
33e70 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f   store pPg->pgno
33e80 20 69 6e 74 6f 0a 20 20 2a 2a 20 6f 6e 65 20 6f   into.  ** one o
33e90 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74  r more savepoint
33ea0 20 62 69 74 76 65 63 73 2e 20 54 68 69 73 20 69   bitvecs. This i
33eb0 73 20 74 68 65 20 72 65 61 73 6f 6e 20 74 68 69  s the reason thi
33ec0 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  s function.  ** 
33ed0 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
33ee0 45 5f 4e 4f 4d 45 4d 2e 0a 20 20 2a 2f 0a 20 20  E_NOMEM..  */.  
33ef0 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  if( pPg->flags&P
33f00 47 48 44 52 5f 44 49 52 54 59 0a 20 20 20 26 26  GHDR_DIRTY.   &&
33f10 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
33f20 65 28 70 50 67 29 0a 20 20 20 26 26 20 53 51 4c  e(pPg).   && SQL
33f30 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 75  ITE_OK!=(rc = su
33f40 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
33f50 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
33f60 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41  rn rc;.  }..  PA
33f70 47 45 52 54 52 41 43 45 28 28 22 4d 4f 56 45 20  GERTRACE(("MOVE 
33f80 25 64 20 70 61 67 65 20 25 64 20 28 6e 65 65 64  %d page %d (need
33f90 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74  Sync=%d) moves t
33fa0 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  o %d\n", .      
33fb0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
33fc0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 70 50 67   pPg->pgno, (pPg
33fd0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
33fe0 45 44 5f 53 59 4e 43 29 3f 31 3a 30 2c 20 70 67  ED_SYNC)?1:0, pg
33ff0 6e 6f 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  no));.  IOTRACE(
34000 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c  ("MOVE %p %d %d\
34010 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
34020 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20  >pgno, pgno)).. 
34030 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   /* If the journ
34040 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  al needs to be s
34050 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 70  ync()ed before p
34060 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20 63 61  age pPg->pgno ca
34070 6e 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65  n.  ** be writte
34080 6e 20 74 6f 2c 20 73 74 6f 72 65 20 70 50 67 2d  n to, store pPg-
34090 3e 70 67 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20 76  >pgno in local v
340a0 61 72 69 61 62 6c 65 20 6e 65 65 64 53 79 6e 63  ariable needSync
340b0 50 67 6e 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Pgno..  **.  ** 
340c0 49 66 20 74 68 65 20 69 73 43 6f 6d 6d 69 74 20  If the isCommit 
340d0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
340e0 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
340f0 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 20   remember that. 
34100 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
34110 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
34120 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61  ()ed before data
34130 62 61 73 65 20 70 61 67 65 20 70 50 67 2d 3e 70  base page pPg->p
34140 67 6e 6f 20 0a 20 20 2a 2a 20 63 61 6e 20 62 65  gno .  ** can be
34150 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65   written to. The
34160 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65   caller has alre
34170 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74  ady promised not
34180 20 74 6f 20 77 72 69 74 65 20 74 6f 20 69 74 2e   to write to it.
34190 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 67  .  */.  if( (pPg
341a0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
341b0 45 44 5f 53 59 4e 43 29 20 26 26 20 21 69 73 43  ED_SYNC) && !isC
341c0 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 6e 65 65  ommit ){.    nee
341d0 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d  dSyncPgno = pPg-
341e0 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72  >pgno;.    asser
341f0 74 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  t( pageInJournal
34200 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67  (pPg) || pPg->pg
34210 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  no>pPager->dbOri
34220 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73  gSize );.    ass
34230 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26  ert( pPg->flags&
34240 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20  PGHDR_DIRTY );. 
34250 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
34260 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
34270 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
34280 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61  cache contains a
34290 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65 2d   page with page-
342a0 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d  number pgno, rem
342b0 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d  ove it.  ** from
342c0 20 69 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e   its hash chain.
342d0 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67   Also, if the Pg
342e0 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73  Hdr.needSync was
342f0 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70   set for .  ** p
34300 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20  age pgno before 
34310 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61  the 'move' opera
34320 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74  tion, it needs t
34330 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20  o be retained . 
34340 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65   ** for the page
34350 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20   moved there..  
34360 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  */.  pPg->flags 
34370 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 53  &= ~PGHDR_NEED_S
34380 59 4e 43 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20  YNC;.  pPgOld = 
34390 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
343a0 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73  ger, pgno);.  as
343b0 73 65 72 74 28 20 21 70 50 67 4f 6c 64 20 7c 7c  sert( !pPgOld ||
343c0 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 31   pPgOld->nRef==1
343d0 20 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64   );.  if( pPgOld
343e0 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61   ){.    pPg->fla
343f0 67 73 20 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e 66  gs |= (pPgOld->f
34400 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
34410 53 59 4e 43 29 3b 0a 20 20 20 20 69 66 28 20 4d  SYNC);.    if( M
34420 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a  EMDB ){.      /*
34430 20 44 6f 20 6e 6f 74 20 64 69 73 63 61 72 64 20   Do not discard 
34440 70 61 67 65 73 20 66 72 6f 6d 20 61 6e 20 69 6e  pages from an in
34450 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
34460 20 73 69 6e 63 65 20 77 65 20 6d 69 67 68 74 0a   since we might.
34470 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f        ** need to
34480 20 72 6f 6c 6c 62 61 63 6b 20 6c 61 74 65 72 2e   rollback later.
34490 20 20 4a 75 73 74 20 6d 6f 76 65 20 74 68 65 20    Just move the 
344a0 70 61 67 65 20 6f 75 74 20 6f 66 20 74 68 65 20  page out of the 
344b0 77 61 79 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  way. */.      as
344c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
344d0 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 20  SizeValid );.   
344e0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
344f0 4d 6f 76 65 28 70 50 67 4f 6c 64 2c 20 70 50 61  Move(pPgOld, pPa
34500 67 65 72 2d 3e 64 62 53 69 7a 65 2b 31 29 3b 0a  ger->dbSize+1);.
34510 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34520 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
34530 6f 70 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20  op(pPgOld);.    
34540 7d 0a 20 20 7d 0a 0a 20 20 6f 72 69 67 50 67 6e  }.  }..  origPgn
34550 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
34560 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 6f   sqlite3PcacheMo
34570 76 65 28 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20  ve(pPg, pgno);. 
34580 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
34590 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
345a0 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
345b0 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e  ed = 1;..  if( n
345c0 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20  eedSyncPgno ){. 
345d0 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e     /* If needSyn
345e0 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72  cPgno is non-zer
345f0 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  o, then the jour
34600 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74  nal file needs t
34610 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e  o be .    ** syn
34620 63 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79  c()ed before any
34630 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
34640 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c   to database fil
34650 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50  e page needSyncP
34660 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72  gno..    ** Curr
34670 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70  ently, no such p
34680 61 67 65 20 65 78 69 73 74 73 20 69 6e 20 74 68  age exists in th
34690 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64  e page-cache and
346a0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 22 69 73   the .    ** "is
346b0 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62 69 74 76   journaled" bitv
346c0 65 63 20 66 6c 61 67 20 68 61 73 20 62 65 65 6e  ec flag has been
346d0 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73   set. This needs
346e0 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20   to be remedied 
346f0 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e  by.    ** loadin
34700 67 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  g the page into 
34710 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
34720 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65 20  and setting the 
34730 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 0a  PgHdr.needSync .
34740 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a 20 20 20      ** flag..   
34750 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
34760 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61  e attempt to loa
34770 64 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  d the page into 
34780 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 66  the page-cache f
34790 61 69 6c 73 2c 20 28 64 75 65 0a 20 20 20 20 2a  ails, (due.    *
347a0 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28 29 20  * to a malloc() 
347b0 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 29 2c 20  or IO failure), 
347c0 63 6c 65 61 72 20 74 68 65 20 62 69 74 20 69 6e  clear the bit in
347d0 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e 61 6c 5b   the pInJournal[
347e0 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61 79 2e 20  ].    ** array. 
347f0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
34800 65 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  e page is loaded
34810 20 61 6e 64 20 77 72 69 74 74 65 6e 20 61 67 61   and written aga
34820 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 69  in in.    ** thi
34830 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  s transaction, i
34840 74 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e  t may be written
34850 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
34860 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 20 20 20   file before.   
34870 20 2a 2a 20 69 74 20 69 73 20 73 79 6e 63 65 64   ** it is synced
34880 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
34890 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 77 61 79  l file. This way
348a0 2c 20 69 74 20 6d 61 79 20 65 6e 64 20 75 70 20  , it may end up 
348b0 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  in.    ** the jo
348c0 75 72 6e 61 6c 20 66 69 6c 65 20 74 77 69 63 65  urnal file twice
348d0 2c 20 62 75 74 20 74 68 61 74 20 69 73 20 6e 6f  , but that is no
348e0 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 20  t a problem..   
348f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
34900 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
34910 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20   call may cause 
34920 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73  the journal to s
34930 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20  ync. So make.   
34940 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61 67   ** sure the Pag
34950 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
34960 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20   is set too..   
34970 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a 70   */.    PgHdr *p
34980 50 67 48 64 72 3b 0a 20 20 20 20 61 73 73 65 72  PgHdr;.    asser
34990 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
349a0 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ync );.    rc = 
349b0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
349c0 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63  pPager, needSync
349d0 50 67 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a  Pgno, &pPgHdr);.
349e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
349f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
34a00 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 3c  f( needSyncPgno<
34a10 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
34a20 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ize ){.        a
34a30 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
34a40 54 6d 70 53 70 61 63 65 21 3d 30 20 29 3b 0a 20  TmpSpace!=0 );. 
34a50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69         sqlite3Bi
34a60 74 76 65 63 43 6c 65 61 72 28 70 50 61 67 65 72  tvecClear(pPager
34a70 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65  ->pInJournal, ne
34a80 65 64 53 79 6e 63 50 67 6e 6f 2c 20 70 50 61 67  edSyncPgno, pPag
34a90 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
34aa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
34ab0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
34ac0 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
34ad0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 61 73 73  ync = 1;.    ass
34ae0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ert( pPager->noS
34af0 79 6e 63 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42  ync==0 && !MEMDB
34b00 20 29 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e   );.    pPgHdr->
34b10 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
34b20 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 73 71  EED_SYNC;.    sq
34b30 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
34b40 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20  irty(pPgHdr);.  
34b50 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
34b60 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d  ref(pPgHdr);.  }
34b70 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 6f 72 20  ..  /*.  ** For 
34b80 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
34b90 61 62 61 73 65 2c 20 6d 61 6b 65 20 73 75 72 65  abase, make sure
34ba0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
34bb0 67 65 20 63 6f 6e 74 69 6e 75 65 73 0a 20 20 2a  ge continues.  *
34bc0 2a 20 74 6f 20 65 78 69 73 74 2c 20 69 6e 20 63  * to exist, in c
34bd0 61 73 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ase the transact
34be0 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 72 6f 6c  ion needs to rol
34bf0 6c 20 62 61 63 6b 2e 20 20 55 73 65 20 70 50 67  l back.  Use pPg
34c00 4f 6c 64 0a 20 20 2a 2a 20 61 73 20 74 68 65 20  Old.  ** as the 
34c10 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 73 69  original page si
34c20 6e 63 65 20 69 74 20 68 61 73 20 61 6c 72 65 61  nce it has alrea
34c30 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
34c40 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45  d..  */.  if( ME
34c50 4d 44 42 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MDB ){.    sqlit
34c60 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67  e3PcacheMove(pPg
34c70 4f 6c 64 2c 20 6f 72 69 67 50 67 6e 6f 29 3b 0a  Old, origPgno);.
34c80 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
34c90 55 6e 72 65 66 28 70 50 67 4f 6c 64 29 3b 0a 20  Unref(pPgOld);. 
34ca0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
34cb0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
34cc0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
34cd0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
34ce0 64 61 74 61 20 66 6f 72 20 74 68 65 20 73 70 65  data for the spe
34cf0 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a  cified page..*/.
34d00 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
34d10 65 72 47 65 74 44 61 74 61 28 44 62 50 61 67 65  erGetData(DbPage
34d20 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74   *pPg){.  assert
34d30 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 7c 7c  ( pPg->nRef>0 ||
34d40 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65   pPg->pPager->me
34d50 6d 44 62 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  mDb );.  return 
34d60 70 50 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a 2f  pPg->pData;.}../
34d70 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
34d80 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
34d90 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20  er.nExtra bytes 
34da0 6f 66 20 22 65 78 74 72 61 22 20 73 70 61 63 65  of "extra" space
34db0 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61   .** allocated a
34dc0 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73 70  long with the sp
34dd0 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
34de0 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
34df0 67 65 72 47 65 74 45 78 74 72 61 28 44 62 50 61  gerGetExtra(DbPa
34e00 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
34e10 72 6e 20 70 50 67 2d 3e 70 45 78 74 72 61 3b 0a  rn pPg->pExtra;.
34e20 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74  }../*.** Get/set
34e30 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64   the locking-mod
34e40 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
34e50 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64  . Parameter eMod
34e60 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a  e must be one.**
34e70 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e   of PAGER_LOCKIN
34e80 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47  GMODE_QUERY, PAG
34e90 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
34ea0 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47  ORMAL or .** PAG
34eb0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
34ec0 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68 65  XCLUSIVE. If the
34ed0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
34ee0 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a  t _QUERY, then.*
34ef0 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  * the locking-mo
34f00 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  de is set to the
34f10 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64   value specified
34f20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
34f30 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65 69  rned value is ei
34f40 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ther PAGER_LOCKI
34f50 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72  NGMODE_NORMAL or
34f60 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  .** PAGER_LOCKIN
34f70 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2c  GMODE_EXCLUSIVE,
34f80 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20   indicating the 
34f90 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c  current (possibl
34fa0 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f  y updated).** lo
34fb0 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69  cking-mode..*/.i
34fc0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nt sqlite3PagerL
34fd0 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65 72  ockingMode(Pager
34fe0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d   *pPager, int eM
34ff0 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ode){.  assert( 
35000 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
35010 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20  KINGMODE_QUERY. 
35020 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
35030 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
35040 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20  NGMODE_NORMAL.  
35050 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
35060 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
35070 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
35080 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
35090 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51  ER_LOCKINGMODE_Q
350a0 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65  UERY<0 );.  asse
350b0 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
350c0 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20  GMODE_NORMAL>=0 
350d0 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  && PAGER_LOCKING
350e0 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d  MODE_EXCLUSIVE>=
350f0 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65  0 );.  if( eMode
35100 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e  >=0 && !pPager->
35110 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
35120 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
35130 65 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64  eMode = (u8)eMod
35140 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
35150 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63  (int)pPager->exc
35160 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f  lusiveMode;.}../
35170 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65  *.** Get/set the
35180 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f   journal-mode fo
35190 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61  r this pager. Pa
351a0 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75  rameter eMode mu
351b0 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a 0a 2a 2a  st be one of:.**
351c0 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
351d0 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 2a  RNALMODE_QUERY.*
351e0 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e  *    PAGER_JOURN
351f0 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 2a 2a  ALMODE_DELETE.**
35200 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
35210 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 2a  LMODE_TRUNCATE.*
35220 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e  *    PAGER_JOURN
35230 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 2a  ALMODE_PERSIST.*
35240 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e  *    PAGER_JOURN
35250 41 4c 4d 4f 44 45 5f 4f 46 46 0a 2a 2a 20 20 20  ALMODE_OFF.**   
35260 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
35270 44 45 5f 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20  DE_MEMORY.**    
35280 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
35290 45 5f 57 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_WAL.**.** If t
352a0 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  he parameter is 
352b0 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e  not _QUERY, then
352c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   the journal_mod
352d0 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a  e is set to the.
352e0 2a 2a 20 76 61 6c 75 65 20 73 70 65 63 69 66 69  ** value specifi
352f0 65 64 20 69 66 20 74 68 65 20 63 68 61 6e 67 65  ed if the change
35300 20 69 73 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68   is allowed.  Th
35310 65 20 63 68 61 6e 67 65 20 69 73 20 64 69 73 61  e change is disa
35320 6c 6c 6f 77 65 64 0a 2a 2a 20 66 6f 72 20 74 68  llowed.** for th
35330 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 61 73  e following reas
35340 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ons:.**.**   *  
35350 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  An in-memory dat
35360 61 62 61 73 65 20 63 61 6e 20 6f 6e 6c 79 20 68  abase can only h
35370 61 76 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 5f  ave its journal_
35380 6d 6f 64 65 20 73 65 74 20 74 6f 20 5f 4f 46 46  mode set to _OFF
35390 0a 2a 2a 20 20 20 20 20 20 6f 72 20 5f 4d 45 4d  .**      or _MEM
353a0 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ORY..**.**   *  
353b0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  The journal mode
353c0 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 68 61 6e   may not be chan
353d0 67 65 64 20 77 68 69 6c 65 20 61 20 74 72 61 6e  ged while a tran
353e0 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
353f0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  e..**.** The ret
35400 75 72 6e 65 64 20 69 6e 64 69 63 61 74 65 20 74  urned indicate t
35410 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73  he current (poss
35420 69 62 6c 79 20 75 70 64 61 74 65 64 29 20 6a 6f  ibly updated) jo
35430 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69  urnal-mode..*/.i
35440 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a  nt sqlite3PagerJ
35450 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72  ournalMode(Pager
35460 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d   *pPager, int eM
35470 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ode){.  assert( 
35480 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
35490 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20  RNALMODE_QUERY. 
354a0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
354b0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
354c0 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20  ALMODE_DELETE.  
354d0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
354e0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
354f0 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 20  LMODE_TRUNCATE. 
35500 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
35510 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
35520 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20  ALMODE_PERSIST. 
35530 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
35540 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
35550 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
35560 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
35570 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
35580 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20  ODE_WAL .       
35590 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
355a0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
355b0 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 61 73 73  _MEMORY );.  ass
355c0 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e  ert( PAGER_JOURN
355d0 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29  ALMODE_QUERY<0 )
355e0 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30  ;.  if( eMode>=0
355f0 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
35600 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 65  tempFile==0 || e
35610 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
35620 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20  NALMODE_WAL).   
35630 26 26 20 28 21 4d 45 4d 44 42 20 7c 7c 20 65 4d  && (!MEMDB || eM
35640 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
35650 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 7c 7c 65  ALMODE_MEMORY||e
35660 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
35670 4e 41 4c 4d 4f 44 45 5f 4f 46 46 29 0a 20 20 20  NALMODE_OFF).   
35680 26 26 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f  && !pPager->dbMo
35690 64 69 66 69 65 64 0a 20 20 20 26 26 20 28 21 69  dified.   && (!i
356a0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
356b0 64 29 20 7c 7c 20 30 3d 3d 70 50 61 67 65 72 2d  d) || 0==pPager-
356c0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 0a 20 20 29  >journalOff).  )
356d0 7b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  {.    if( isOpen
356e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
356f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
35700 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
35710 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  d);.    }.    as
35720 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
35730 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
35740 45 20 26 20 31 29 3d 3d 31 20 29 3b 0a 20 20 20  E & 1)==1 );.   
35750 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
35760 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
35770 49 53 54 20 26 20 31 29 3d 3d 31 20 29 3b 0a 20  IST & 1)==1 );. 
35780 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
35790 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
357a0 4c 45 54 45 20 26 20 31 29 3d 3d 30 20 29 3b 0a  LETE & 1)==0 );.
357b0 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
357c0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
357d0 45 4d 4f 52 59 20 26 20 31 29 3d 3d 30 20 29 3b  EMORY & 1)==0 );
357e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
357f0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
35800 4f 46 46 20 26 20 31 29 3d 3d 30 20 29 3b 0a 20  OFF & 1)==0 );. 
35810 20 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e     if( (pPager->
35820 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 31 29  journalMode & 1)
35830 3d 3d 31 20 26 26 20 28 65 4d 6f 64 65 20 26 20  ==1 && (eMode & 
35840 31 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  1)==0.         &
35850 26 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  & !pPager->exclu
35860 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
35870 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
35880 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
35890 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
358a0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 0);.    }..   
358b0 20 2f 2a 20 53 77 69 74 63 68 69 6e 67 20 69 6e   /* Switching in
358c0 74 6f 20 57 41 4c 20 6d 6f 64 65 20 63 61 6e 20  to WAL mode can 
358d0 6f 6e 6c 79 20 74 61 6b 65 20 70 6c 61 63 65 20  only take place 
358e0 77 68 65 6e 20 6e 6f 20 0a 20 20 20 20 2a 2a 20  when no .    ** 
358f0 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20 6f  locks are held o
35900 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
35910 69 6c 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ile. .    */.   
35920 20 69 66 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45   if( eMode==PAGE
35930 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
35940 4c 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61  L && pPager->sta
35950 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
35960 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
35970 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f   (int)pPager->jo
35980 75 72 6e 61 6c 4d 6f 64 65 3b 0a 20 20 20 20 7d  urnalMode;.    }
35990 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ..    pPager->jo
359a0 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 28 75 38 29  urnalMode = (u8)
359b0 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74  eMode;.  }.  ret
359c0 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d  urn (int)pPager-
359d0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a  >journalMode;.}.
359e0 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74  ./*.** Get/set t
359f0 68 65 20 73 69 7a 65 2d 6c 69 6d 69 74 20 75 73  he size-limit us
35a00 65 64 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e  ed for persisten
35a10 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  t journal files.
35a20 0a 2a 2a 0a 2a 2a 20 53 65 74 74 69 6e 67 20 74  .**.** Setting t
35a30 68 65 20 73 69 7a 65 20 6c 69 6d 69 74 20 74 6f  he size limit to
35a40 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 20 6c 69 6d   -1 means no lim
35a50 69 74 20 69 73 20 65 6e 66 6f 72 63 65 64 2e 0a  it is enforced..
35a60 2a 2a 20 41 6e 20 61 74 74 65 6d 70 74 20 74 6f  ** An attempt to
35a70 20 73 65 74 20 61 20 6c 69 6d 69 74 20 73 6d 61   set a limit sma
35a80 6c 6c 65 72 20 74 68 61 6e 20 2d 31 20 69 73 20  ller than -1 is 
35a90 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 36 34 20  a no-op..*/.i64 
35aa0 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72  sqlite3PagerJour
35ab0 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 28 50 61 67  nalSizeLimit(Pag
35ac0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 36 34 20  er *pPager, i64 
35ad0 69 4c 69 6d 69 74 29 7b 0a 20 20 69 66 28 20 69  iLimit){.  if( i
35ae0 4c 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20 20 20  Limit>=-1 ){.   
35af0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
35b00 53 69 7a 65 4c 69 6d 69 74 20 3d 20 69 4c 69 6d  SizeLimit = iLim
35b10 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  it;.  }.  return
35b20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
35b30 53 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a  SizeLimit;.}../*
35b40 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
35b50 6e 74 65 72 20 74 6f 20 74 68 65 20 70 50 61 67  nter to the pPag
35b60 65 72 2d 3e 70 42 61 63 6b 75 70 20 76 61 72 69  er->pBackup vari
35b70 61 62 6c 65 2e 20 54 68 65 20 62 61 63 6b 75 70  able. The backup
35b80 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 6e 20 62 61   module.** in ba
35b90 63 6b 75 70 2e 63 20 6d 61 69 6e 74 61 69 6e 73  ckup.c maintains
35ba0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
35bb0 74 68 69 73 20 76 61 72 69 61 62 6c 65 2e 20 54  this variable. T
35bc0 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 75 73  his module.** us
35bd0 65 73 20 69 74 20 6f 70 61 71 75 65 6c 79 20 61  es it opaquely a
35be0 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f  s an argument to
35bf0 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
35c00 73 74 61 72 74 28 29 20 61 6e 64 0a 2a 2a 20 73  start() and.** s
35c10 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
35c20 74 65 28 29 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 71  te() only..*/.sq
35c30 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 2a 73  lite3_backup **s
35c40 71 6c 69 74 65 33 50 61 67 65 72 42 61 63 6b 75  qlite3PagerBacku
35c50 70 50 74 72 28 50 61 67 65 72 20 2a 70 50 61 67  pPtr(Pager *pPag
35c60 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 26 70  er){.  return &p
35c70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 3b 0a  Pager->pBackup;.
35c80 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
35c90 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
35ca0 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 69   when the user i
35cb0 6e 76 6f 6b 65 73 20 22 50 52 41 47 4d 41 20 63  nvokes "PRAGMA c
35cc0 68 65 63 6b 70 6f 69 6e 74 22 2e 0a 2a 2f 0a 69  heckpoint"..*/.i
35cd0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
35ce0 68 65 63 6b 70 6f 69 6e 74 28 50 61 67 65 72 20  heckpoint(Pager 
35cf0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
35d00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
35d10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 4c    if( pPager->pL
35d20 6f 67 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a 42  og ){.    u8 *zB
35d30 75 66 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65  uf = (u8 *)pPage
35d40 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
35d50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f    rc = sqlite3Lo
35d60 67 43 68 65 63 6b 70 6f 69 6e 74 28 70 50 61 67  gCheckpoint(pPag
35d70 65 72 2d 3e 70 4c 6f 67 2c 20 70 50 61 67 65 72  er->pLog, pPager
35d80 2d 3e 66 64 2c 20 0a 20 20 20 20 20 20 20 20 28  ->fd, .        (
35d90 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f  pPager->noSync ?
35da0 20 30 20 3a 20 70 50 61 67 65 72 2d 3e 73 79 6e   0 : pPager->syn
35db0 63 5f 66 6c 61 67 73 29 2c 0a 20 20 20 20 20 20  c_flags),.      
35dc0 20 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e    zBuf, pPager->
35dd0 78 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 50  xBusyHandler, pP
35de0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
35df0 65 72 41 72 67 0a 20 20 20 20 29 3b 0a 20 20 7d  erArg.    );.  }
35e00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
35e10 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
35e20 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f  E_OMIT_DISKIO */
35e30 0a                                               .