/ Hex Artifact Content
Login

Artifact 5d693cc6273c5406a21f1a2afa18309457273549:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 2f 2a 0a 2a 2a 2a 2a  "wal.h"../*.****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 20 4e 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45   NOTES ON THE DE
03a0: 53 49 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45  SIGN OF THE PAGE
03b0: 52 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  R **************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
03d0: 20 57 69 74 68 69 6e 20 74 68 69 73 20 63 6f 6d   Within this com
03e0: 6d 65 6e 74 20 62 6c 6f 63 6b 2c 20 61 20 70 61  ment block, a pa
03f0: 67 65 20 69 73 20 64 65 65 6d 65 64 20 74 6f 20  ge is deemed to 
0400: 68 61 76 65 20 62 65 65 6e 20 73 79 6e 63 65 64  have been synced
0410: 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
0420: 79 20 61 73 20 73 6f 6f 6e 20 61 73 20 69 74 20  y as soon as it 
0430: 69 73 20 77 72 69 74 74 65 6e 20 77 68 65 6e 20  is written when 
0440: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
0450: 75 73 3d 4f 46 46 2e 0a 2a 2a 20 4f 74 68 65 72  us=OFF..** Other
0460: 77 69 73 65 2c 20 74 68 65 20 70 61 67 65 20 69  wise, the page i
0470: 73 20 6e 6f 74 20 73 79 6e 63 65 64 20 75 6e 74  s not synced unt
0480: 69 6c 20 74 68 65 20 78 53 79 6e 63 20 6d 65 74  il the xSync met
0490: 68 6f 64 20 6f 66 20 74 68 65 20 56 46 53 0a 2a  hod of the VFS.*
04a0: 2a 20 69 73 20 63 61 6c 6c 65 64 20 73 75 63 63  * is called succ
04b0: 65 73 73 66 75 6c 6c 79 20 6f 6e 20 74 68 65 20  essfully on the 
04c0: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
04d0: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
04e0: 44 65 66 69 6e 69 74 69 6f 6e 3a 20 20 41 20 70  Definition:  A p
04f0: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
0500: 61 73 65 20 66 69 6c 65 20 69 73 20 73 61 69 64  ase file is said
0510: 20 74 6f 20 62 65 20 22 6f 76 65 72 77 72 69 74   to be "overwrit
0520: 65 61 62 6c 65 22 20 69 66 0a 2a 2a 20 6f 6e 65  eable" if.** one
0530: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
0540: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
0550: 75 65 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  ue about the pag
0560: 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 61  e:.** .**     (a
0570: 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  )  The original 
0580: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
0590: 61 67 65 20 61 73 20 69 74 20 77 61 73 20 61 74  age as it was at
05a0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
05b0: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 68  f.**          th
05c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
05d0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69  s been written i
05e0: 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  nto the rollback
05f0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20   journal and.** 
0600: 20 20 20 20 20 20 20 20 20 73 79 6e 63 65 64 2e           synced.
0610: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20  .** .**     (b) 
0620: 20 54 68 65 20 70 61 67 65 20 77 61 73 20 61 20   The page was a 
0630: 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61  freelist leaf pa
0640: 67 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ge at the start 
0650: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0660: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28  on..** .**     (
0670: 63 29 20 20 54 68 65 20 70 61 67 65 20 6e 75 6d  c)  The page num
0680: 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
0690: 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  han the largest 
06a0: 70 61 67 65 20 74 68 61 74 20 65 78 69 73 74 65  page that existe
06b0: 64 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  d in.**         
06c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
06d0: 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  le at the start 
06e0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
06f0: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 31 29 20 41  on..** .** (1) A
0700: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
0710: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 65  abase file is ne
0720: 76 65 72 20 6f 76 65 72 77 72 69 74 74 65 6e 20  ver overwritten 
0730: 75 6e 6c 65 73 73 20 6f 6e 65 20 6f 66 20 74 68  unless one of th
0740: 65 0a 2a 2a 20 20 20 20 20 66 6f 6c 6c 6f 77 69  e.**     followi
0750: 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 20  ng are true:.** 
0760: 0a 2a 2a 20 20 20 20 20 28 61 29 20 54 68 65 20  .**     (a) The 
0770: 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 6f 74 68  page and all oth
0780: 65 72 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  er pages on the 
0790: 73 61 6d 65 20 73 65 63 74 6f 72 20 61 72 65 20  same sector are 
07a0: 6f 76 65 72 77 72 69 74 65 61 62 6c 65 2e 0a 2a  overwriteable..*
07b0: 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20 54 68  * .**     (b) Th
07c0: 65 20 61 74 6f 6d 69 63 20 70 61 67 65 20 77 72  e atomic page wr
07d0: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
07e0: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6e 64   is enabled, and
07f0: 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 20   the entire.**  
0800: 20 20 20 20 20 20 20 74 72 61 6e 73 61 63 74 69         transacti
0810: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  on other than th
0820: 65 20 75 70 64 61 74 65 20 6f 66 20 74 68 65 20  e update of the 
0830: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 71 75  transaction sequ
0840: 65 6e 63 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  ence.**         
0850: 6e 75 6d 62 65 72 20 63 6f 6e 73 69 73 74 73 20  number consists 
0860: 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
0870: 20 63 68 61 6e 67 65 2e 0a 2a 2a 20 0a 2a 2a 20   change..** .** 
0880: 28 32 29 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  (2) The content 
0890: 6f 66 20 61 20 70 61 67 65 20 77 72 69 74 74 65  of a page writte
08a0: 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62  n into the rollb
08b0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 65 78 61 63  ack journal exac
08c0: 74 6c 79 20 6d 61 74 63 68 65 73 0a 2a 2a 20 20  tly matches.**  
08d0: 20 20 20 62 6f 74 68 20 74 68 65 20 63 6f 6e 74     both the cont
08e0: 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
08f0: 61 73 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6c  ase when the rol
0900: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 77 61  lback journal wa
0910: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 20  s written.**    
0920: 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
0930: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
0940: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
0950: 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  g of the current
0960: 0a 2a 2a 20 20 20 20 20 74 72 61 6e 73 61 63 74  .**     transact
0970: 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 33 29 20  ion..** .** (3) 
0980: 57 72 69 74 65 73 20 74 6f 20 74 68 65 20 64 61  Writes to the da
0990: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
09a0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
09b0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  ple of the page 
09c0: 73 69 7a 65 0a 2a 2a 20 20 20 20 20 69 6e 20 6c  size.**     in l
09d0: 65 6e 67 74 68 20 61 6e 64 20 61 72 65 20 61 6c  ength and are al
09e0: 69 67 6e 65 64 20 74 6f 20 61 20 70 61 67 65 20  igned to a page 
09f0: 62 6f 75 6e 64 61 72 79 2e 0a 2a 2a 20 0a 2a 2a  boundary..** .**
0a00: 20 28 34 29 20 52 65 61 64 73 20 66 72 6f 6d 20   (4) Reads from 
0a10: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
0a20: 65 20 61 72 65 20 65 69 74 68 65 72 20 61 6c 69  e are either ali
0a30: 67 6e 65 64 20 6f 6e 20 61 20 70 61 67 65 20 62  gned on a page b
0a40: 6f 75 6e 64 61 72 79 20 61 6e 64 0a 2a 2a 20 20  oundary and.**  
0a50: 20 20 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75     an integer mu
0a60: 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
0a70: 67 65 20 73 69 7a 65 20 69 6e 20 6c 65 6e 67 74  ge size in lengt
0a80: 68 20 6f 72 20 61 72 65 20 74 61 6b 65 6e 20 66  h or are taken f
0a90: 72 6f 6d 20 74 68 65 0a 2a 2a 20 20 20 20 20 66  rom the.**     f
0aa0: 69 72 73 74 20 31 30 30 20 62 79 74 65 73 20 6f  irst 100 bytes o
0ab0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
0ac0: 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 35 29 20  ile..** .** (5) 
0ad0: 41 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74 68  All writes to th
0ae0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0af0: 61 72 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72  are synced prior
0b00: 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   to the rollback
0b10: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
0b20: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2c 20 74  being deleted, t
0b30: 72 75 6e 63 61 74 65 64 2c 20 6f 72 20 7a 65 72  runcated, or zer
0b40: 6f 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 28 36 29 20  oed..** .** (6) 
0b50: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
0b60: 6e 61 6c 20 66 69 6c 65 20 69 73 20 75 73 65 64  nal file is used
0b70: 2c 20 74 68 65 6e 20 61 6c 6c 20 77 72 69 74 65  , then all write
0b80: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
0b90: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 72  e file.**     ar
0ba0: 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74  e synced prior t
0bb0: 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
0bc0: 72 6e 61 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  rnal being delet
0bd0: 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 44 65 66 69 6e  ed..** .** Defin
0be0: 69 74 69 6f 6e 3a 20 54 77 6f 20 64 61 74 61 62  ition: Two datab
0bf0: 61 73 65 73 20 28 6f 72 20 74 68 65 20 73 61 6d  ases (or the sam
0c00: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 77  e database at tw
0c10: 6f 20 70 6f 69 6e 74 73 20 69 74 20 74 69 6d 65  o points it time
0c20: 29 0a 2a 2a 20 61 72 65 20 73 61 69 64 20 74 6f  ).** are said to
0c30: 20 62 65 20 22 6c 6f 67 69 63 61 6c 6c 79 20 65   be "logically e
0c40: 71 75 69 76 61 6c 65 6e 74 22 20 69 66 20 74 68  quivalent" if th
0c50: 65 79 20 67 69 76 65 20 74 68 65 20 73 61 6d 65  ey give the same
0c60: 20 61 6e 73 77 65 72 20 74 6f 0a 2a 2a 20 61 6c   answer to.** al
0c70: 6c 20 71 75 65 72 69 65 73 2e 20 20 4e 6f 74 65  l queries.  Note
0c80: 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74   in particular t
0c90: 68 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  he the content o
0ca0: 66 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66 0a  f freelist leaf.
0cb0: 2a 2a 20 70 61 67 65 73 20 63 61 6e 20 62 65 20  ** pages can be 
0cc0: 63 68 61 6e 67 65 64 20 61 72 62 69 74 61 72 69  changed arbitari
0cd0: 6c 79 20 77 69 74 68 6f 75 74 20 65 66 66 65 63  ly without effec
0ce0: 74 69 6e 67 20 74 68 65 20 6c 6f 67 69 63 61 6c  ting the logical
0cf0: 20 65 71 75 69 76 61 6c 65 6e 63 65 0a 2a 2a 20   equivalence.** 
0d00: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
0d10: 0a 2a 2a 20 0a 2a 2a 20 28 37 29 20 41 74 20 61  .** .** (7) At a
0d20: 6e 79 20 74 69 6d 65 2c 20 69 66 20 61 6e 79 20  ny time, if any 
0d30: 73 75 62 73 65 74 2c 20 69 6e 63 6c 75 64 69 6e  subset, includin
0d40: 67 20 74 68 65 20 65 6d 70 74 79 20 73 65 74 20  g the empty set 
0d50: 61 6e 64 20 74 68 65 20 74 6f 74 61 6c 20 73 65  and the total se
0d60: 74 2c 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 65  t,.**     of the
0d70: 20 75 6e 73 79 6e 63 65 64 20 63 68 61 6e 67 65   unsynced change
0d80: 73 20 74 6f 20 61 20 72 6f 6c 6c 62 61 63 6b 20  s to a rollback 
0d90: 6a 6f 75 72 6e 61 6c 20 61 72 65 20 72 65 6d 6f  journal are remo
0da0: 76 65 64 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ved and the .** 
0db0: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 72      journal is r
0dc0: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0dd0: 72 65 73 75 6c 74 69 6e 67 20 64 61 74 61 62 61  resulting databa
0de0: 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  se file will be 
0df0: 6c 6f 67 69 63 61 6c 0a 2a 2a 20 20 20 20 20 65  logical.**     e
0e00: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
0e10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
0e20: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
0e30: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0e40: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 38 29 20 57  on..** .** (8) W
0e50: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
0e60: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
0e70: 2c 20 74 68 65 20 78 54 72 75 6e 63 61 74 65 20  , the xTruncate 
0e80: 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 56 46  method of the VF
0e90: 53 0a 2a 2a 20 20 20 20 20 69 73 20 63 61 6c 6c  S.**     is call
0ea0: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
0eb0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0ec0: 74 6f 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65  to the same size
0ed0: 20 69 74 20 77 61 73 20 61 74 0a 2a 2a 20 20 20   it was at.**   
0ee0: 20 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20    the beginning 
0ef0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0f00: 6f 6e 2e 20 20 28 49 6e 20 73 6f 6d 65 20 56 46  on.  (In some VF
0f10: 53 65 73 2c 20 74 68 65 20 78 54 72 75 6e 63 61  Ses, the xTrunca
0f20: 74 65 0a 2a 2a 20 20 20 20 20 6d 65 74 68 6f 64  te.**     method
0f30: 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 62 75 74   is a no-op, but
0f40: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 63   that does not c
0f50: 68 61 6e 67 65 20 74 68 65 20 66 61 63 74 20 74  hange the fact t
0f60: 68 65 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 2a  he SQLite will.*
0f70: 2a 20 20 20 20 20 69 6e 76 6f 6b 65 20 69 74 2e  *     invoke it.
0f80: 29 0a 2a 2a 20 0a 2a 2a 20 28 39 29 20 57 68 65  ).** .** (9) Whe
0f90: 6e 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61  never the databa
0fa0: 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 64 69 66  se file is modif
0fb0: 69 65 64 2c 20 61 74 20 6c 65 61 73 74 20 6f 6e  ied, at least on
0fc0: 65 20 62 69 74 20 69 6e 20 74 68 65 20 72 61 6e  e bit in the ran
0fd0: 67 65 0a 2a 2a 20 20 20 20 20 6f 66 20 62 79 74  ge.**     of byt
0fe0: 65 73 20 66 72 6f 6d 20 32 34 20 74 68 72 6f 75  es from 24 throu
0ff0: 67 68 20 33 39 20 69 6e 63 6c 75 73 69 76 65 20  gh 39 inclusive 
1000: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20  will be changed 
1010: 70 72 69 6f 72 20 74 6f 20 72 65 6c 65 61 73 69  prior to releasi
1020: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 45 58  ng.**     the EX
1030: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 0a 2a 2a  CLUSIVE lock..**
1040: 0a 2a 2a 20 28 31 30 29 20 54 68 65 20 70 61 74  .** (10) The pat
1050: 74 65 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20  tern of bits in 
1060: 62 79 74 65 73 20 32 34 20 74 68 72 6f 75 67 68  bytes 24 through
1070: 20 33 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65   39 shall not re
1080: 70 65 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20  peat in less.** 
1090: 20 20 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69       than one bi
10a0: 6c 6c 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f  llion transactio
10b0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41  ns..**.** (11) A
10c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
10d0: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74  s well-formed at
10e0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61   the beginning a
10f0: 6e 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  nd at the conclu
1100: 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20  sion.**      of 
1110: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
1120: 6e 2e 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e  n..**.** (12) An
1130: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1140: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
1150: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
1160: 6e 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20  n writing to.** 
1170: 20 20 20 20 20 74 68 65 20 64 61 74 61 62 61 73       the databas
1180: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31  e file..**.** (1
1190: 33 29 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b  3) A SHARED lock
11a0: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
11b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
11c0: 69 6c 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a  ile reading any.
11d0: 2a 2a 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20  **      content 
11e0: 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
11f0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 0a 2f 2a  ase file..*/../*
1200: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
1210: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
1220: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
1230: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e   off.*/.#if 0.in
1240: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
1250: 61 63 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20  ace=1;  /* True 
1260: 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e  to enable tracin
1270: 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c  g */.#define sql
1280: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
1290: 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50  printf.#define P
12a0: 41 47 45 52 54 52 41 43 45 28 58 29 20 20 20 20  AGERTRACE(X)    
12b0: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
12c0: 72 54 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65  rTrace ){ sqlite
12d0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20  3DebugPrintf X; 
12e0: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
12f0: 50 41 47 45 52 54 52 41 43 45 28 58 29 0a 23 65  PAGERTRACE(X).#e
1300: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1310: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61  following two ma
1320: 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69  cros are used wi
1330: 74 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52  thin the PAGERTR
1340: 41 43 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  ACE() macros abo
1350: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
1360: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
1370: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
1380: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
1390: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
13a0: 20 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61   struct as its a
13b0: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
13c0: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
13d0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
13e0: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
13f0: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
1400: 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20  sqlite3_file.** 
1410: 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72  struct as its ar
1420: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69  gument..*/.#defi
1430: 6e 65 20 50 41 47 45 52 49 44 28 70 29 20 28 28  ne PAGERID(p) ((
1440: 69 6e 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65  int)(p->fd)).#de
1450: 66 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49  fine FILEHANDLEI
1460: 44 28 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a  D(fd) ((int)fd).
1470: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
1480: 63 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65  cache as a whole
1490: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e   is always in on
14a0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
14b0: 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a  ng.** states:.**
14c0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f  .**   PAGER_UNLO
14d0: 43 4b 20 20 20 20 20 20 20 20 54 68 65 20 70 61  CK        The pa
14e0: 67 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ge cache is not 
14f0: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
1500: 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  g or .**        
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
1520: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
1530: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65  ase file.  There
1540: 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20   is no.**       
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1560: 64 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d  data held in mem
1570: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68  ory.  This is th
1580: 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20  e initial.**    
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a0: 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20     state..**.** 
15b0: 20 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20    PAGER_SHARED  
15c0: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
15d0: 61 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20  ache is reading 
15e0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69         Writing i
1610: 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
1620: 20 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a    There can be.*
1630: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1640: 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65          multiple
1650: 20 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69   readers accessi
1660: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
1670: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
1690: 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
16a0: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ime..**.**   PAG
16b0: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 20  ER_RESERVED     
16c0: 20 54 68 69 73 20 70 72 6f 63 65 73 73 20 68 61   This process ha
16d0: 73 20 72 65 73 65 72 76 65 64 20 74 68 65 20 64  s reserved the d
16e0: 61 74 61 62 61 73 65 20 66 6f 72 20 77 72 69 74  atabase for writ
16f0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74               but
1710: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64   has not yet mad
1720: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20  e any changes.  
1730: 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73  Only one process
1740: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1750: 20 20 20 20 20 20 20 20 20 20 61 74 20 61 20 74            at a t
1760: 69 6d 65 20 63 61 6e 20 72 65 73 65 72 76 65 20  ime can reserve 
1770: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
1780: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  he original.**  
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
17b0: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
17c0: 6d 6f 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65  modified so othe
17d0: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
17e0: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65             proce
17f0: 73 73 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62  sses may still b
1800: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e  e reading the on
1810: 2d 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20  -disk.**        
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1830: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1840: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c  .**   PAGER_EXCL
1850: 55 53 49 56 45 20 20 20 20 20 54 68 65 20 70 61  USIVE     The pa
1860: 67 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74  ge cache is writ
1870: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1880: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
1890: 20 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73             Acces
18a0: 73 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  s is exclusive. 
18b0: 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   No other proces
18c0: 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ses or.**       
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 74 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72  threads can be r
18f0: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1900: 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20  g while one.**  
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20       process is 
1930: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  writing..**.**  
1940: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
1950: 20 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d       The pager m
1960: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
1970: 74 65 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58  te from PAGER_EX
1980: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20  CLUSIVE.**      
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a0: 20 61 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79   after all dirty
19b0: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
19c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
19d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
19e0: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
19f0: 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
1a00: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
1a10: 63 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ced to.**       
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a30: 64 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72  disk. All that r
1a40: 65 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20  emains to do is 
1a50: 74 6f 20 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20  to remove or.** 
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 74 72 75 6e 63 61 74 65 20 74        truncate t
1a80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a90: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
1aa0: 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ion .**         
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
1ac0: 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e  ll be committed.
1ad0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
1ae0: 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69  cache comes up i
1af0: 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  n PAGER_UNLOCK. 
1b00: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
1b10: 61 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  a.** sqlite3Page
1b20: 72 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  rGet() occurs, t
1b30: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
1b40: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
1b50: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
1b60: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
1b70: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
1b80: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
1b90: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
1ba0: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
1bb0: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
1bc0: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
1bd0: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
1be0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1bf0: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
1c00: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
1c10: 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
1c20: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
1c30: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
1c40: 72 57 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  rWrite() can onl
1c50: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
1c60: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
1c70: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
1c80: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
1c90: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
1ca0: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
1cb0: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
1cc0: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
1cd0: 56 45 44 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52  VED.).** PAGER_R
1ce0: 45 53 45 52 56 45 44 20 6d 65 61 6e 73 20 74 68  ESERVED means th
1cf0: 61 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f  at there is an o
1d00: 70 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  pen rollback jou
1d10: 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61  rnal..** The tra
1d20: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
1d30: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
1d40: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  s before any cha
1d50: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
1d60: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1d70: 20 66 69 6c 65 2c 20 74 68 6f 75 67 68 20 77 72   file, though wr
1d80: 69 74 65 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c  ites to the roll
1d90: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
1da0: 6f 63 63 75 72 73 20 77 69 74 68 20 6a 75 73 74  occurs with just
1db0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
1dc0: 20 20 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74    After an sqlit
1dd0: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1de0: 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 50  ).** or sqlite3P
1df0: 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
1e00: 77 6f 28 29 2c 20 74 68 65 20 73 74 61 74 65 20  wo(), the state 
1e10: 63 61 6e 20 67 6f 20 62 61 63 6b 20 74 6f 20 50  can go back to P
1e20: 41 47 45 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20  AGER_SHARED,.** 
1e30: 6f 72 20 69 74 20 63 61 6e 20 73 74 61 79 20 61  or it can stay a
1e40: 74 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  t PAGER_EXCLUSIV
1e50: 45 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 65  E if we are in e
1e60: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
1e70: 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  mode..*/.#define
1e80: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
1e90: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
1ea0: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 31  ER_SHARED      1
1eb0: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48     /* same as SH
1ec0: 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  ARED_LOCK */.#de
1ed0: 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52  fine PAGER_RESER
1ee0: 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61  VED    2   /* sa
1ef0: 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c  me as RESERVED_L
1f00: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1f10: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20  AGER_EXCLUSIVE  
1f20: 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   4   /* same as 
1f30: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a  EXCLUSIVE_LOCK *
1f40: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1f50: 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f  SYNCED      5../
1f60: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
1f70: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
1f80: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
1f90: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
1fa0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
1fb0: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
1fc0: 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c  EC1(P,D,N,X,E) \
1fd0: 0a 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64  .    if( P->xCod
1fe0: 65 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28  ec && P->xCodec(
1ff0: 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29  P->pCodec,D,N,X)
2000: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65  ==0 ){ E; }.# de
2010: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
2020: 4e 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69  N,X,E,O) \.    i
2030: 66 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20  f( P->xCodec==0 
2040: 29 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d  ){ O=(char*)D; }
2050: 65 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28  else \.    if( (
2060: 4f 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f  O=(char*)(P->xCo
2070: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c  dec(P->pCodec,D,
2080: 4e 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20  N,X)))==0 ){ E; 
2090: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
20a0: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c   CODEC1(P,D,N,X,
20b0: 45 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  E)   /* NO-OP */
20c0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
20d0: 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d  (P,D,N,X,E,O) O=
20e0: 28 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a  (char*)D.#endif.
20f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
2100: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f  um allowed secto
2110: 72 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49  r size. 64KiB. I
2120: 66 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a  f the xSectorsiz
2130: 65 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72  e() method .** r
2140: 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c  eturns a value l
2150: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c  arger than this,
2160: 20 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52   then MAX_SECTOR
2170: 5f 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e  _SIZE is used in
2180: 73 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63  stead..** This c
2190: 6f 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79  ould conceivably
21a0: 20 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f   cause corruptio
21b0: 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f  n following a po
21c0: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a  wer failure on.*
21d0: 2a 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e  * such a system.
21e0: 20 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74   This is current
21f0: 6c 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74  ly an undocument
2200: 65 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65  ed limit..*/.#de
2210: 66 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f  fine MAX_SECTOR_
2220: 53 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a  SIZE 0x10000../*
2230: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
2240: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2250: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
2260: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
2270: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
2280: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
2290: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
22a0: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
22b0: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
22c0: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
22d0: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
22e0: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
22f0: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
2300: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
2310: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
2320: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
2330: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
2340: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
2350: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
2360: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
2370: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
2380: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
2390: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
23a0: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
23b0: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
23c0: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
23d0: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
23e0: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
23f0: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
2400: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
2410: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
2420: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
2430: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
2440: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
2450: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
2460: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
2470: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
2480: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
2490: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
24a0: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
24b0: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
24c0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
24d0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
24e0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
24f0: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
2500: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
2510: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
2520: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
2530: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
2540: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
2550: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
2560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2570: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
2580: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
2590: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
25a0: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
25b0: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
25c0: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25e0: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
25f0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
2600: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
2610: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
2620: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2630: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
2640: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
2650: 20 20 75 33 32 20 61 57 61 6c 44 61 74 61 5b 57    u32 aWalData[W
2660: 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e 44 41  AL_SAVEPOINT_NDA
2670: 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 57  TA];        /* W
2680: 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63 6f 6e  AL savepoint con
2690: 74 65 78 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  text */.};../*.*
26a0: 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61  * A open page ca
26b0: 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  che is an instan
26c0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
26d0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
26e0: 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a  *.** errCode.**.
26f0: 2a 2a 20 20 20 50 61 67 65 72 2e 65 72 72 43 6f  **   Pager.errCo
2700: 64 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  de may be set to
2710: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53   SQLITE_IOERR, S
2720: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f  QLITE_CORRUPT, o
2730: 72 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49 54 45  r.**   or SQLITE
2740: 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20  _FULL. Once one 
2750: 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72  of the first thr
2760: 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73  ee errors occurs
2770: 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a  , it persists.**
2780: 20 20 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e     and is return
2790: 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  ed as the result
27a0: 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20   of every major 
27b0: 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20  pager API call. 
27c0: 20 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49 54 45   The.**   SQLITE
27d0: 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64  _FULL return cod
27e0: 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69  e is slightly di
27f0: 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73  fferent. It pers
2800: 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20  ists only until 
2810: 74 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20 73 75  the.**   next su
2820: 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63  ccessful rollbac
2830: 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f  k is performed o
2840: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
2850: 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20 53 51  e. Also,.**   SQ
2860: 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e  LITE_FULL does n
2870: 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71  ot affect the sq
2880: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
2890: 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
28a0: 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20 41 50  Lookup().**   AP
28b0: 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69  Is, they may sti
28c0: 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63 63 65  ll be used succe
28d0: 73 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 64  ssfully..**.** d
28e0: 62 53 69 7a 65 56 61 6c 69 64 2c 20 64 62 53 69  bSizeValid, dbSi
28f0: 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 2c 20  ze, dbOrigSize, 
2900: 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a 2a 2a  dbFileSize.**.**
2910: 20 20 20 4d 61 6e 61 67 69 6e 67 20 74 68 65 20     Managing the 
2920: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
2930: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67  base file in pag
2940: 65 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20 63  es is a little c
2950: 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20 20  omplicated..**  
2960: 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61   The variable Pa
2970: 67 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74 61  ger.dbSize conta
2980: 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ins the number o
2990: 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68 65  f pages that the
29a0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 69   database.**   i
29b0: 6d 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 63  mage currently c
29c0: 6f 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65 20  ontains. As the 
29d0: 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 67  database image g
29e0: 72 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73 20  rows or shrinks 
29f0: 74 68 69 73 0a 2a 2a 20 20 20 76 61 72 69 61 62  this.**   variab
2a00: 6c 65 20 69 73 20 75 70 64 61 74 65 64 2e 20 54  le is updated. T
2a10: 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67 65  he variable Page
2a20: 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e  r.dbFileSize con
2a30: 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  tains the number
2a40: 0a 2a 2a 20 20 20 6f 66 20 70 61 67 65 73 20 69  .**   of pages i
2a50: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2a60: 69 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 62 65  ile. This may be
2a70: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
2a80: 50 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a 2a 20  Pager.dbSize.** 
2a90: 20 20 69 66 20 73 6f 6d 65 20 70 61 67 65 73 20    if some pages 
2aa0: 68 61 76 65 20 62 65 65 6e 20 61 70 70 65 6e 64  have been append
2ab0: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
2ac0: 73 65 20 69 6d 61 67 65 20 62 75 74 20 6e 6f 74  se image but not
2ad0: 20 79 65 74 20 77 72 69 74 74 65 6e 0a 2a 2a 20   yet written.** 
2ae0: 20 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20 63    out from the c
2af0: 61 63 68 65 20 74 6f 20 74 68 65 20 61 63 74 75  ache to the actu
2b00: 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  al file on disk.
2b10: 20 4f 72 20 69 66 20 74 68 65 20 69 6d 61 67 65   Or if the image
2b20: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 74   has been.**   t
2b30: 72 75 6e 63 61 74 65 64 20 62 79 20 61 6e 20 69  runcated by an i
2b40: 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
2b50: 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65  m operation. The
2b60: 20 50 61 67 65 72 2e 64 62 4f 72 69 67 53 69 7a   Pager.dbOrigSiz
2b70: 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20  e variable.**   
2b80: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d  contains the num
2b90: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
2ba0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
2bb0: 67 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ge when the curr
2bc0: 65 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73 61 63  ent.**   transac
2bd0: 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e  tion was opened.
2be0: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
2bf0: 20 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74 68   all three of th
2c00: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 69 73  ese variables is
2c10: 0a 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61 72 61  .**   only guara
2c20: 6e 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72 72  nteed to be corr
2c30: 65 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c 65  ect if the boole
2c40: 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 56  an Pager.dbSizeV
2c50: 61 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a 2a  alid is true..**
2c60: 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e 64 65  .**   TODO: Unde
2c70: 72 20 77 68 61 74 20 63 6f 6e 64 69 74 69 6f 6e  r what condition
2c80: 73 20 69 73 20 64 62 53 69 7a 65 56 61 6c 69 64  s is dbSizeValid
2c90: 20 73 65 74 3f 20 43 6c 65 61 72 65 64 3f 0a 2a   set? Cleared?.*
2ca0: 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74  *.** changeCount
2cb0: 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Done.**.**   Thi
2cc0: 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  s boolean variab
2cd0: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  le is used to ma
2ce0: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
2cf0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
2d00: 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74  .**   (the 4-byt
2d10: 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61  e header field a
2d20: 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  t byte offset 24
2d30: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2d40: 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20   file) is .**   
2d50: 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65  not updated more
2d60: 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65   often than nece
2d70: 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ssary. .**.**   
2d80: 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  It is set to tru
2d90: 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67  e when the chang
2da0: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
2db0: 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63  is updated, whic
2dc0: 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79  h .**   can only
2dd0: 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78   happen if an ex
2de0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
2df0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
2e00: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
2e10: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73  It is cleared (s
2e20: 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65  et to false) whe
2e30: 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69  never an exclusi
2e40: 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20  ve lock is .**  
2e50: 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e   relinquished on
2e60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e70: 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20  le. Each time a 
2e80: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2e90: 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54  ommitted,.**   T
2ea0: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
2eb0: 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65  ne flag is inspe
2ec0: 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74  cted. If it is t
2ed0: 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66  rue, the work of
2ee0: 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74  .**   updating t
2ef0: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2f00: 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72  r is omitted for
2f10: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
2f20: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
2f30: 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d    This mechanism
2f40: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e   means that when
2f50: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
2f60: 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f  usive mode, a co
2f70: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e  nnection .**   n
2f80: 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20  eed only update 
2f90: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
2fa0: 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65  er once, for the
2fb0: 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69   first transacti
2fc0: 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65  on.**   committe
2fd0: 64 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64 69 66  d..**.** dbModif
2fe0: 69 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ied.**.**   The 
2ff0: 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67 20  dbModified flag 
3000: 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20  is set whenever 
3010: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
3020: 69 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a 20 20  is dirtied..**  
3030: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 61   It is cleared a
3040: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63  t the end of eac
3050: 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  h transaction..*
3060: 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 75 73 65  *.**   It is use
3070: 64 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  d when committin
3080: 67 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20 65  g or otherwise e
3090: 6e 64 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  nding a transact
30a0: 69 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74 68 65  ion. If.**   the
30b0: 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67   dbModified flag
30c0: 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 6c   is clear then l
30d0: 65 73 73 20 77 6f 72 6b 20 68 61 73 20 74 6f 20  ess work has to 
30e0: 62 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 6a  be done..**.** j
30f0: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 0a 2a 2a  ournalStarted.**
3100: 0a 2a 2a 20 20 20 54 68 69 73 20 66 6c 61 67 20  .**   This flag 
3110: 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20  is set whenever 
3120: 74 68 65 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  the the main jou
3130: 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 20 61  rnal is opened a
3140: 6e 64 0a 2a 2a 20 20 20 69 6e 69 74 69 61 6c 69  nd.**   initiali
3150: 7a 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  zed.**.**   The 
3160: 70 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c  point of this fl
3170: 61 67 20 69 73 20 74 68 61 74 20 69 74 20 6d 75  ag is that it mu
3180: 73 74 20 62 65 20 73 65 74 20 61 66 74 65 72 20  st be set after 
3190: 74 68 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20  the .**   first 
31a0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
31b0: 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  n a journal file
31c0: 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
31d0: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41   to disk..**   A
31e0: 66 74 65 72 20 74 68 69 73 20 68 61 73 20 68 61  fter this has ha
31f0: 70 70 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65  ppened, new page
3200: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
3210: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20  e database .**  
3220: 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65   do not need the
3230: 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
3240: 20 66 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68   flag set, as th
3250: 65 79 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a  ey do not need.*
3260: 2a 20 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20  *   to wait for 
3270: 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62  a journal sync b
3280: 65 66 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62  efore they can b
3290: 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
32a0: 0a 2a 2a 20 20 20 74 68 65 20 64 61 74 61 62 61  .**   the databa
32b0: 73 65 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e  se file (see fun
32c0: 63 74 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74  ction pager_writ
32d0: 65 28 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73  e())..**   .** s
32e0: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
32f0: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   This variable i
3300: 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65  s used to ensure
3310: 20 74 68 61 74 20 74 68 65 20 6d 61 73 74 65 72   that the master
3320: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
3330: 6d 65 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29  me.**   (if any)
3340: 20 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e   is only written
3350: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
3360: 6c 20 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a  l file once..**.
3370: 2a 2a 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74  **   When commit
3380: 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
3390: 6f 6e 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  on, the master j
33a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
33b0: 20 28 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d   (if any).**   m
33c0: 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ay be written in
33d0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
33e0: 69 6c 65 20 77 68 69 6c 65 20 74 68 65 20 70 61  ile while the pa
33f0: 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a  ger is still in.
3400: 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52  **   PAGER_RESER
3410: 56 45 44 20 73 74 61 74 65 20 28 73 65 65 20 43  VED state (see C
3420: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
3430: 66 6f 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e  for the action).
3440: 20 49 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74   It.**   then at
3450: 74 65 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64  tempts to upgrad
3460: 65 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76  e to an exclusiv
3470: 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20  e lock. If this 
3480: 61 74 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69  attempt.**   fai
3490: 6c 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  ls, then SQLITE_
34a0: 42 55 53 59 20 6d 61 79 20 62 65 20 72 65 74 75  BUSY may be retu
34b0: 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
34c0: 20 61 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a   and the user.**
34d0: 20 20 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74     may attempt t
34e0: 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
34f0: 6e 73 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c  nsaction again l
3500: 61 74 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a  ater (calling.**
3510: 20 20 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e     CommitPhaseOn
3520: 65 28 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73  e() again). This
3530: 20 66 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f   flag is used to
3540: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
3550: 20 0a 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f   .**   master jo
3560: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e  urnal name is on
3570: 6c 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ly written to th
3580: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
3590: 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69  he first.**   ti
35a0: 6d 65 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  me CommitPhaseOn
35b0: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
35c0: 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 79 6e 63 0a 2a  *.** doNotSync.*
35d0: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 65 6e 61 62  *.**   When enab
35e0: 6c 65 64 2c 20 63 61 63 68 65 20 73 70 69 6c 6c  led, cache spill
35f0: 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64  s are prohibited
3600: 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
3610: 20 66 69 6c 65 20 63 61 6e 6e 6f 74 0a 2a 2a 20   file cannot.** 
3620: 20 20 62 65 20 73 79 6e 63 65 64 2e 20 20 54 68    be synced.  Th
3630: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 73  is variable is s
3640: 65 74 20 61 6e 64 20 63 6c 65 61 72 65 64 20 62  et and cleared b
3650: 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  y sqlite3PagerWr
3660: 69 74 65 28 29 20 0a 2a 2a 20 20 20 69 6e 20 6f  ite() .**   in o
3670: 72 64 65 72 20 74 6f 20 70 72 65 76 65 6e 74 20  rder to prevent 
3680: 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 66  a journal sync f
3690: 72 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e  rom happening in
36a0: 20 62 65 74 77 65 65 6e 20 74 68 65 0a 2a 2a 20   between the.** 
36b0: 20 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 6f 66    journalling of
36c0: 20 74 77 6f 20 70 61 67 65 73 20 6f 6e 20 74 68   two pages on th
36d0: 65 20 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a 2a  e same sector..*
36e0: 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a  *.** needSync.**
36f0: 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74 20 6d  .**   TODO: It m
3700: 69 67 68 74 20 62 65 20 65 61 73 69 65 72 20 74  ight be easier t
3710: 6f 20 73 65 74 20 74 68 69 73 20 76 61 72 69 61  o set this varia
3720: 62 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f 75 72  ble in writeJour
3730: 6e 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20 61 6e  nalHdr().**   an
3740: 64 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  d writeMasterJou
3750: 72 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43 68 61  rnal() only. Cha
3760: 6e 67 65 20 69 74 73 20 6d 65 61 6e 69 6e 67 20  nge its meaning 
3770: 74 6f 20 22 75 6e 73 79 6e 63 65 64 20 64 61 74  to "unsynced dat
3780: 61 0a 2a 2a 20 20 20 68 61 73 20 62 65 65 6e 20  a.**   has been 
3790: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
37a0: 6f 75 72 6e 61 6c 22 2e 0a 2a 2a 0a 2a 2a 20 73  ournal"..**.** s
37b0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
37c0: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
37d0: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
37e0: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
37f0: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
3800: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
3810: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
3820: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
3830: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
3840: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
3850: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
3860: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
3870: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
3880: 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 72 75 63   files..*/.struc
3890: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
38a0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
38b0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
38c0: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
38d0: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
38e0: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
38f0: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
3900: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
3910: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
3920: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
3930: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
3940: 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68 65      /* On of the
3950: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
3960: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
3970: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3990: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
39a0: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
39b0: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65  ile */.  u8 noRe
39c0: 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20  adlock;         
39d0: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62       /* Do not b
39e0: 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20  other to obtain 
39f0: 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75  readlocks */.  u
3a00: 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20  8 noSync;       
3a10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
3a20: 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f   not sync the jo
3a30: 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f  urnal if true */
3a40: 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20  .  u8 fullSync; 
3a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3a60: 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73  * Do extra syncs
3a70: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
3a80: 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a  for robustness *
3a90: 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c 61 67  /.  u8 sync_flag
3aa0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
3ab0: 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e  /* One of SYNC_N
3ac0: 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55  ORMAL or SYNC_FU
3ad0: 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  LL */.  u8 tempF
3ae0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
3af0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
3b00: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
3b10: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
3b20: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
3b30: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
3b40: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
3b50: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
3b60: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
3b70: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3b80: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
3b90: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
3ba0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
3bb0: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
3bc0: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
3bd0: 73 20 74 68 61 74 20 61 72 65 20 64 79 6e 61 6d  s that are dynam
3be0: 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f 64 69  ically.  ** modi
3bf0: 66 69 65 64 20 64 75 72 69 6e 67 20 6e 6f 72 6d  fied during norm
3c00: 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 54  al operations. T
3c10: 68 65 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c  he other variabl
3c20: 65 73 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  es in this struc
3c30: 74 75 72 65 0a 20 20 2a 2a 20 61 72 65 20 65 69  ture.  ** are ei
3c40: 74 68 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68  ther constant th
3c50: 72 6f 75 67 68 6f 75 74 20 74 68 65 20 6c 69 66  roughout the lif
3c60: 65 74 69 6d 65 20 6f 66 20 74 68 65 20 70 61 67  etime of the pag
3c70: 65 72 2c 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  er, or else.  **
3c80: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 63   used to store c
3c90: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 70 61 72  onfiguration par
3ca0: 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 66 66  ameters that aff
3cb0: 65 63 74 20 74 68 65 20 77 61 79 20 74 68 65 20  ect the way the 
3cc0: 70 61 67 65 72 20 0a 20 20 2a 2a 20 6f 70 65 72  pager .  ** oper
3cd0: 61 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ates..  **.  ** 
3ce0: 54 68 65 20 27 73 74 61 74 65 27 20 76 61 72 69  The 'state' vari
3cf0: 61 62 6c 65 20 69 73 20 64 65 73 63 72 69 62 65  able is describe
3d00: 64 20 69 6e 20 6d 6f 72 65 20 64 65 74 61 69 6c  d in more detail
3d10: 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 0a   along with the.
3d20: 20 20 2a 2a 20 64 65 73 63 72 69 70 74 69 6f 6e    ** description
3d30: 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20  s of the values 
3d40: 69 74 20 6d 61 79 20 74 61 6b 65 20 2d 20 50 41  it may take - PA
3d50: 47 45 52 5f 55 4e 4c 4f 43 4b 20 65 74 63 2e 20  GER_UNLOCK etc. 
3d60: 4d 61 6e 79 20 6f 66 20 74 68 65 0a 20 20 2a 2a  Many of the.  **
3d70: 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65 73   other variables
3d80: 20 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61   in this block a
3d90: 72 65 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  re described in 
3da0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 64 69 72 65  the comment dire
3db0: 63 74 6c 79 20 0a 20 20 2a 2a 20 61 62 6f 76 65  ctly .  ** above
3dc0: 20 74 68 69 73 20 63 6c 61 73 73 20 64 65 66 69   this class defi
3dd0: 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 75  nition..  */.  u
3de0: 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20  8 state;        
3df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
3e00: 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41  GER_UNLOCK, _SHA
3e10: 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20  RED, _RESERVED, 
3e20: 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 64 62 4d  etc. */.  u8 dbM
3e30: 6f 64 69 66 69 65 64 3b 20 20 20 20 20 20 20 20  odified;        
3e40: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3e50: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 63   there are any c
3e60: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 44 62  hanges to the Db
3e70: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
3e80: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3e90: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20    /* True if an 
3ea0: 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65  fsync() is neede
3eb0: 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
3ec0: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
3ed0: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
3ee0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
3ef0: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
3f00: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
3f10: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
3f20: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ;         /* Set
3f30: 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74   after increment
3f40: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
3f50: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73  ounter */.  u8 s
3f60: 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  etMaster;       
3f70: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3f80: 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61  if a m-j name ha
3f90: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
3fa0: 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64  o jrnl */.  u8 d
3fb0: 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20  oNotSync;       
3fc0: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
3fd0: 61 6e 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20  an. While true, 
3fe0: 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65  do not spill the
3ff0: 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 64   cache */.  u8 d
4000: 62 53 69 7a 65 56 61 6c 69 64 3b 20 20 20 20 20  bSizeValid;     
4010: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 77          /* Set w
4020: 68 65 6e 20 64 62 53 69 7a 65 20 69 73 20 63 6f  hen dbSize is co
4030: 72 72 65 63 74 20 2a 2f 0a 20 20 75 38 20 73 75  rrect */.  u8 su
4040: 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20  bjInMemory;     
4050: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
4060: 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o use in-memory 
4070: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a  sub-journals */.
4080: 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20    Pgno dbSize;  
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
40a0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
40b0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
40c0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69   */.  Pgno dbOri
40d0: 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
40e0: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
40f0: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  re the current t
4100: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
4110: 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b  Pgno dbFileSize;
4120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4130: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
4140: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
4150: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  ile */.  int err
4160: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
4170: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
4180: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
4190: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
41a0: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
41b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73          /* Pages
41c0: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63   journalled sinc
41d0: 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20  e last j-header 
41e0: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32  written */.  u32
41f0: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
4200: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
4210: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
4220: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
4230: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20  ecksum */.  u32 
4240: 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20  nSubRec;        
4250: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4260: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69  r of records wri
4270: 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72  tten to sub-jour
4280: 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  nal */.  Bitvec 
4290: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
42a0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
42b0: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
42c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
42d0: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
42e0: 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20  file *fd;       
42f0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
4300: 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62  riptor for datab
4310: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
4320: 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
4330: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
4340: 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e  criptor for main
4350: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71   journal */.  sq
4360: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64  lite3_file *sjfd
4370: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  ;         /* Fil
4380: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
4390: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
43a0: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
43b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
43c0: 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f   Current write o
43d0: 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75  ffset in the jou
43e0: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
43f0: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20  64 journalHdr;  
4400: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
4410: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65  te offset to pre
4420: 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65  vious journal he
4430: 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  ader */.  i64 jo
4440: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
4450: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69        /* Size li
4460: 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65  mit for persiste
4470: 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
4480: 20 2a 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70   */.  PagerSavep
4490: 6f 69 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74  oint *aSavepoint
44a0: 3b 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63  ; /* Array of ac
44b0: 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
44c0: 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f  */.  int nSavepo
44d0: 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  int;            
44e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
44f0: 65 6d 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70  ements in aSavep
4500: 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72  oint[] */.  char
4510: 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b   dbFileVers[16];
4520: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67          /* Chang
4530: 65 73 20 77 68 65 6e 65 76 65 72 20 64 61 74 61  es whenever data
4540: 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65  base file change
4550: 73 20 2a 2f 0a 20 20 75 33 32 20 73 65 63 74 6f  s */.  u32 secto
4560: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
4570: 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65     /* Assumed se
4580: 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67  ctor size during
4590: 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20   rollback */..  
45a0: 75 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20  u16 nExtra;     
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
45c0: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  dd this many byt
45d0: 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  es to each in-me
45e0: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
45f0: 31 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20  16 nReserve;    
4600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4610: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
4620: 79 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65  ytes at end of e
4630: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33  ach page */.  u3
4640: 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20  2 vfsFlags;     
4650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
4660: 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76  gs for sqlite3_v
4670: 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  fs.xOpen() */.  
4680: 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20  int pageSize;   
4690: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
46a0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
46b0: 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  n a page */.  Pg
46c0: 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20  no mxPgno;      
46d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
46e0: 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a  imum allowed siz
46f0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
4700: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  e */.  char *zFi
4710: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
4720: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
4730: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
4740: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  */.  char *zJour
4750: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
4760: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
4770: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
4780: 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e    int (*xBusyHan
4790: 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a  dler)(void*); /*
47a0: 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c   Function to cal
47b0: 6c 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20  l when busy */. 
47c0: 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64   void *pBusyHand
47d0: 6c 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20  lerArg;      /* 
47e0: 43 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74  Context argument
47f0: 20 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65   for xBusyHandle
4800: 72 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  r */.#ifdef SQLI
4810: 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 48  TE_TEST.  int nH
4820: 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20 20  it, nMiss;      
4830: 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68        /* Cache h
4840: 69 74 73 20 61 6e 64 20 6d 69 73 73 69 6e 67 20  its and missing 
4850: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 20  */.  int nRead, 
4860: 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
4870: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67   /* Database pag
4880: 65 73 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20  es read/written 
4890: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64  */.#endif.  void
48a0: 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62   (*xReiniter)(Db
48b0: 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20  Page*); /* Call 
48c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
48d0: 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65  n reloading page
48e0: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
48f0: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76  TE_HAS_CODEC.  v
4900: 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76  oid *(*xCodec)(v
4910: 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c  oid*,void*,Pgno,
4920: 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65  int); /* Routine
4930: 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67   for en/decoding
4940: 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
4950: 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  (*xCodecSizeChng
4960: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29  )(void*,int,int)
4970: 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70  ; /* Notify of p
4980: 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67 65 73  age size changes
4990: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f   */.  void (*xCo
49a0: 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a 29 3b  decFree)(void*);
49b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
49c0: 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74  Destructor for t
49d0: 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f  he codec */.  vo
49e0: 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20 20 20  id *pCodec;     
49f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
4a00: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  st argument to x
4a10: 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73  Codec... methods
4a20: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61   */.#endif.  cha
4a30: 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r *pTmpSpace;   
4a40: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
4a50: 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  r.pageSize bytes
4a60: 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d   of space for tm
4a70: 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61 63 68  p use */.  PCach
4a80: 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20  e *pPCache;     
4a90: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
4aa0: 72 20 74 6f 20 70 61 67 65 20 63 61 63 68 65 20  r to page cache 
4ab0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
4ac0: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
4ad0: 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  kup;    /* Point
4ae0: 65 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e  er to list of on
4af0: 67 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f  going backup pro
4b00: 63 65 73 73 65 73 20 2a 2f 0a 23 69 66 6e 64 65  cesses */.#ifnde
4b10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
4b20: 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20  L.  Wal *pWal;  
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b40: 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64 20 6c  /* Write-ahead l
4b50: 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f 75 72  og used by "jour
4b60: 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f  nal_mode=wal" */
4b70: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
4b80: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
4b90: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
4ba0: 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75   hold counters u
4bb0: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
4bc0: 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79  ng purposes only
4bd0: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
4be0: 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  es do not exist 
4bf0: 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74  in.** a non-test
4c00: 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73  ing build.  Thes
4c10: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
4c20: 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e  not thread-safe.
4c30: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
4c40: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
4c50: 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
4c60: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
4c70: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
4c80: 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
4c90: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
4ca0: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
4cb0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20  count = 0;   /* 
4cc0: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
4cd0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
4ce0: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
4cf0: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
4d00: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
4d10: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
4d20: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
4d30: 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50  al */.# define P
4d40: 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b  AGER_INCR(v)  v+
4d50: 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  +.#else.# define
4d60: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23   PAGER_INCR(v).#
4d70: 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a  endif..../*.** J
4d80: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67  ournal files beg
4d90: 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  in with the foll
4da0: 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69  owing magic stri
4db0: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a  ng.  The data.**
4dc0: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
4dd0: 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20  om /dev/random. 
4de0: 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79   It is used only
4df0: 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65   as a sanity che
4e00: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  ck..**.** Since 
4e10: 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74  version 2.8.0, t
4e20: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
4e30: 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74  t contains addit
4e40: 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20  ional sanity.** 
4e50: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
4e60: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f  tion.  If the po
4e70: 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20  wer fails while 
4e80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
4e90: 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c  eing.** written,
4ea0: 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72   semi-random gar
4eb0: 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20  bage data might 
4ec0: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f  appear in the jo
4ed0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66  urnal.** file af
4ee0: 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73  ter power is res
4ef0: 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74  tored.  If an at
4f00: 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61  tempt is then ma
4f10: 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68  de.** to roll th
4f20: 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20  e journal back, 
4f30: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
4f40: 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  ld be corrupted.
4f50: 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c    The additional
4f60: 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b  .** sanity check
4f70: 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61  ing data is an a
4f80: 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76  ttempt to discov
4f90: 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69  er the garbage i
4fa0: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
4fb0: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
4fc0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79  **.** The sanity
4fd0: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
4fe0: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65  ation for the ne
4ff0: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
5000: 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20   consists.** of 
5010: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
5020: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f  m on each page o
5030: 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65  f data.  The che
5040: 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74  cksum covers bot
5050: 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  h.** the page nu
5060: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61  mber and the pPa
5070: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
5080: 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20  tes of data for 
5090: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69  the page..** Thi
50a0: 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69  s cksum is initi
50b0: 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62  alized to a 32-b
50c0: 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  it random value 
50d0: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
50e0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
50f0: 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20  ile right after 
5100: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
5110: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69   random initiali
5120: 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  zer is important
5130: 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72  ,.** because gar
5140: 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61  bage data that a
5150: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e  ppears at the en
5160: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69  d of a journal i
5170: 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61  s likely.** data
5180: 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69   that was once i
5190: 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  n other files th
51a0: 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  at have now been
51b0: 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68   deleted.  If th
51c0: 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74  e.** garbage dat
51d0: 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f  a came from an o
51e0: 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
51f0: 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73  file, the checks
5200: 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ums might.** be 
5210: 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79  correct.  But by
5220: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
5230: 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61  e checksum to ra
5240: 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68  ndom value which
5250: 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74  .** is different
5260: 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e   for every journ
5270: 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20  al, we minimize 
5280: 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74  that risk..*/.st
5290: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
52a0: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
52b0: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
52c0: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
52d0: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
52e0: 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d  1, 0x63, 0xd7,.}
52f0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ;../*.** The siz
5300: 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68  e of the of each
5310: 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20   page record in 
5320: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67  the journal is g
5330: 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66  iven by.** the f
5340: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a  ollowing macro..
5350: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
5360: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
5370: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
5380: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
5390: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
53a0: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
53b0: 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69  is pager. This i
53c0: 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61  s usually the sa
53d0: 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61  me .** size as a
53e0: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
53f0: 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65  tor. See also se
5400: 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a  tSectorSize()..*
5410: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
5420: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
5430: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
5440: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
5450: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
5460: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
5470: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
5480: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
5490: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
54a0: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
54b0: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
54c0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
54d0: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
54e0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
54f0: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
5500: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
5510: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
5520: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
5530: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
5540: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
5550: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
5560: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
5570: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
5580: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
5590: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
55a0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
55b0: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
55c0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
55d0: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
55e0: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
55f0: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
5600: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a  #ifndef NDEBUG .
5610: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a  /*.** Usage:.**.
5620: 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73 73  **   assert( ass
5630: 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
5640: 70 50 61 67 65 72 29 20 29 3b 0a 2a 2f 0a 73 74  pPager) );.*/.st
5650: 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f  atic int assert_
5660: 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65  pager_state(Page
5670: 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 2f  r *pPager){..  /
5680: 2a 20 41 20 74 65 6d 70 2d 66 69 6c 65 20 69 73  * A temp-file is
5690: 20 61 6c 77 61 79 73 20 69 6e 20 50 41 47 45 52   always in PAGER
56a0: 5f 45 58 43 4c 55 53 49 56 45 20 6f 72 20 50 41  _EXCLUSIVE or PA
56b0: 47 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74 65  GER_SYNCED state
56c0: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
56d0: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d  Pager->tempFile=
56e0: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  =0 || pPager->st
56f0: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
5700: 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  SIVE );..  /* Th
5710: 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
5720: 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73  e flag is always
5730: 20 73 65 74 20 66 6f 72 20 74 65 6d 70 2d 66 69   set for temp-fi
5740: 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  les */.  assert(
5750: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
5760: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
5770: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
5780: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  );..  return 1;.
5790: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
57a0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69  Return true if i
57b0: 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
57c0: 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50  o write page *pP
57d0: 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  g into the sub-j
57e0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67  ournal..** A pag
57f0: 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72  e needs to be wr
5800: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73  itten into the s
5810: 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68  ub-journal if th
5820: 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a  ere exists one.*
5830: 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73  * or more open s
5840: 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68  avepoints for wh
5850: 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ich:.**.**   * T
5860: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
5870: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
5880: 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76  qual to PagerSav
5890: 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e  epoint.nOrig, an
58a0: 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74  d.**   * The bit
58b0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
58c0: 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  o the page-numbe
58d0: 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a  r is not set in.
58e0: 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
58f0: 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
5900: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
5910: 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  t subjRequiresPa
5920: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
5930: 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
5940: 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72  g->pgno;.  Pager
5950: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
5960: 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b  pPager;.  int i;
5970: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
5980: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
5990: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65  ; i++){.    Page
59a0: 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20  rSavepoint *p = 
59b0: 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  &pPager->aSavepo
59c0: 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  int[i];.    if( 
59d0: 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26  p->nOrig>=pgno &
59e0: 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76  & 0==sqlite3Bitv
59f0: 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76  ecTest(p->pInSav
5a00: 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b  epoint, pgno) ){
5a10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
5a20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5a30: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
5a40: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
5a50: 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  he page is alrea
5a60: 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  dy in the journa
5a70: 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  l file..*/.stati
5a80: 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72  c int pageInJour
5a90: 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29 7b  nal(PgHdr *pPg){
5aa0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
5ab0: 33 42 69 74 76 65 63 54 65 73 74 28 70 50 67 2d  3BitvecTest(pPg-
5ac0: 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  >pPager->pInJour
5ad0: 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  nal, pPg->pgno);
5ae0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
5af0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
5b00: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66  from the given f
5b10: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
5b20: 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67   Store the integ
5b30: 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65  er.** that is re
5b40: 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65  ad in *pRes.  Re
5b50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
5b60: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
5b70: 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72  ked, or an.** er
5b80: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
5b90: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
5ba0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75  ..**.** All valu
5bb0: 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e  es are stored on
5bc0: 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64   disk as big-end
5bd0: 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ian..*/.static i
5be0: 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71  nt read32bits(sq
5bf0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
5c00: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
5c10: 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e  *pRes){.  unsign
5c20: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
5c30: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
5c40: 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20  3OsRead(fd, ac, 
5c50: 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73  sizeof(ac), offs
5c60: 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  et);.  if( rc==S
5c70: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5c80: 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47  *pRes = sqlite3G
5c90: 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d  et4byte(ac);.  }
5ca0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5cb0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
5cc0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
5cd0: 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  to a string buff
5ce0: 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e  er in big-endian
5cf0: 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a   byte order..*/.
5d00: 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74  #define put32bit
5d10: 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50  s(A,B)  sqlite3P
5d20: 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42  ut4byte((u8*)A,B
5d30: 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  )../*.** Write a
5d40: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
5d50: 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  into the given f
5d60: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
5d70: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
5d80: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
5d90: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
5da0: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
5db0: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
5dc0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62  tic int write32b
5dd0: 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  its(sqlite3_file
5de0: 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *fd, i64 offset
5df0: 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68  , u32 val){.  ch
5e00: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33  ar ac[4];.  put3
5e10: 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a  2bits(ac, val);.
5e20: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
5e30: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
5e40: 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f  4, offset);.}../
5e50: 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
5e60: 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20  t to this macro 
5e70: 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  is a file descri
5e80: 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69 74  ptor (type sqlit
5e90: 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65  e3_file*)..** Re
5ea0: 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73 20  turn 0 if it is 
5eb0: 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e  not open, or non
5ec0: 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20 31  -zero (but not 1
5ed0: 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  ) if it is..**.*
5ee0: 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61  * This is so tha
5ef0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61  t expressions ca
5f00: 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73 3a  n be written as:
5f10: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f  .**.**   if( isO
5f20: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
5f30: 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e   ){ ....**.** in
5f40: 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20  stead of.**.**  
5f50: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66 64   if( pPager->jfd
5f60: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e  ->pMethods ){ ..
5f70: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f  ..*/.#define isO
5f80: 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29 2d  pen(pFd) ((pFd)-
5f90: 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a  >pMethods)../*.*
5fa0: 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20 69 73  * If file pFd is
5fb0: 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69   open, call sqli
5fc0: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e  te3OsUnlock() on
5fd0: 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   it..*/.static i
5fe0: 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69  nt osUnlock(sqli
5ff0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69  te3_file *pFd, i
6000: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28  nt eLock){.  if(
6010: 20 21 69 73 4f 70 65 6e 28 70 46 64 29 20 29 7b   !isOpen(pFd) ){
6020: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6030: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  TE_OK;.  }.  ret
6040: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  urn sqlite3OsUnl
6050: 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b  ock(pFd, eLock);
6060: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
6070: 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e  unction determin
6080: 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  es whether or no
6090: 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  t the atomic-wri
60a0: 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
60b0: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  ** can be used w
60c0: 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20  ith this pager. 
60d0: 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  The optimization
60e0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a   can be used if:
60f0: 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20  .**.**  (a) the 
6100: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
6110: 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  y OsDeviceCharac
6120: 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69  teristics() indi
6130: 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20  cates that.**   
6140: 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61     a database pa
6150: 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  ge may be writte
6160: 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e  n atomically, an
6170: 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61  d.**  (b) the va
6180: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
6190: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69  OsSectorSize() i
61a0: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
61b0: 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20  qual.**      to 
61c0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
61d0: 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a  *.** The optimiz
61e0: 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c  ation is also al
61f0: 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72  ways enabled for
6200: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
6210: 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72  . It is.** an er
6220: 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  ror to call this
6230: 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61   function if pPa
6240: 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ger is opened on
6250: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a   an in-memory.**
6260: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
6270: 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
6280: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75  tion cannot be u
6290: 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e  sed, 0 is return
62a0: 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65  ed. If it can be
62b0: 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74   used,.** then t
62c0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
62d0: 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  d is the size of
62e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
62f0: 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e  e when it.** con
6300: 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64  tains rollback d
6310: 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20  ata for exactly 
6320: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  one page..*/.#if
6330: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
6340: 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73  E_ATOMIC_WRITE.s
6350: 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75  tatic int jrnlBu
6360: 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a  fferSize(Pager *
6370: 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
6380: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69  t( !MEMDB );.  i
6390: 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
63a0: 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  File ){.    int 
63b0: 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dc;             
63c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
63d0: 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65   Device characte
63e0: 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69  ristics */.    i
63f0: 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20  nt nSector;     
6400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6410: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
6420: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67  */.    int szPag
6430: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
6440: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
6450: 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73   size */..    as
6460: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
6470: 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20  ger->fd) );.    
6480: 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  dc = sqlite3OsDe
6490: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
64a0: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
64b0: 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70  .    nSector = p
64c0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
64d0: 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20  e;.    szPage = 
64e0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
64f0: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53 51  ;..    assert(SQ
6500: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
6510: 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b  C512==(512>>8));
6520: 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49  .    assert(SQLI
6530: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
6540: 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
6550: 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26  .    if( 0==(dc&
6560: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
6570: 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29  OMIC|(szPage>>8)
6580: 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50  ) || nSector>szP
6590: 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65  age) ){.      re
65a0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
65b0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52  }..  return JOUR
65c0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
65d0: 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  r) + JOURNAL_PG_
65e0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65  SZ(pPager);.}.#e
65f0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53  ndif../*.** If S
6600: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
6610: 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  S is defined the
6620: 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e  n we do some san
6630: 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  ity checking.** 
6640: 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69  on the cache usi
6650: 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69  ng a hash functi
6660: 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  on.  This is use
6670: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a  d for testing.**
6680: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
6690: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nly..*/.#ifdef S
66a0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
66b0: 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  S./*.** Return a
66c0: 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20   32-bit hash of 
66d0: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f  the page data fo
66e0: 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  r pPage..*/.stat
66f0: 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74  ic u32 pager_dat
6700: 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c  ahash(int nByte,
6710: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
6720: 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61  pData){.  u32 ha
6730: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
6740: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42  .  for(i=0; i<nB
6750: 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68  yte; i++){.    h
6760: 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39  ash = (hash*1039
6770: 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20  ) + pData[i];.  
6780: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
6790: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  .}.static u32 pa
67a0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48  ger_pagehash(PgH
67b0: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  dr *pPage){.  re
67c0: 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68  turn pager_datah
67d0: 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65  ash(pPage->pPage
67e0: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e  r->pageSize, (un
67f0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50  signed char *)pP
6800: 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73  age->pData);.}.s
6810: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
6820: 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67  _set_pagehash(Pg
6830: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70  Hdr *pPage){.  p
6840: 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d  Page->pageHash =
6850: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
6860: 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage);.}../*.**
6870: 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20   The CHECK_PAGE 
6880: 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67  macro takes a Pg
6890: 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  Hdr* as an argum
68a0: 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43  ent. If SQLITE_C
68b0: 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73  HECK_PAGES.** is
68c0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44   defined, and ND
68d0: 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
68e0: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
68f0: 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b   statement check
6900: 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  s.** that the pa
6910: 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72  ge is either dir
6920: 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63  ty or still matc
6930: 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74  hes the calculat
6940: 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f  ed page-hash..*/
6950: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
6960: 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65  AGE(x) checkPage
6970: 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  (x).static void 
6980: 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20  checkPage(PgHdr 
6990: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
69a0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
69b0: 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
69c0: 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c  !pPg->pageHash |
69d0: 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  | pPager->errCod
69e0: 65 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d  e.      || (pPg-
69f0: 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
6a00: 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65  TY) || pPg->page
6a10: 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65  Hash==pager_page
6a20: 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a  hash(pPg) );.}..
6a30: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61  #else.#define pa
6a40: 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59  ger_datahash(X,Y
6a50: 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67  )  0.#define pag
6a60: 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20 20  er_pagehash(X)  
6a70: 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  0.#define CHECK_
6a80: 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20  PAGE(x).#endif  
6a90: 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  /* SQLITE_CHECK_
6aa0: 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  PAGES */../*.** 
6ab0: 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
6ac0: 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  led the journal 
6ad0: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
6ae0: 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70  Pager must be op
6af0: 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  en..** This func
6b00: 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
6b10: 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a   read a master j
6b20: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
6b30: 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e   from the .** en
6b40: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e  d of the file an
6b50: 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  d, if successful
6b60: 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f  , copies it into
6b70: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
6b80: 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c   .** by the call
6b90: 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  er. See comments
6ba0: 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74   above writeMast
6bb0: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
6bc0: 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73  the format.** us
6bd0: 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61  ed to store a ma
6be0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
6bf0: 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e  e name at the en
6c00: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  d of a journal f
6c10: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74  ile..**.** zMast
6c20: 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  er must point to
6c30: 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
6c40: 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79  least nMaster by
6c50: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  tes allocated by
6c60: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20  .** the caller. 
6c70: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73  This should be s
6c80: 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
6c90: 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75  hname+1 (to ensu
6ca0: 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65  re there is.** e
6cb0: 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77  nough space to w
6cc0: 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
6cd0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49  journal name). I
6ce0: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
6cf0: 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20  rnal.** name in 
6d00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  the journal is l
6d10: 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74  onger than nMast
6d20: 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64  er bytes (includ
6d30: 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72  ing a.** nul-ter
6d40: 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74  minator), then t
6d50: 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61  his is handled a
6d60: 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  s if no master j
6d70: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77  ournal name.** w
6d80: 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74  ere present in t
6d90: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
6da0: 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
6db0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
6dc0: 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68  is present at th
6dd0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
6de0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68  rnal.** file, th
6df0: 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  en it is copied 
6e00: 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
6e10: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
6e20: 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d  aster. A.** nul-
6e30: 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
6e40: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
6e50: 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77  he buffer follow
6e60: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a  ing the master.*
6e70: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
6e80: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  ame..**.** If it
6e90: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74   is determined t
6ea0: 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  hat no master jo
6eb0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
6ec0: 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a  is present .** z
6ed0: 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74  Master[0] is set
6ee0: 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
6ef0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
6f00: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
6f10: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61  occurs while rea
6f20: 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ding from the jo
6f30: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53  urnal file, an S
6f40: 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63  QLite.** error c
6f50: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
6f60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
6f70: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
6f80: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
6f90: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73  Jrnl, char *zMas
6fa0: 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72  ter, u32 nMaster
6fb0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
6fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fd0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
6fe0: 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20  /.  u32 len;    
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7000: 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  * Length in byte
7010: 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
7020: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36  nal name */.  i6
7030: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
7040: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
7050: 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  l size in bytes 
7060: 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
7070: 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63  pJrnl */.  u32 c
7080: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
7090: 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63        /* MJ chec
70a0: 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20  ksum value read 
70b0: 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  from journal */.
70c0: 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
70e0: 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
70f0: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67  unter */.  unsig
7100: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
7110: 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65  8];   /* A buffe
7120: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
7130: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
7140: 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30  zMaster[0] = '\0
7150: 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  ';..  if( SQLITE
7160: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
7170: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72  e3OsFileSize(pJr
7180: 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c  nl, &szJ)).   ||
7190: 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51   szJ<16.   || SQ
71a0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
71b0: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
71c0: 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a   szJ-16, &len)).
71d0: 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74     || len>=nMast
71e0: 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  er .   || SQLITE
71f0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
7200: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
7210: 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20  -12, &cksum)).  
7220: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
7230: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
7240: 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63  ad(pJrnl, aMagic
7250: 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20  , 8, szJ-8)).   
7260: 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  || memcmp(aMagic
7270: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
7280: 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45   8).   || SQLITE
7290: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
72a0: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
72b0: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a  zMaster, len, sz
72c0: 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a  J-16-len)).  ){.
72d0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
72e0: 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20   }..  /* See if 
72f0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74  the checksum mat
7300: 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20  ches the master 
7310: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
7320: 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e    for(u=0; u<len
7330: 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; u++){.    cksu
7340: 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b  m -= zMaster[u];
7350: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d  .  }.  if( cksum
7360: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
7370: 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e  e checksum doesn
7380: 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20  't add up, then 
7390: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
73a0: 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a  he disk sectors.
73b0: 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e      ** containin
73c0: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
73d0: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  rnal filename is
73e0: 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73   corrupted. This
73f0: 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65   means.    ** de
7400: 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61  finitely roll ba
7410: 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75  ck, so just retu
7420: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
7430: 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a   report a (nul).
7440: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f      ** master-jo
7450: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a  urnal filename..
7460: 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d      */.    len =
7470: 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65   0;.  }.  zMaste
7480: 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20  r[len] = '\0';. 
7490: 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
74a0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
74b0: 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65  Return the offse
74c0: 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  t of the sector 
74d0: 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69  boundary at or i
74e0: 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66  mmediately .** f
74f0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c  ollowing the val
7500: 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f  ue in pPager->jo
7510: 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69  urnalOff, assumi
7520: 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20  ng a sector .** 
7530: 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  size of pPager->
7540: 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73  sectorSize bytes
7550: 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20  ..**.** i.e for 
7560: 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66  a sector size of
7570: 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61   512:.**.**   Pa
7580: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20  ger.journalOff  
7590: 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 76          Return v
75a0: 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  alue.**   ------
75b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75d0: 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20  -.**   0        
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75f0: 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20   0.**   512     
7600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7610: 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20    512.**   100  
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7630: 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30       512.**   20
7640: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
7650: 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20          2048.** 
7660: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a  .*/.static i64 j
7670: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
7680: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
7690: 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
76a0: 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67  ;.  i64 c = pPag
76b0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
76c0: 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f    if( c ){.    o
76d0: 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a  ffset = ((c-1)/J
76e0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
76f0: 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55  ager) + 1) * JOU
7700: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
7710: 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  er);.  }.  asser
7720: 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41  t( offset%JOURNA
7730: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
7740: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
7750: 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20   offset>=c );.  
7760: 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d  assert( (offset-
7770: 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  c)<JOURNAL_HDR_S
7780: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  Z(pPager) );.  r
7790: 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a  eturn offset;.}.
77a0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
77b0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
77c0: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66  open when this f
77d0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
77e0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
77f0: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
7800: 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  p if the journal
7810: 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65   file has not be
7820: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a  en written to.**
7830: 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72   within the curr
7840: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
7850: 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a  (i.e. if Pager.j
7860: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a  ournalOff==0)..*
7870: 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61  *.** If doTrunca
7880: 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  te is non-zero o
7890: 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72  r the Pager.jour
78a0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72  nalSizeLimit var
78b0: 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20  iable is.** set 
78c0: 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63  to 0, then trunc
78d0: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
78e0: 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74  file to zero byt
78f0: 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65  es in size. Othe
7900: 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74  rwise,.** zero t
7910: 68 65 20 32 38 2d 62 79 74 65 20 68 65 61 64 65  he 28-byte heade
7920: 72 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  r at the start o
7930: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
7940: 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  le. In either ca
7950: 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70  se, .** if the p
7960: 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e  ager is not in n
7970: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e  o-sync mode, syn
7980: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
7990: 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  le immediately .
79a0: 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e 67  ** after writing
79b0: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69   or truncating i
79c0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65  t..**.** If Page
79d0: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
79e0: 69 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 70  it is set to a p
79f0: 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72  ositive, non-zer
7a00: 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20  o value, and.** 
7a10: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72  following the tr
7a20: 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f  uncation or zero
7a30: 69 6e 67 20 64 65 73 63 72 69 62 65 64 20 61 62  ing described ab
7a40: 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ove the size of 
7a50: 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  the .** journal 
7a60: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73  file in bytes is
7a70: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
7a80: 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72  s value, then tr
7a90: 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f  uncate the.** jo
7aa0: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61  urnal file to Pa
7ab0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
7ac0: 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65 20  imit bytes. The 
7ad0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
7ae0: 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f  s.** not need to
7af0: 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f   be synced follo
7b00: 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74  wing this operat
7b10: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ion..**.** If an
7b20: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
7b30: 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73  , abandon proces
7b40: 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  sing and return 
7b50: 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
7b60: 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  e..** Otherwise,
7b70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7b80: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
7b90: 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
7ba0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
7bb0: 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a  nt doTruncate){.
7bc0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
7bd0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bf0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
7c00: 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  de */.  assert( 
7c10: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
7c20: 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  fd) );.  if( pPa
7c30: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
7c40: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34  ){.    const i64
7c50: 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72   iLimit = pPager
7c60: 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
7c70: 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  it;    /* Local 
7c80: 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a  cache of jsl */.
7c90: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
7ca0: 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70  ZEROHDR %p\n", p
7cb0: 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28 20  Pager)).    if( 
7cc0: 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c  doTruncate || iL
7cd0: 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  imit==0 ){.     
7ce0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
7cf0: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
7d00: 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  jfd, 0);.    }el
7d10: 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63  se{.      static
7d20: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f   const char zero
7d30: 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20  Hdr[28] = {0};. 
7d40: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7d50: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
7d60: 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73  >jfd, zeroHdr, s
7d70: 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20  izeof(zeroHdr), 
7d80: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
7d90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7da0: 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
7db0: 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nc ){.      rc =
7dc0: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
7dd0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49  Pager->jfd, SQLI
7de0: 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
7df0: 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c  |pPager->sync_fl
7e00: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ags);.    }..   
7e10: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
7e20: 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
7e30: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62  n is committed b
7e40: 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ut the write loc
7e50: 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  k .    ** is sti
7e60: 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66  ll held on the f
7e70: 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
7e80: 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f   a size limit co
7e90: 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20  nfigured for .  
7ea0: 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74    ** the persist
7eb0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ent journal and 
7ec0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
7ed0: 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75   currently consu
7ee0: 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20  mes more.    ** 
7ef0: 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74 20  space than that 
7f00: 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72  limit allows for
7f10: 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f  , truncate it no
7f20: 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  w. There is no n
7f30: 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79  eed.    ** to sy
7f40: 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c  nc the file foll
7f50: 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61  owing this opera
7f60: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
7f70: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7f80: 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29  OK && iLimit>0 )
7f90: 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a  {.      i64 sz;.
7fa0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7fb0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
7fc0: 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a  ger->jfd, &sz);.
7fd0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
7fe0: 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c  LITE_OK && sz>iL
7ff0: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
8000: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
8010: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
8020: 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  fd, iLimit);.   
8030: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
8040: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
8050: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
8060: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
8070: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  en when this rou
8080: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
8090: 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61  A journal.** hea
80a0: 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  der (JOURNAL_HDR
80b0: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72  _SZ bytes) is wr
80c0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
80d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74  ournal file at t
80e0: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f  he.** current lo
80f0: 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cation..**.** Th
8100: 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65  e format for the
8110: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
8120: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
8130: 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67  * - 8 bytes: Mag
8140: 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a  ic identifying j
8150: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a  ournal format..*
8160: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d  * - 4 bytes: Num
8170: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
8180: 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31  n journal, or -1
8190: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73   no-sync mode is
81a0: 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65   on..** - 4 byte
81b0: 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  s: Random number
81c0: 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68   used for page h
81d0: 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  ash..** - 4 byte
81e0: 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62  s: Initial datab
81f0: 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  ase page count..
8200: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65  ** - 4 bytes: Se
8210: 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62  ctor size used b
8220: 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  y the process th
8230: 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f  at wrote this jo
8240: 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79  urnal..** - 4 by
8250: 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70 61  tes: Database pa
8260: 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20  ge size..** .** 
8270: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55  Followed by (JOU
8280: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
8290: 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  ) bytes of unuse
82a0: 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  d space..*/.stat
82b0: 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72  ic int writeJour
82c0: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
82d0: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
82e0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8300: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
8310: 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d   char *zHeader =
8320: 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
8330: 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72  ce;  /* Temporar
8340: 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20  y space used to 
8350: 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a  build header */.
8360: 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20    u32 nHeader = 
8370: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
8380: 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
8390: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
83a0: 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f  to by zHeader */
83b0: 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20 20  .  u32 nWrite;  
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83d0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
83e0: 6f 66 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  of header sector
83f0: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
8400: 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
8410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8420: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
8430: 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
8440: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
8450: 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a  fd) );      /* J
8460: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
8470: 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20   be open. */..  
8480: 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52  if( nHeader>JOUR
8490: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
84a0: 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  r) ){.    nHeade
84b0: 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  r = JOURNAL_HDR_
84c0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
84d0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
84e0: 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  re active savepo
84f0: 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20  ints and any of 
8500: 74 68 65 6d 20 77 65 72 65 20 63 72 65 61 74 65  them were create
8510: 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68  d .  ** since th
8520: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f  e most recent jo
8530: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73  urnal header was
8540: 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65   written, update
8550: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
8560: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
8570: 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e  fset fields now.
8580: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
8590: 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
85a0: 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
85b0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
85c0: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
85d0: 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a  HdrOffset==0 ){.
85e0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53        pPager->aS
85f0: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64  avepoint[ii].iHd
8600: 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72  rOffset = pPager
8610: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
8620: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
8630: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
8640: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8650: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
8660: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a  ffset(pPager);..
8670: 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65    /* .  ** Write
8680: 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20   the nRec Field 
8690: 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  - the number of 
86a0: 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  page records tha
86b0: 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20  t follow this.  
86c0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
86d0: 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72  r. Normally, zer
86e0: 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  o is written to 
86f0: 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74 68  this value at th
8700: 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66  is time..  ** Af
8710: 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73 20  ter the records 
8720: 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65  are added to the
8730: 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68   journal (and th
8740: 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64  e journal synced
8750: 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75  , .  ** if in fu
8760: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74  ll-sync mode), t
8770: 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77  he zero is overw
8780: 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20  ritten with the 
8790: 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  true number.  **
87a0: 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65 65   of records (see
87b0: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e   syncJournal()).
87c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73  .  **.  ** A fas
87d0: 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20  ter alternative 
87e0: 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46  is to write 0xFF
87f0: 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52  FFFFFF to the nR
8800: 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20  ec field. When. 
8810: 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
8820: 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c  journal this val
8830: 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20  ue tells SQLite 
8840: 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  to assume that t
8850: 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20  he.  ** rest of 
8860: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
8870: 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20   contains valid 
8880: 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68  page records. Th
8890: 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20  is assumption.  
88a0: 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c  ** is dangerous,
88b0: 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72 65   as if a failure
88c0: 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74   occurred whilst
88d0: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
88e0: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
88f0: 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e  e it may contain
8900: 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61   some garbage da
8910: 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  ta. There are tw
8920: 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a  o scenarios.  **
8930: 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b   where this risk
8940: 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a   can be ignored:
8950: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
8960: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
8970: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
8980: 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e  . Corruption can
8990: 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20   follow a.  **  
89a0: 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65     power failure
89b0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   in this case an
89c0: 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  yway..  **.  ** 
89d0: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c    * When the SQL
89e0: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
89f0: 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65  PPEND flag is se
8a00: 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  t. This guarante
8a10: 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74  es.  **     that
8a20: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73   garbage data is
8a30: 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20   never appended 
8a40: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
8a50: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
8a60: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
8a70: 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
8a80: 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66  ->noSync );.  if
8a90: 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( (pPager->noSyn
8aa0: 63 29 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a  c) || (pPager->j
8ab0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
8ac0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
8ad0: 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c  MORY).   || (sql
8ae0: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
8af0: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
8b00: 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
8b10: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
8b20: 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63  ) .  ){.    memc
8b30: 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75  py(zHeader, aJou
8b40: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
8b50: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
8b60: 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73  );.    put32bits
8b70: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
8b80: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
8b90: 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  , 0xffffffff);. 
8ba0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73   }else{.    mems
8bb0: 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73  et(zHeader, 0, s
8bc0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
8bd0: 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20  gic)+4);.  }..  
8be0: 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68  /* The random ch
8bf0: 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c  eck-hash initial
8c00: 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74  iser */ .  sqlit
8c10: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
8c20: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73  zeof(pPager->cks
8c30: 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72  umInit), &pPager
8c40: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
8c50: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
8c60: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
8c70: 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61  alMagic)+4], pPa
8c80: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
8c90: 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61  .  /* The initia
8ca0: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
8cb0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
8cc0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
8cd0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d  JournalMagic)+8]
8ce0: 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  , pPager->dbOrig
8cf0: 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Size);.  /* The 
8d00: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  assumed sector s
8d10: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  ize for this pro
8d20: 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62  cess */.  put32b
8d30: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
8d40: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
8d50: 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e  c)+12], pPager->
8d60: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20  sectorSize);..  
8d70: 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  /* The page size
8d80: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
8d90: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
8da0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
8db0: 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  6], pPager->page
8dc0: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69  Size);..  /* Ini
8dd0: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61  tializing the ta
8de0: 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  il of the buffer
8df0: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
8e00: 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20  y.  Everything. 
8e10: 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69   ** works find i
8e20: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
8e30: 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74  memset() is omit
8e40: 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61  ted.  But initia
8e50: 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  lizing.  ** the 
8e60: 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20  memory prevents 
8e70: 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f  valgrind from co
8e80: 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65  mplaining, so we
8e90: 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a   are willing to.
8ea0: 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65    ** take the pe
8eb0: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20  rformance hit.. 
8ec0: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48   */.  memset(&zH
8ed0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
8ee0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c  urnalMagic)+20],
8ef0: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65   0,.         nHe
8f00: 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f  ader-(sizeof(aJo
8f10: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29  urnalMagic)+20))
8f20: 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72  ;..  /* In theor
8f30: 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65  y, it is only ne
8f40: 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
8f50: 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74 68   the 28 bytes th
8f60: 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75  at the .  ** jou
8f70: 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73  rnal header cons
8f80: 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72  umes to the jour
8f90: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54  nal file here. T
8fa0: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  hen increment th
8fb0: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f  e .  ** Pager.jo
8fc0: 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c  urnalOff variabl
8fd0: 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  e by JOURNAL_HDR
8fe0: 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20  _SZ so that the 
8ff0: 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72  next .  ** recor
9000: 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  d is written to 
9010: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  the following se
9020: 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20  ctor (leaving a 
9030: 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a  gap in the file.
9040: 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62    ** that will b
9050: 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c  e implicitly fil
9060: 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53  led in by the OS
9070: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77  )..  **.  ** How
9080: 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  ever it has been
9090: 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
90a0: 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   on some systems
90b0: 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63 61   this pattern ca
90c0: 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69  n .  ** be signi
90d0: 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20  ficantly slower 
90e0: 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c  than contiguousl
90f0: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
9100: 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a  o the file,.  **
9110: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
9120: 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77  ans explicitly w
9130: 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74  riting data to t
9140: 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a  he block of .  *
9150: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
9160: 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74 68  Z - 28) bytes th
9170: 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  at will not be u
9180: 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20  sed. So that is 
9190: 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e  what.  ** is don
91a0: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e. .  **.  ** Th
91b0: 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72  e loop is requir
91c0: 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65 20  ed here in case 
91d0: 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  the sector-size 
91e0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
91f0: 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  he .  ** databas
9200: 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e  e page size. Sin
9210: 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20 62  ce the zHeader b
9220: 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61  uffer is only Pa
9230: 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a  ger.pageSize.  *
9240: 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  * bytes in size,
9250: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
9260: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  all to sqlite3Os
9270: 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20 72  Write() may be r
9280: 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20  equired.  ** to 
9290: 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74  populate the ent
92a0: 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ire journal head
92b0: 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20  er sector..  */ 
92c0: 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b  .  for(nWrite=0;
92d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26   rc==SQLITE_OK&&
92e0: 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48  nWrite<JOURNAL_H
92f0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e  DR_SZ(pPager); n
9300: 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b  Write+=nHeader){
9310: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
9320: 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
9330: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
9340: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e  r->journalHdr, n
9350: 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63 20  Header)).    rc 
9360: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
9370: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48  (pPager->jfd, zH
9380: 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20  eader, nHeader, 
9390: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
93a0: 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ff);.    assert(
93b0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
93c0: 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
93d0: 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20  ournalOff );.   
93e0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
93f0: 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a  Off += nHeader;.
9400: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
9410: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
9420: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
9430: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
9440: 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  is is called. A 
9450: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
9460: 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f  ile.** (JOURNAL_
9470: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
9480: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63   read from the c
9490: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
94a0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
94b0: 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72  * file. The curr
94c0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
94d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
94e0: 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20   is given by.** 
94f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9500: 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  ff. See comments
9510: 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20   above function 
9520: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
9530: 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72  ) for.** a descr
9540: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f  iption of the jo
9550: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72  urnal header for
9560: 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  mat..**.** If th
9570: 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64  e header is read
9580: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a   successfully, *
9590: 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20  pNRec is set to 
95a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
95b0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f   page records fo
95c0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61  llowing this hea
95d0: 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65  der and *pDbSize
95e0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
95f0: 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ize of the.** da
9600: 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68  tabase before th
9610: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
9620: 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41  gan, in pages. A
9630: 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  lso, pPager->cks
9640: 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74  umInit.** is set
9650: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65   to the value re
9660: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
9670: 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49  nal header. SQLI
9680: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
9690: 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  d.** in this cas
96a0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
96b0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
96c0: 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  ile appears to b
96d0: 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c  e corrupted, SQL
96e0: 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72  ITE_DONE is.** r
96f0: 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52  eturned and *pNR
9700: 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20  ec and *PDbSize 
9710: 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20  are undefined.  
9720: 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  If JOURNAL_HDR_S
9730: 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f  Z bytes.** canno
9740: 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  t be read from t
9750: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9760: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
9770: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
9780: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75  atic int readJou
9790: 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72  rnalHdr(.  Pager
97a0: 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
97b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
97c0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
97d0: 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f   isHot,.  i64 jo
97e0: 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20  urnalSize,      
97f0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
9800: 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e  f the open journ
9810: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
9820: 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63   */.  u32 *pNRec
9830: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9840: 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
9850: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e   read from the n
9860: 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75  Rec field */.  u
9870: 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20  32 *pDbSize     
9880: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
9890: 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69  UT: Value of ori
98a0: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73  ginal database s
98b0: 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a  ize field */.){.
98c0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
98d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
98e0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
98f0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
9900: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20   aMagic[8];     
9910: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
9920: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
9930: 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48  ader */.  i64 iH
9940: 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
9950: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
9960: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
9970: 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f  er being read */
9980: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ..  assert( isOp
9990: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
99a0: 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e  );      /* Journ
99b0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
99c0: 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41  open. */..  /* A
99d0: 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75  dvance Pager.jou
99e0: 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73  rnalOff to the s
99f0: 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74  tart of the next
9a00: 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a   sector. If the.
9a10: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
9a20: 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66  e is too small f
9a30: 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 61  or there to be a
9a40: 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20 61   header stored a
9a50: 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e  t this.  ** poin
9a60: 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
9a70: 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50  _DONE..  */.  pP
9a80: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9a90: 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
9aa0: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
9ab0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
9ac0: 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alOff+JOURNAL_HD
9ad0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a  R_SZ(pPager) > j
9ae0: 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20  ournalSize ){.  
9af0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9b00: 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72  DONE;.  }.  iHdr
9b10: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
9b20: 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20  urnalOff;..  /* 
9b30: 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72 73  Read in the firs
9b40: 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 8 bytes of the
9b50: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
9b60: 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20   If they do not 
9b70: 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20  match.  ** the  
9b80: 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75  magic string fou
9b90: 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nd at the start 
9ba0: 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  of each journal 
9bb0: 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20  header, return. 
9bc0: 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e   ** SQLITE_DONE.
9bd0: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
9be0: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61  occurs, return a
9bf0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  n error code. Ot
9c00: 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72  herwise,.  ** pr
9c10: 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  oceed..  */.  if
9c20: 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f  ( isHot || iHdrO
9c30: 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ff!=pPager->jour
9c40: 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63  nalHdr ){.    rc
9c50: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
9c60: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
9c70: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
9c80: 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a  gic), iHdrOff);.
9c90: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
9ca0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
9cb0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d     }.    if( mem
9cc0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
9cd0: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
9ce0: 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b  f(aMagic))!=0 ){
9cf0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9d00: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
9d10: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
9d20: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20  the first three 
9d30: 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66  32-bit fields of
9d40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
9d50: 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20  der: The nRec.  
9d60: 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68  ** field, the ch
9d70: 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a  ecksum-initializ
9d80: 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  er and the datab
9d90: 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65 20  ase size at the 
9da0: 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
9db0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52  e transaction. R
9dc0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
9dd0: 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
9de0: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f  goes wrong..  */
9df0: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
9e00: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
9e10: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
9e20: 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63  iHdrOff+8, pNRec
9e30: 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
9e40: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
9e50: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
9e60: 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70  , iHdrOff+12, &p
9e70: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
9e80: 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
9e90: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
9ea0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
9eb0: 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44  , iHdrOff+16, pD
9ec0: 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20  bSize)).  ){.   
9ed0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
9ee0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
9ef0: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
9f00: 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69 7a      u32 iPageSiz
9f10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
9f20: 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69   /* Page-size fi
9f30: 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  eld of journal h
9f40: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  eader */.    u32
9f50: 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20   iSectorSize;   
9f60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
9f70: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  tor-size field o
9f80: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
9f90: 20 2a 2f 0a 20 20 20 20 75 31 36 20 69 50 61 67   */.    u16 iPag
9fa0: 65 53 69 7a 65 31 36 3b 20 20 20 20 20 20 20 20  eSize16;        
9fb0: 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
9fc0: 69 50 61 67 65 53 69 7a 65 20 69 6e 20 31 36 2d  iPageSize in 16-
9fd0: 62 69 74 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  bit variable */.
9fe0: 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
9ff0: 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
a000: 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e  ector-size journ
a010: 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64 73  al header fields
a020: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c  . */.    if( SQL
a030: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
a040: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
a050: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30  >jfd, iHdrOff+20
a060: 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29  , &iSectorSize))
a070: 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  .     || SQLITE_
a080: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
a090: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
a0a0: 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69  , iHdrOff+24, &i
a0b0: 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29  PageSize)).    )
a0c0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
a0d0: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
a0e0: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
a0f0: 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d  values read from
a100: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
a110: 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66  nd sector-size f
a120: 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65  ields.    ** are
a130: 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54   within range. T
a140: 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c  o be 'in range',
a150: 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65   both values nee
a160: 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a  d to be a power.
a170: 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72      ** of two gr
a180: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
a190: 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32  ual to 512 or 32
a1a0: 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65  , and not greate
a1b0: 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20  r than their .  
a1c0: 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20    ** respective 
a1d0: 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78  compile time max
a1e0: 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20  imum limits..   
a1f0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67   */.    if( iPag
a200: 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20  eSize<512       
a210: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53             || iS
a220: 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20  ectorSize<32.   
a230: 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53    || iPageSize>S
a240: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
a250: 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69  IZE || iSectorSi
a260: 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ze>MAX_SECTOR_SI
a270: 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61  ZE.     || ((iPa
a280: 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53  geSize-1)&iPageS
a290: 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69  ize)!=0   || ((i
a2a0: 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53  SectorSize-1)&iS
a2b0: 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20  ectorSize)!=0 . 
a2c0: 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49     ){.      /* I
a2d0: 66 20 74 68 65 20 65 69 74 68 65 72 20 74 68 65  f the either the
a2e0: 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65   page-size or se
a2f0: 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65  ctor-size in the
a300: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
a310: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76  is .      ** inv
a320: 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70  alid, then the p
a330: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
a340: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  e the journal-he
a350: 61 64 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a  ader must have .
a360: 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64        ** crashed
a370: 20 62 65 66 6f 72 65 20 74 68 65 20 68 65 61 64   before the head
a380: 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49  er was synced. I
a390: 6e 20 74 68 69 73 20 63 61 73 65 20 73 74 6f 70  n this case stop
a3a0: 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20   reading .      
a3b0: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
a3c0: 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20  ile here..      
a3d0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
a3e0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
a3f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74   }..    /* Updat
a400: 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  e the page-size 
a410: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
a420: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
a430: 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a   journal. .    *
a440: 2a 20 55 73 65 20 61 20 74 65 73 74 63 61 73 65  * Use a testcase
a450: 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65  () macro to make
a460: 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f   sure that mallo
a470: 63 20 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e  c failure within
a480: 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65   .    ** PagerSe
a490: 74 50 61 67 65 73 69 7a 65 28 29 20 69 73 20 74  tPagesize() is t
a4a0: 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ested..    */.  
a4b0: 20 20 69 50 61 67 65 53 69 7a 65 31 36 20 3d 20    iPageSize16 = 
a4c0: 28 75 31 36 29 69 50 61 67 65 53 69 7a 65 3b 0a  (u16)iPageSize;.
a4d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a4e0: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
a4f0: 28 70 50 61 67 65 72 2c 20 26 69 50 61 67 65 53  (pPager, &iPageS
a500: 69 7a 65 31 36 2c 20 2d 31 29 3b 0a 20 20 20 20  ize16, -1);.    
a510: 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
a520: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 61  LITE_OK );.    a
a530: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
a540: 45 5f 4f 4b 20 7c 7c 20 69 50 61 67 65 53 69 7a  E_OK || iPageSiz
a550: 65 31 36 3d 3d 28 75 31 36 29 69 50 61 67 65 53  e16==(u16)iPageS
a560: 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55  ize );..    /* U
a570: 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65  pdate the assume
a580: 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f  d sector-size to
a590: 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
a5a0: 20 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a   used by .    **
a5b0: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
a5c0: 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a  t created this j
a5d0: 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20  ournal. If this 
a5e0: 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20  journal was.    
a5f0: 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20  ** created by a 
a600: 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68  process other th
a610: 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65  an this one, the
a620: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20  n this routine. 
a630: 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63     ** is being c
a640: 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
a650: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
a660: 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61  (). The local va
a670: 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61  lue.    ** of Pa
a680: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69  ger.sectorSize i
a690: 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68  s restored at th
a6a0: 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f  e end of that ro
a6b0: 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  utine..    */.  
a6c0: 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
a6d0: 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69  Size = iSectorSi
a6e0: 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  ze;.  }..  pPage
a6f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
a700: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
a710: 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
a720: 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
a730: 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69  Write the suppli
a740: 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ed master journa
a750: 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20  l name into the 
a760: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
a770: 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72   pager.** pPager
a780: 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
a790: 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61  location. The ma
a7a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
a7b0: 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61  e must be the la
a7c0: 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74  st.** thing writ
a7d0: 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c  ten to a journal
a7e0: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61   file. If the pa
a7f0: 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73  ger is in full-s
a800: 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a  ync mode, the.**
a810: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
a820: 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61  scriptor is adva
a830: 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74  nced to the next
a840: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
a850: 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68   before.** anyth
a860: 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20  ing is written. 
a870: 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a  The format is:.*
a880: 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  *.**   + 4 bytes
a890: 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e  : PAGER_MJ_PGNO.
a8a0: 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a  .**   + N bytes:
a8b0: 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   Master journal 
a8c0: 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d  filename in utf-
a8d0: 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  8..**   + 4 byte
a8e0: 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20  s: N (length of 
a8f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
a900: 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f  ame in bytes, no
a910: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
a920: 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  ..**   + 4 bytes
a930: 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
a940: 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a   name checksum..
a950: 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20  **   + 8 bytes: 
a960: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
a970: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
a980: 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63  r journal page c
a990: 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73  hecksum is the s
a9a0: 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20  um of the bytes 
a9b0: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  in the master.**
a9c0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77   journal name, w
a9d0: 68 65 72 65 20 65 61 63 68 20 62 79 74 65 20 69  here each byte i
a9e0: 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
a9f0: 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20   a signed 8-bit 
aa00: 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  integer..**.** I
aa10: 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e  f zMaster is a N
aa20: 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63  ULL pointer (occ
aa30: 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  urs for a single
aa40: 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
aa50: 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73  ction), .** this
aa60: 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
aa70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
aa80: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
aa90: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
aaa0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
aab0: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
aac0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
aad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
aae0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
aaf0: 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20  nt nMaster;     
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab10: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72  /* Length of str
ab20: 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20  ing zMaster */. 
ab30: 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
ab40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab50: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68    /* Offset of h
ab60: 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c  eader in journal
ab70: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a   file */.  i64 j
ab80: 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20  rnlSize;        
ab90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
aba0: 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66  ize of journal f
abb0: 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20  ile on disk */. 
abc0: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20   u32 cksum = 0; 
abd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abe0: 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66    /* Checksum of
abf0: 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20   string zMaster 
ac00: 2a 2f 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74  */..  if( !zMast
ac10: 65 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65  er || pPager->se
ac20: 74 4d 61 73 74 65 72 0a 20 20 20 7c 7c 20 70 50  tMaster.   || pP
ac30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
ac40: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
ac50: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20  MODE_MEMORY .   
ac60: 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
ac70: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
ac80: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
ac90: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
aca0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
acb0: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
acc0: 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  r = 1;.  assert(
acd0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
ace0: 6a 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  jfd) );.  assert
acf0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
ad00: 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e  lHdr <= pPager->
ad10: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20  journalOff );.. 
ad20: 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68   /* Calculate th
ad30: 65 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  e length in byte
ad40: 73 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73  s and the checks
ad50: 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f  um of zMaster */
ad60: 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30  .  for(nMaster=0
ad70: 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  ; zMaster[nMaste
ad80: 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a  r]; nMaster++){.
ad90: 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61      cksum += zMa
ada0: 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20  ster[nMaster];. 
adb0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66   }..  /* If in f
adc0: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61  ull-sync mode, a
add0: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
ade0: 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62  xt disk sector b
adf0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20  efore writing.  
ae00: 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** the master jo
ae10: 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73  urnal name. This
ae20: 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20   is in case the 
ae30: 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72  previous page wr
ae40: 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68  itten to.  ** th
ae50: 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c  e journal has al
ae60: 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
ae70: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
ae80: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
ae90: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
aea0: 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e  urnalOff = journ
aeb0: 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67  alHdrOffset(pPag
aec0: 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f  er);.  }.  iHdrO
aed0: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
aee0: 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57  rnalOff;..  /* W
aef0: 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
af00: 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20  journal data to 
af10: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a  the end of the j
af20: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a  ournal file. If.
af30: 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
af40: 63 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65  curs, return the
af50: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
af60: 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a  he caller..  */.
af70: 20 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20    if( (0 != (rc 
af80: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
af90: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
afa0: 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ff, PAGER_MJ_PGN
afb0: 4f 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20  O(pPager)))).   
afc0: 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73  || (0 != (rc = s
afd0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
afe0: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
aff0: 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64  er, nMaster, iHd
b000: 72 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20  rOff+4))).   || 
b010: 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
b020: 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
b030: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
b040: 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29  Master, nMaster)
b050: 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
b060: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
b070: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
b080: 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b  drOff+4+nMaster+
b090: 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c  4, cksum))).   |
b0a0: 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
b0b0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
b0c0: 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e  ger->jfd, aJourn
b0d0: 61 6c 4d 61 67 69 63 2c 20 38 2c 20 69 48 64 72  alMagic, 8, iHdr
b0e0: 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29  Off+4+nMaster+8)
b0f0: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
b100: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61  rn rc;.  }.  pPa
b110: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
b120: 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b  += (nMaster+20);
b130: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
b140: 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e  ync = !pPager->n
b150: 6f 53 79 6e 63 3b 0a 0a 20 20 2f 2a 20 49 66 20  oSync;..  /* If 
b160: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
b170: 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  peristent-journa
b180: 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  l mode, then the
b190: 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20   physical .  ** 
b1a0: 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79  journal-file may
b1b0: 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65   extend past the
b1c0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74   end of the mast
b1d0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er-journal name.
b1e0: 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73    ** and 8 bytes
b1f0: 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a   of magic data j
b200: 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ust written to t
b210: 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  he file. This is
b220: 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73   .  ** dangerous
b230: 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64   because the cod
b240: 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  e to rollback a 
b250: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
b260: 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  .  ** will not b
b270: 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74  e able to find t
b280: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
b290: 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  l name to determ
b2a0: 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ine .  ** whethe
b2b0: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
b2c0: 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20  rnal is hot. .  
b2d0: 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20  **.  ** Easiest 
b2e0: 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74  thing to do in t
b2f0: 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20  his scenario is 
b300: 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
b310: 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
b320: 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72  le to the requir
b330: 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20  ed size..  */ . 
b340: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
b350: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
b360: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
b370: 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29  jfd, &jrnlSize))
b380: 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e  .   && jrnlSize>
b390: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
b3a0: 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  ff.  ){.    rc =
b3b0: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
b3c0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
b3d0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
b3e0: 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ff);.  }.  retur
b3f0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
b400: 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
b410: 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76  e hash table giv
b420: 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62  en its page numb
b430: 65 72 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  er. Return.** a 
b440: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
b450: 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74  age or NULL if t
b460: 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
b470: 65 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72  e is not .** alr
b480: 65 61 64 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a  eady in memory..
b490: 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
b4a0: 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61  *pager_lookup(Pa
b4b0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
b4c0: 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
b4d0: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
b4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b4f0: 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
b500: 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20  .  /* It is not 
b510: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 63  possible for a c
b520: 61 6c 6c 20 74 6f 20 50 63 61 63 68 65 46 65 74  all to PcacheFet
b530: 63 68 28 29 20 77 69 74 68 20 63 72 65 61 74 65  ch() with create
b540: 46 6c 61 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20  Flag==0 to.  ** 
b550: 66 61 69 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61  fail, since no a
b560: 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61  ttempt to alloca
b570: 74 65 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72  te dynamic memor
b580: 79 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a  y will be made..
b590: 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c    */.  (void)sql
b5a0: 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
b5b0: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
b5c0: 20 70 67 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20   pgno, 0, &p);. 
b5d0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
b5e0: 0a 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70  .** Unless the p
b5f0: 61 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72  ager is in error
b600: 2d 73 74 61 74 65 2c 20 64 69 73 63 61 72 64 20  -state, discard 
b610: 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  all in-memory pa
b620: 67 65 73 2e 20 49 66 0a 2a 2a 20 74 68 65 20 70  ges. If.** the p
b630: 61 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72  ager is in error
b640: 2d 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69  -state, then thi
b650: 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
b660: 70 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 57  p..**.** TODO: W
b670: 68 79 20 63 61 6e 20 77 65 20 6e 6f 74 20 72 65  hy can we not re
b680: 73 65 74 20 74 68 65 20 70 61 67 65 72 20 77 68  set the pager wh
b690: 69 6c 65 20 69 6e 20 65 72 72 6f 72 20 73 74 61  ile in error sta
b6a0: 74 65 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  te?.*/.static vo
b6b0: 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50  id pager_reset(P
b6c0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
b6d0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
b6e0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
b6f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61  ){.    sqlite3Ba
b700: 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
b710: 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20  er->pBackup);.  
b720: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
b730: 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43  lear(pPager->pPC
b740: 61 63 68 65 29 3b 0a 20 20 20 20 70 50 61 67 65  ache);.    pPage
b750: 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
b760: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
b770: 20 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74   Free all struct
b780: 75 72 65 73 20 69 6e 20 74 68 65 20 50 61 67 65  ures in the Page
b790: 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61  r.aSavepoint[] a
b7a0: 72 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74  rray and set bot
b7b0: 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65  h.** Pager.aSave
b7c0: 70 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e  point and Pager.
b7d0: 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65  nSavepoint to ze
b7e0: 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75  ro. Close the su
b7f0: 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20  b-journal.** if 
b800: 69 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  it is open and t
b810: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
b820: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
b830: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
b840: 64 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65  d releaseAllSave
b850: 70 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50  points(Pager *pP
b860: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b  ager){.  int ii;
b870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b880: 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c  * Iterator for l
b890: 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50  ooping through P
b8a0: 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20  ager.aSavepoint 
b8b0: 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
b8c0: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
b8d0: 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
b8e0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
b8f0: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53  stroy(pPager->aS
b900: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e  avepoint[ii].pIn
b910: 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a  Savepoint);.  }.
b920: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
b930: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20  xclusiveMode || 
b940: 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72  sqlite3IsMemJour
b950: 6e 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  nal(pPager->sjfd
b960: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
b970: 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
b980: 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sjfd);.  }.  sql
b990: 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
b9a0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->aSavepoint);. 
b9b0: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
b9c0: 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
b9d0: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->nSavepoint = 
b9e0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75  0;.  pPager->nSu
b9f0: 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  bRec = 0;.}../*.
ba00: 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74 20 6e  ** Set the bit n
ba10: 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68  umber pgno in th
ba20: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
ba30: 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a  .pInSavepoint .*
ba40: 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c  * bitvecs of all
ba50: 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
ba60: 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
ba70: 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
ba80: 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  .** or SQLITE_NO
ba90: 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
baa0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
bab0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
bac0: 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
bad0: 65 63 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ecs(Pager *pPage
bae0: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
baf0: 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
bb00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
bb10: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
bb20: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
bb30: 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  OK;       /* Res
bb40: 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66  ult code */..  f
bb50: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
bb60: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
bb70: 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72  ii++){.    Pager
bb80: 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26  Savepoint *p = &
bb90: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
bba0: 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20  nt[ii];.    if( 
bbb0: 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29  pgno<=p->nOrig )
bbc0: 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71  {.      rc |= sq
bbd0: 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
bbe0: 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20  ->pInSavepoint, 
bbf0: 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73  pgno);.      tes
bc00: 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
bc10: 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
bc20: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
bc30: 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
bc40: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
bc50: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
bc60: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
bc70: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 69  turn true if thi
bc80: 73 20 70 61 67 65 72 20 75 73 65 73 20 61 20 77  s pager uses a w
bc90: 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 69  rite-ahead log i
bca0: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73  nstead of the us
bcb0: 75 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  ual.** rollback 
bcc0: 6a 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77 69  journal. Otherwi
bcd0: 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69 66  se false..*/.#if
bce0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
bcf0: 5f 57 41 4c 0a 73 74 61 74 69 63 20 69 6e 74 20  _WAL.static int 
bd00: 70 61 67 65 72 55 73 65 57 61 6c 28 50 61 67 65  pagerUseWal(Page
bd10: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
bd20: 74 75 72 6e 20 28 70 50 61 67 65 72 2d 3e 70 57  turn (pPager->pW
bd30: 61 6c 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65 0a  al!=0);.}.#else.
bd40: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 55 73  # define pagerUs
bd50: 65 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69  eWal(x) 0.# defi
bd60: 6e 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  ne pagerRollback
bd70: 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e  Wal(x) 0.# defin
bd80: 65 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73  e pagerWalFrames
bd90: 28 76 2c 77 2c 78 2c 79 2c 7a 29 20 30 0a 23 20  (v,w,x,y,z) 0.# 
bda0: 64 65 66 69 6e 65 20 70 61 67 65 72 4f 70 65 6e  define pagerOpen
bdb0: 57 61 6c 49 66 50 72 65 73 65 6e 74 28 7a 29 20  WalIfPresent(z) 
bdc0: 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69  SQLITE_OK.# defi
bdd0: 6e 65 20 70 61 67 65 72 4f 70 65 6e 53 6e 61 70  ne pagerOpenSnap
bde0: 73 68 6f 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f  shot(z) SQLITE_O
bdf0: 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  K.#endif../*.** 
be00: 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
be10: 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 66  ase file. This f
be20: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
be30: 6f 70 20 69 66 20 74 68 65 20 70 61 67 65 72 0a  op if the pager.
be40: 2a 2a 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69  ** is in exclusi
be50: 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49  ve mode..**.** I
be60: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63  f the pager is c
be70: 75 72 72 65 6e 74 6c 79 20 69 6e 20 65 72 72 6f  urrently in erro
be80: 72 20 73 74 61 74 65 2c 20 64 69 73 63 61 72 64  r state, discard
be90: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
bea0: 20 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 61   .** the cache a
beb0: 6e 64 20 72 65 73 65 74 20 74 68 65 20 50 61 67  nd reset the Pag
bec0: 65 72 20 73 74 72 75 63 74 75 72 65 20 69 6e 74  er structure int
bed0: 65 72 6e 61 6c 20 73 74 61 74 65 2e 20 49 66 20  ernal state. If 
bee0: 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 6f  there is.** an o
bef0: 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  pen journal-file
bf00: 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78 74 20  , then the next 
bf10: 74 69 6d 65 20 61 20 73 68 61 72 65 64 2d 6c 6f  time a shared-lo
bf20: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  ck is obtained.*
bf30: 2a 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 66  * on the pager f
bf40: 69 6c 65 20 28 62 79 20 74 68 69 73 20 6f 72 20  ile (by this or 
bf50: 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
bf60: 73 29 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a 2a  s), it will be.*
bf70: 2a 20 74 72 65 61 74 65 64 20 61 73 20 61 20 68  * treated as a h
bf80: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72  ot-journal and r
bf90: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73  olled back..*/.s
bfa0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
bfb0: 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  _unlock(Pager *p
bfc0: 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70  Pager){.  if( !p
bfd0: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
bfe0: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Mode ){.    int 
bff0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
c000: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
c010: 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 20 20  rn code */..    
c020: 2f 2a 20 41 6c 77 61 79 73 20 63 6c 6f 73 65 20  /* Always close 
c030: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c040: 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74   when dropping t
c050: 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
c060: 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69  ..    ** Otherwi
c070: 73 65 2c 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e  se, another conn
c080: 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72  ection with jour
c090: 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20  nal_mode=delete 
c0a0: 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 64 65 6c  might.    ** del
c0b0: 65 74 65 20 74 68 65 20 66 69 6c 65 20 6f 75 74  ete the file out
c0c0: 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a   from under us..
c0d0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
c0e0: 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
c0f0: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 73 71 6c 69  ->jfd);.    sqli
c100: 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
c110: 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
c120: 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  nal);.    pPager
c130: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
c140: 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 41 6c 6c  ;.    releaseAll
c150: 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65  Savepoints(pPage
c160: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  r);..    /* If t
c170: 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  he file is unloc
c180: 6b 65 64 2c 20 73 6f 6d 65 62 6f 64 79 20 65 6c  ked, somebody el
c190: 73 65 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  se might change 
c1a0: 69 74 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 76  it. The.    ** v
c1b0: 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20  alues stored in 
c1c0: 50 61 67 65 72 2e 64 62 53 69 7a 65 20 65 74 63  Pager.dbSize etc
c1d0: 2e 20 6d 69 67 68 74 20 62 65 63 6f 6d 65 20 69  . might become i
c1e0: 6e 76 61 6c 69 64 20 69 66 0a 20 20 20 20 2a 2a  nvalid if.    **
c1f0: 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e 20 20   this happens.  
c200: 4f 6e 65 20 63 61 6e 20 61 72 67 75 65 20 74 68  One can argue th
c210: 61 74 20 74 68 69 73 20 64 6f 65 73 6e 27 74 20  at this doesn't 
c220: 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72  need to be clear
c230: 65 64 0a 20 20 20 20 2a 2a 20 75 6e 74 69 6c 20  ed.    ** until 
c240: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
c250: 65 72 20 63 68 65 63 6b 20 66 61 69 6c 73 20 69  er check fails i
c260: 6e 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  n PagerSharedLoc
c270: 6b 28 29 2e 0a 20 20 20 20 2a 2a 20 43 6c 65 61  k()..    ** Clea
c280: 72 69 6e 67 20 74 68 65 20 70 61 67 65 20 73 69  ring the page si
c290: 7a 65 20 63 61 63 68 65 20 68 65 72 65 20 69 73  ze cache here is
c2a0: 20 62 65 69 6e 67 20 63 6f 6e 73 65 72 76 61 74   being conservat
c2b0: 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ive..    */.    
c2c0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
c2d0: 6c 69 64 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  lid = 0;..    if
c2e0: 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
c2f0: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 73  ager) ){.      s
c300: 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 53 6e  qlite3WalCloseSn
c310: 61 70 73 68 6f 74 28 70 50 61 67 65 72 2d 3e 70  apshot(pPager->p
c320: 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Wal);.    }else{
c330: 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73 55 6e  .      rc = osUn
c340: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
c350: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d   NO_LOCK);.    }
c360: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
c370: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
c380: 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 7d  Code = rc;.    }
c390: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55  .    IOTRACE(("U
c3a0: 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61  NLOCK %p\n", pPa
c3b0: 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20 49 66  ger))..    /* If
c3c0: 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69   Pager.errCode i
c3d0: 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65  s set, the conte
c3e0: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
c3f0: 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65   cache cannot be
c400: 0a 20 20 20 20 2a 2a 20 74 72 75 73 74 65 64 2e  .    ** trusted.
c410: 20 4e 6f 77 20 74 68 61 74 20 74 68 65 20 70 61   Now that the pa
c420: 67 65 72 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  ger file is unlo
c430: 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e  cked, the conten
c440: 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ts of the.    **
c450: 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64 69   cache can be di
c460: 73 63 61 72 64 65 64 20 61 6e 64 20 74 68 65 20  scarded and the 
c470: 65 72 72 6f 72 20 63 6f 64 65 20 73 61 66 65 6c  error code safel
c480: 79 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a  y cleared..    *
c490: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
c4a0: 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
c4b0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
c4c0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
c4d0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
c4e0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
c4f0: 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65 72     }.      pager
c500: 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
c510: 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65      }..    pPage
c520: 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
c530: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ne = 0;.    pPag
c540: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
c550: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70 50  R_UNLOCK;.    pP
c560: 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
c570: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
c580: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
c590: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
c5a0: 64 20 77 68 65 6e 20 61 6e 20 49 4f 45 52 52 2c  d when an IOERR,
c5b0: 20 43 4f 52 52 55 50 54 20 6f 72 20 46 55 4c 4c   CORRUPT or FULL
c5c0: 20 65 72 72 6f 72 0a 2a 2a 20 6d 61 79 20 68 61   error.** may ha
c5d0: 76 65 20 6f 63 63 75 72 72 65 64 2e 20 54 68 65  ve occurred. The
c5e0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
c5f0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
c600: 74 68 65 20 70 61 67 65 72 20 0a 2a 2a 20 73 74  the pager .** st
c610: 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65 63  ructure, the sec
c620: 6f 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f  ond the error-co
c630: 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72  de about to be r
c640: 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67  eturned by a pag
c650: 65 72 20 0a 2a 2a 20 41 50 49 20 66 75 6e 63 74  er .** API funct
c660: 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72  ion. The value r
c670: 65 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70  eturned is a cop
c680: 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  y of the second 
c690: 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20  argument .** to 
c6a0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a  this function. .
c6b0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63  **.** If the sec
c6c0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
c6d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
c6e0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72  LITE_CORRUPT, or
c6f0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20   SQLITE_FULL.** 
c700: 74 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65  the error become
c710: 73 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55 6e  s persistent. Un
c720: 74 69 6c 20 74 68 65 20 70 65 72 73 69 73 74 65  til the persiste
c730: 6e 20 65 72 72 6f 72 20 69 73 20 63 6c 65 61 72  n error is clear
c740: 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e  ed,.** subsequen
c750: 74 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74  t API calls on t
c760: 68 69 73 20 50 61 67 65 72 20 77 69 6c 6c 20 69  his Pager will i
c770: 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
c780: 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65  n the same .** e
c790: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
c7a0: 20 41 20 70 65 72 73 69 73 74 65 6e 74 20 65 72   A persistent er
c7b0: 72 6f 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ror indicates th
c7c0: 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
c7d0: 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
c7e0: 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  he .** cannot be
c7f0: 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73   trusted. This s
c800: 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61  tate can be clea
c810: 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c  red by completel
c820: 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a  y discarding .**
c830: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
c840: 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
c850: 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
c860: 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68  on was active wh
c870: 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73  en.** the persis
c880: 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72  tent error occur
c890: 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  red, then the ro
c8a0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d  llback journal m
c8b0: 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ay need.** to be
c8c0: 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73   replayed to res
c8d0: 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  tore the content
c8e0: 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
c8f0: 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a  e file (as if.**
c900: 20 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a   it were a hot-j
c910: 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74  ournal)..*/.stat
c920: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
c930: 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
c940: 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74  , int rc){.  int
c950: 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66   rc2 = rc & 0xff
c960: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
c970: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45  SQLITE_OK || !ME
c980: 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
c990: 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
c9a0: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
c9b0: 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70  FULL ||.       p
c9c0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
c9d0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20  SQLITE_OK ||.   
c9e0: 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72      (pPager->err
c9f0: 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51  Code & 0xff)==SQ
ca00: 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a  LITE_IOERR.  );.
ca10: 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54    if( rc2==SQLIT
ca20: 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53  E_FULL || rc2==S
ca30: 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
ca40: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
ca50: 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72  de = rc;.  }.  r
ca60: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
ca70: 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c  ** Execute a rol
ca80: 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73  lback if a trans
ca90: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
caa0: 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
cab0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
cac0: 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  e. .**.** If the
cad0: 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61   pager has alrea
cae0: 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 65  dy entered the e
caf0: 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e  rror state, do n
cb00: 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74  ot attempt .** t
cb10: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74  he rollback at t
cb20: 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61  his time. Instea
cb30: 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  d, pager_unlock(
cb40: 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65  ) is called. The
cb50: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  .** call to page
cb60: 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20  r_unlock() will 
cb70: 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d  discard all in-m
cb80: 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c  emory pages, unl
cb90: 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ock.** the datab
cba0: 61 73 65 20 66 69 6c 65 20 61 6e 64 20 63 6c 65  ase file and cle
cbb0: 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ar the error sta
cbc0: 74 65 2e 20 49 66 20 74 68 69 73 20 6d 65 61 6e  te. If this mean
cbd0: 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 72 65 20  s that.** there 
cbe0: 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  is a hot-journal
cbf0: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
cc00: 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65  e-system, the ne
cc10: 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  xt connection.**
cc20: 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61   to obtain a sha
cc30: 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
cc40: 70 61 67 65 72 20 28 77 68 69 63 68 20 6d 61 79  pager (which may
cc50: 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20 77 69   be this one) wi
cc60: 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74 20 62 61  ll.** roll it ba
cc70: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
cc80: 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61   pager has not a
cc90: 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
cca0: 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
ccb0: 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20  but an IO or.** 
ccc0: 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63  malloc error occ
ccd0: 75 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c  urs during a rol
cce0: 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73  lback, then this
ccf0: 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75   will itself cau
cd00: 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72  se .** the pager
cd10: 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72   to enter the er
cd20: 72 6f 72 20 73 74 61 74 65 2e 20 57 68 69 63 68  ror state. Which
cd30: 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64   will be cleared
cd40: 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20   by the.** call 
cd50: 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  to pager_unlock(
cd60: 29 2c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ), as described 
cd70: 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  above..*/.static
cd80: 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
cd90: 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67  kAndRollback(Pag
cda0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
cdb0: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
cdc0: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  de==SQLITE_OK &&
cdd0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
cde0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
cdf0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
ce00: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
ce10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
ce20: 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
ce30: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  r);.    sqlite3E
ce40: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
ce50: 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e  ;.  }.  pager_un
ce60: 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a  lock(pPager);.}.
ce70: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
ce80: 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73  ine ends a trans
ce90: 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61  action. A transa
cea0: 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79  ction is usually
ceb0: 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65 69   ended by .** ei
cec0: 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72  ther a COMMIT or
ced0: 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72   a ROLLBACK oper
cee0: 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74  ation. This rout
cef0: 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ine may be calle
cf00: 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c  d .** after roll
cf10: 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f  back of a hot-jo
cf20: 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20  urnal, or if an 
cf30: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
cf40: 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68  le opening.** th
cf50: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
cf60: 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 76 65  r writing the ve
cf70: 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  ry first journal
cf80: 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20  -header of a.** 
cf90: 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
cfa0: 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  tion..** .** If 
cfb0: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
cfc0: 50 41 47 45 52 5f 53 48 41 52 45 44 20 6f 72 20  PAGER_SHARED or 
cfd0: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61  PAGER_UNLOCK sta
cfe0: 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20  te when this.** 
cff0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
d000: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
d010: 20 28 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45   (returns SQLITE
d020: 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  _OK)..**.** Othe
d030: 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69 76  rwise, any activ
d040: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  e savepoints are
d050: 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a   released..**.**
d060: 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
d070: 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68  file is open, th
d080: 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c 69  en it is "finali
d090: 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75  zed". Once a jou
d0a0: 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61  rnal .** file ha
d0b0: 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64  s been finalized
d0c0: 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
d0d0: 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f  ble to use it to
d0e0: 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a   roll back a .**
d0f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f   transaction. No
d100: 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e  r will it be con
d110: 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61 20  sidered to be a 
d120: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74  hot-journal by t
d130: 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74  his.** or any ot
d140: 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
d150: 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79  nection. Exactly
d160: 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69   how a journal i
d170: 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64  s finalized.** d
d180: 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65  epends on whethe
d190: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61 67  r or not the pag
d1a0: 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
d1b0: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20   exclusive mode 
d1c0: 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  and.** the curre
d1d0: 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  nt journal-mode 
d1e0: 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f  (Pager.journalMo
d1f0: 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66 6f  de value), as fo
d200: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a  llows:.**.**   j
d210: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
d220: 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  RY.**     Journa
d230: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
d240: 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73  r is simply clos
d250: 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f 79  ed. This destroy
d260: 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d  s an .**     in-
d270: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a  memory journal..
d280: 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
d290: 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a  ode==TRUNCATE.**
d2a0: 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
d2b0: 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74  e is truncated t
d2c0: 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
d2d0: 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  size..**.**   jo
d2e0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49  urnalMode==PERSI
d2f0: 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 69  ST.**     The fi
d300: 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66 20  rst 28 bytes of 
d310: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d320: 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68 69   are zeroed. Thi
d330: 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a  s invalidates.**
d340: 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20 6a       the first j
d350: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
d360: 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20 68   the file, and h
d370: 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65 20  ence the entire 
d380: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66  journal.**     f
d390: 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20  ile. An invalid 
d3a0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e  journal file can
d3b0: 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  not be rolled ba
d3c0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ck..**.**   jour
d3d0: 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a  nalMode==DELETE.
d3e0: 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  **     The journ
d3f0: 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  al file is close
d400: 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75 73  d and deleted us
d410: 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  ing sqlite3OsDel
d420: 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ete()..**.**    
d430: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
d440: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
d450: 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69 73  usive mode, this
d460: 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c   method of final
d470: 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65  izing.**     the
d480: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
d490: 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e 73   never used. Ins
d4a0: 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f 75  tead, if the jou
d4b0: 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20  rnalMode is.**  
d4c0: 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68     DELETE and th
d4d0: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
d4e0: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
d4f0: 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62  e method describ
d500: 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20  ed under.**     
d510: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
d520: 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e 73  SIST is used ins
d530: 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  tead..**.** Afte
d540: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
d550: 20 66 69 6e 61 6c 69 7a 65 64 2c 20 69 66 20 72   finalized, if r
d560: 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78  unning in non-ex
d570: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
d580: 65 0a 2a 2a 20 70 61 67 65 72 20 6d 6f 76 65 73  e.** pager moves
d590: 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
d5a0: 20 73 74 61 74 65 20 28 61 6e 64 20 64 6f 77 6e   state (and down
d5b0: 67 72 61 64 65 73 20 74 68 65 20 6c 6f 63 6b 20  grades the lock 
d5c0: 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  on the.** databa
d5d0: 73 65 20 66 69 6c 65 20 61 63 63 6f 72 64 69 6e  se file accordin
d5e0: 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  gly)..**.** If t
d5f0: 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
d600: 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
d610: 20 6d 6f 64 65 20 61 6e 64 20 69 73 20 69 6e 20   mode and is in 
d620: 50 41 47 45 52 5f 53 59 4e 43 45 44 20 73 74 61  PAGER_SYNCED sta
d630: 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76 65 73 20  te,.** it moves 
d640: 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  to PAGER_EXCLUSI
d650: 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20 61 72 65  VE. No locks are
d660: 20 64 6f 77 6e 67 72 61 64 65 64 20 77 68 65 6e   downgraded when
d670: 20 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a 2a 20 65   running in.** e
d680: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a  xclusive mode..*
d690: 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
d6a0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
d6b0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 49   error occurs. I
d6c0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
d6d0: 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20  s during.** any 
d6e0: 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61 74  of the IO operat
d6f0: 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65  ions to finalize
d700: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d710: 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a  e or unlock the.
d720: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68 65 6e  ** database then
d730: 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
d740: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
d750: 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66 20 74  o the user. If t
d760: 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  he .** operation
d770: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
d780: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61   journal file fa
d790: 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ils, then the co
d7a0: 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65  de still.** trie
d7b0: 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
d7c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
d7d0: 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76   not in exclusiv
d7e0: 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a  e mode. If the.*
d7f0: 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69  * unlock operati
d800: 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c 6c  on fails as well
d810: 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
d820: 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c 61   error code rela
d830: 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69  ted.** to the fi
d840: 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e  rst error encoun
d850: 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72 6e  tered (the journ
d860: 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  al finalization 
d870: 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75 72  one) is.** retur
d880: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
d890: 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61  nt pager_end_tra
d8a0: 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a  nsaction(Pager *
d8b0: 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d  pPager, int hasM
d8c0: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
d8d0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
d8e0: 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
d8f0: 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69   from journal fi
d900: 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61  nalization opera
d910: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tion */.  int rc
d920: 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  2 = SQLITE_OK;  
d930: 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
d940: 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e   from db file un
d950: 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a  lock operation *
d960: 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  /..  if( pPager-
d970: 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53  >state<PAGER_RES
d980: 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74  ERVED ){.    ret
d990: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
d9a0: 20 7d 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53   }.  releaseAllS
d9b0: 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72  avepoints(pPager
d9c0: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73  );..  assert( is
d9d0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
d9e0: 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e  ) || pPager->pIn
d9f0: 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
da00: 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
da10: 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 61  r->jfd) ){.    a
da20: 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
da30: 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
da40: 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20      /* Finalize 
da50: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
da60: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  . */.    if( sql
da70: 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c  ite3IsMemJournal
da80: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
da90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
daa0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
dab0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
dac0: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a  LMODE_MEMORY );.
dad0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
dae0: 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
daf0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
db00: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
db10: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
db20: 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
db30: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
db40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
db50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
db60: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
db70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
db80: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
db90: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
dba0: 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  r->jfd, 0);.    
dbb0: 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
dbc0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
dbd0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
dbe0: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
dbf0: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
dc00: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
dc10: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
dc20: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
dc30: 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65  .      || (pPage
dc40: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
dc50: 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
dc60: 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
dc70: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a  OURNALMODE_WAL).
dc80: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
dc90: 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  = zeroJournalHdr
dca0: 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74  (pPager, hasMast
dcb0: 65 72 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72  er);.      pager
dcc0: 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
dcd0: 63 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  c);.      pPager
dce0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
dcf0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
dd00: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
dd10: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
dd20: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
dd30: 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75  nch may be execu
dd40: 74 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a  ted with Pager.j
dd50: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
dd60: 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61  RY if.      ** a
dd70: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73   hot-journal was
dd80: 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63   just rolled bac
dd90: 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  k. In this case 
dda0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
ddb0: 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64    ** file should
ddc0: 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64   be closed and d
ddd0: 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20  eleted. If this 
dde0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65  connection write
ddf0: 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  s to.      ** th
de00: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
de10: 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75   it will do so u
de20: 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  sing an in-memor
de30: 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20  y journal. .    
de40: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
de50: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
de60: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
de70: 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
de80: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
de90: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
dea0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
deb0: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
dec0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
ded0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
dee0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
def0: 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29  ODE_WAL .      )
df00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
df10: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
df20: 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  fd);.      if( !
df30: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
df40: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
df50: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
df60: 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
df70: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
df80: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
df90: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
dfa0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
dfb0: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49    sqlite3PcacheI
dfc0: 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67  terateDirty(pPag
dfd0: 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
dfe0: 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29  er_set_pagehash)
dff0: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73  ;.#endif.  }.  s
e000: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
e010: 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
e020: 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65  ournal);.  pPage
e030: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
e040: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
e050: 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  c = 0;.  sqlite3
e060: 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70  PcacheCleanAll(p
e070: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
e080: 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
e090: 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
e0a0: 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
e0b0: 57 61 6c 57 72 69 74 65 4c 6f 63 6b 28 70 50 61  WalWriteLock(pPa
e0c0: 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 3b 0a 20  ger->pWal, 0);. 
e0d0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
e0e0: 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
e0f0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
e100: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 69  connection was i
e110: 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  n locking_mode=e
e120: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 62 75  xclusive mode bu
e130: 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 0a  t is no longer,.
e140: 20 20 20 20 2a 2a 20 64 72 6f 70 20 74 68 65 20      ** drop the 
e150: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 68  EXCLUSIVE lock h
e160: 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
e170: 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
e180: 0a 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51  .    if( rc2==SQ
e190: 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20 26 26  LITE_OK .     &&
e1a0: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
e1b0: 69 76 65 4d 6f 64 65 20 0a 20 20 20 20 20 26 26  iveMode .     &&
e1c0: 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75   sqlite3WalExclu
e1d0: 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d  siveMode(pPager-
e1e0: 3e 70 57 61 6c 2c 20 2d 31 29 20 0a 20 20 20 20  >pWal, -1) .    
e1f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
e200: 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
e210: 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30  (pPager->pWal, 0
e220: 29 3b 0a 20 20 20 20 20 20 72 63 32 20 3d 20 6f  );.      rc2 = o
e230: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
e240: 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  fd, SHARED_LOCK)
e250: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
e260: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
e270: 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
e280: 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b    rc2 = osUnlock
e290: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  (pPager->fd, SHA
e2a0: 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70  RED_LOCK);.    p
e2b0: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
e2c0: 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
e2d0: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
e2e0: 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
e2f0: 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
e300: 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
e310: 59 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61  YNCED ){.    pPa
e320: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
e330: 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
e340: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  }.  pPager->setM
e350: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61  aster = 0;.  pPa
e360: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
e370: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d  0;.  pPager->dbM
e380: 6f 64 69 66 69 65 64 20 3d 20 30 3b 0a 0a 20 20  odified = 0;..  
e390: 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 74 68 69 73  /* TODO: Is this
e3a0: 20 6f 70 74 69 6d 61 6c 3f 20 57 68 79 20 69 73   optimal? Why is
e3b0: 20 74 68 65 20 64 62 20 73 69 7a 65 20 69 6e 76   the db size inv
e3c0: 61 6c 69 64 61 74 65 64 20 68 65 72 65 20 0a 20  alidated here . 
e3d0: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 64 61 74   ** when the dat
e3e0: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f  abase file is no
e3f0: 74 20 75 6e 6c 6f 63 6b 65 64 3f 20 2a 2f 0a 20  t unlocked? */. 
e400: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
e410: 69 7a 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ize = 0;.  sqlit
e420: 65 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65  e3PcacheTruncate
e430: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
e440: 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
e450: 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20  );.  if( !MEMDB 
e460: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
e470: 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a  bSizeValid = 0;.
e480: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72    }..  return (r
e490: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32  c==SQLITE_OK?rc2
e4a0: 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  :rc);.}../*.** P
e4b0: 61 72 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d  arameter aData m
e4c0: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
e4d0: 75 66 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d  uffer of pPager-
e4e0: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a  >pageSize bytes.
e4f0: 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70  ** of data. Comp
e500: 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ute and return a
e510: 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20   checksum based 
e520: 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ont the contents
e530: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   of the .** page
e540: 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74 68 65   of data and the
e550: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
e560: 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f pPager->cksumI
e570: 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nit..**.** This 
e580: 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68  is not a real ch
e590: 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65  ecksum. It is re
e5a0: 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75  ally just the su
e5b0: 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e  m of the .** ran
e5c0: 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  dom initial valu
e5d0: 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  e (pPager->cksum
e5e0: 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79 20  Init) and every 
e5f0: 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66  200th byte.** of
e600: 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2c 20   the page data, 
e610: 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 62 79  starting with by
e620: 74 65 20 6f 66 66 73 65 74 20 28 70 50 61 67 65  te offset (pPage
e630: 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29  r->pageSize%200)
e640: 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69  ..** Each byte i
e650: 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
e660: 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e   an 8-bit unsign
e670: 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a  ed integer..**.*
e680: 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66  * Changing the f
e690: 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63  ormula used to c
e6a0: 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68 65 63  ompute this chec
e6b0: 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20  ksum results in 
e6c0: 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62  an.** incompatib
e6d0: 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  le journal file 
e6e0: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
e6f0: 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74   journal corrupt
e700: 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74  ion occurs due t
e710: 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  o a power failur
e720: 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e, the most like
e730: 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20  ly .** scenario 
e740: 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20  is that one end 
e750: 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
e760: 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  the record will 
e770: 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20  be changed. .** 
e780: 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20  It is much less 
e790: 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20  likely that the 
e7a0: 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20  two ends of the 
e7b0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
e7c0: 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63  ill be.** correc
e7d0: 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65  t and the middle
e7e0: 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68   be corrupt.  Th
e7f0: 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73  us, this "checks
e800: 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74  um" scheme,.** t
e810: 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73  hough fast and s
e820: 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74  imple, catches t
e830: 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79  he mostly likely
e840: 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74   kind of corrupt
e850: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ion..*/.static u
e860: 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50  32 pager_cksum(P
e870: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
e880: 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a  nst u8 *aData){.
e890: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50    u32 cksum = pP
e8a0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b  ager->cksumInit;
e8b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
e8c0: 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65  ksum value to re
e8d0: 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20  turn */.  int i 
e8e0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
e8f0: 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20  ze-200;         
e900: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
e910: 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30   */.  while( i>0
e920: 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d   ){.    cksum +=
e930: 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69   aData[i];.    i
e940: 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72   -= 200;.  }.  r
e950: 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a  eturn cksum;.}..
e960: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
e970: 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69  gle page from ei
e980: 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ther the journal
e990: 20 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e   file (if isMain
e9a0: 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66  Jrnl==1) or.** f
e9b0: 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
e9c0: 6e 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72  nal (if isMainJr
e9d0: 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62  nl==0) and playb
e9e0: 61 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a  ack that page..*
e9f0: 2a 20 54 68 65 20 70 61 67 65 20 62 65 67 69 6e  * The page begin
ea00: 73 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66  s at offset *pOf
ea10: 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69  fset into the fi
ea20: 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74  le. The *pOffset
ea30: 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63  .** value is inc
ea40: 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 73 74  reased to the st
ea50: 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20  art of the next 
ea60: 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  page in the jour
ea70: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  nal..**.** The i
ea80: 73 4d 61 69 6e 4a 72 6e 6c 20 66 6c 61 67 20 69  sMainJrnl flag i
ea90: 73 20 74 72 75 65 20 69 66 20 74 68 69 73 20 69  s true if this i
eaa0: 73 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  s the main rollb
eab0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a  ack journal and.
eac0: 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 74 68 65  ** false for the
ead0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
eae0: 61 6c 2e 20 20 54 68 65 20 6d 61 69 6e 20 72 6f  al.  The main ro
eaf0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75  llback journal u
eb00: 73 65 73 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 73  ses.** checksums
eb10: 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74   - the statement
eb20: 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f   journal does no
eb30: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
eb40: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
eb50: 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 72  he page record r
eb60: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
eb70: 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  b-)journal file.
eb80: 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
eb90: 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  an the current v
eba0: 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
ebb0: 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62  Size, then playb
ebc0: 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65  ack is.** skippe
ebd0: 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
ebe0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
ebf0: 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e  ** If pDone is n
ec00: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  ot NULL, then it
ec10: 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20   is a record of 
ec20: 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20  pages that have 
ec30: 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20  already.** been 
ec40: 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66  played back.  If
ec50: 20 74 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f   the page at *pO
ec60: 66 66 73 65 74 20 68 61 73 20 61 6c 72 65 61 64  ffset has alread
ec70: 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61  y been played ba
ec80: 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f  ck.** (if the co
ec90: 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e  rresponding pDon
eca0: 65 20 62 69 74 20 69 73 20 73 65 74 29 20 74 68  e bit is set) th
ecb0: 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79  en skip the play
ecc0: 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75  back..** Make su
ecd0: 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74  re the pDone bit
ece0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
ecf0: 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70  o the *pOffset p
ed00: 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72  age is set.** pr
ed10: 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67  ior to returning
ed20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
ed30: 61 67 65 20 72 65 63 6f 72 64 20 69 73 20 73 75  age record is su
ed40: 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20  ccessfully read 
ed50: 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
ed60: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61  ournal file.** a
ed70: 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20  nd played back, 
ed80: 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  then SQLITE_OK i
ed90: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
eda0: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
edb0: 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69  s.** while readi
edc0: 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 66 72  ng the record fr
edd0: 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
ede0: 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69  rnal file or whi
edf0: 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f  le writing.** to
ee00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
ee10: 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  le, then the IO 
ee20: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
ee30: 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a  turned. If data.
ee40: 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ** is successful
ee50: 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ly read from the
ee60: 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
ee70: 69 6c 65 20 62 75 74 20 61 70 70 65 61 72 73 20  ile but appears 
ee80: 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74  to be.** corrupt
ee90: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
eea0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74  is returned. Dat
eeb0: 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  a is considered 
eec0: 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20  corrupted in.** 
eed0: 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65  two circumstance
eee0: 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66  s:.** .**   * If
eef0: 20 74 68 65 20 72 65 63 6f 72 64 20 70 61 67 65   the record page
ef00: 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67  -number is illeg
ef10: 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d  al (0 or PAGER_M
ef20: 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20  J_PGNO), or.**  
ef30: 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64   * If the record
ef40: 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
ef50: 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d   back from the m
ef60: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
ef70: 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20  .**     and the 
ef80: 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64  checksum field d
ef90: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
efa0: 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74  e record content
efb0: 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20  ..**.** Neither 
efc0: 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73 63 65  of these two sce
efd0: 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69  narios are possi
efe0: 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61 76  ble during a sav
eff0: 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e  epoint rollback.
f000: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69  .**.** If this i
f010: 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  s a savepoint ro
f020: 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d  llback, then mem
f030: 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20  ory may have to 
f040: 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a  be dynamically.*
f050: 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  * allocated by t
f060: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66  his function. If
f070: 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
f080: 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74  e and an allocat
f090: 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51  ion fails,.** SQ
f0a0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
f0b0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
f0c0: 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
f0d0: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20  back_one_page(. 
f0e0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
f0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f100: 2a 20 54 68 65 20 70 61 67 65 72 20 62 65 69 6e  * The pager bein
f110: 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f  g played back */
f120: 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c  .  i64 *pOffset,
f130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f140: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65   /* Offset of re
f150: 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b  cord to playback
f160: 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44   */.  Bitvec *pD
f170: 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  one,            
f180: 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66      /* Bitvec of
f190: 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 70   pages already p
f1a0: 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20  layed back */.  
f1b0: 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20  int isMainJrnl, 
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f1d0: 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e   1 -> main journ
f1e0: 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75  al. 0 -> sub-jou
f1f0: 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69  rnal. */.  int i
f200: 73 53 61 76 65 70 6e 74 20 20 20 20 20 20 20 20  sSavepnt        
f210: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
f220: 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74   for a savepoint
f230: 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a   rollback */.){.
f240: 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
f250: 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20  r *pPg;         
f260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
f270: 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e  existing page in
f280: 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20   the cache */.  
f290: 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20  Pgno pgno;      
f2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f2b0: 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
f2c0: 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f   of a page in jo
f2d0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63  urnal */.  u32 c
f2e0: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
f2f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
f300: 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61  ksum used for sa
f310: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f  nity checking */
f320: 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20  .  char *aData; 
f330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f340: 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74   /* Temporary st
f350: 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20 70 61  orage for the pa
f360: 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ge */.  sqlite3_
f370: 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20  file *jfd;      
f380: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
f390: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
f3a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
f3b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e  e */.  int isSyn
f3c0: 63 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ced;            
f3d0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
f3e0: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20  journal page is 
f3f0: 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73  synced */..  ass
f400: 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c  ert( (isMainJrnl
f410: 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
f420: 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73  /* isMainJrnl is
f430: 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
f440: 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26  ert( (isSavepnt&
f450: 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  ~1)==0 );       
f460: 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20  /* isSavepnt is 
f470: 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
f480: 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c  rt( isMainJrnl |
f490: 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f  | pDone );     /
f4a0: 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75  * pDone always u
f4b0: 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e  sed on sub-journ
f4c0: 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  als */.  assert(
f4d0: 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44   isSavepnt || pD
f4e0: 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70  one==0 );   /* p
f4f0: 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20  Done never used 
f500: 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74  on non-savepoint
f510: 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70   */..  aData = p
f520: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
f530: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74  ;.  assert( aDat
f540: 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  a );         /* 
f550: 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73  Temp storage mus
f560: 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
f570: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  een allocated */
f580: 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
f590: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
f5a0: 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e  0 || (!isMainJrn
f5b0: 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74 29 20  l && isSavepnt) 
f5c0: 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  );..  /* Read th
f5d0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
f5e0: 64 20 70 61 67 65 20 64 61 74 61 20 66 72 6f 6d  d page data from
f5f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20   the journal or 
f600: 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  sub-journal.  **
f610: 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e   file. Return an
f620: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
f630: 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e 20  he caller if an 
f640: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  IO error occurs.
f650: 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73  .  */.  jfd = is
f660: 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65  MainJrnl ? pPage
f670: 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d  r->jfd : pPager-
f680: 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65  >sjfd;.  rc = re
f690: 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a 70  ad32bits(jfd, *p
f6a0: 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a  Offset, &pgno);.
f6b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f6c0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
f6d0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
f6e0: 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a 29  sRead(jfd, (u8*)
f6f0: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
f700: 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73  ageSize, (*pOffs
f710: 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63  et)+4);.  if( rc
f720: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
f730: 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66  turn rc;.  *pOff
f740: 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70  set += pPager->p
f750: 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73  ageSize + 4 + is
f760: 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f  MainJrnl*4;..  /
f770: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
f780: 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20  g on the page.  
f790: 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70  This is more imp
f7a0: 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72  ortant that I or
f7b0: 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68  iginally.  ** th
f7c0: 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77  ought.  If a pow
f7d0: 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
f7e0: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
f7f0: 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69  nal is being wri
f800: 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f  tten,.  ** it co
f810: 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69  uld cause invali
f820: 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69  d data to be wri
f830: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
f840: 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20  urnal.  We need 
f850: 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74  to.  ** detect t
f860: 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61  his invalid data
f870: 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62   (with high prob
f880: 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e  ability) and ign
f890: 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  ore it..  */.  i
f8a0: 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  f( pgno==0 || pg
f8b0: 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
f8c0: 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
f8d0: 20 61 73 73 65 72 74 28 20 21 69 73 53 61 76 65   assert( !isSave
f8e0: 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72  pnt );.    retur
f8f0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
f900: 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50   }.  if( pgno>(P
f910: 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69  gno)pPager->dbSi
f920: 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74  ze || sqlite3Bit
f930: 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70  vecTest(pDone, p
f940: 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75  gno) ){.    retu
f950: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
f960: 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72  }.  if( isMainJr
f970: 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  nl ){.    rc = r
f980: 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28  ead32bits(jfd, (
f990: 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b  *pOffset)-4, &ck
f9a0: 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sum);.    if( rc
f9b0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
f9c0: 20 20 69 66 28 20 21 69 73 53 61 76 65 70 6e 74    if( !isSavepnt
f9d0: 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28   && pager_cksum(
f9e0: 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44 61  pPager, (u8*)aDa
f9f0: 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20  ta)!=cksum ){.  
fa00: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fa10: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
fa20: 7d 0a 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26  }..  if( pDone &
fa30: 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  & (rc = sqlite3B
fa40: 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20  itvecSet(pDone, 
fa50: 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f  pgno))!=SQLITE_O
fa60: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
fa70: 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  rc;.  }..  asser
fa80: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
fa90: 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
faa0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
fab0: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
fac0: 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  VE );..  /* If t
fad0: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52  he pager is in R
fae0: 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
faf0: 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
fb00: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73  e a copy of this
fb10: 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  .  ** page in th
fb20: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
fb30: 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74  n this case just
fb40: 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
fb50: 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f  r cache,.  ** no
fb60: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
fb70: 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
fb80: 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72   left marked dir
fb90: 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ty in this case.
fba0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78  .  **.  ** An ex
fbb0: 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61  ception to the a
fbc0: 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68  bove rule: If th
fbd0: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e  e database is in
fbe0: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20   no-sync mode.  
fbf0: 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73  ** and a page is
fc00: 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e   moved during an
fc10: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
fc20: 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67  uum then the pag
fc30: 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62  e may.  ** not b
fc40: 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
fc50: 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20  ache. Later: if 
fc60: 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f  a malloc() or IO
fc70: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20   error occurs.  
fc80: 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65  ** during a Move
fc90: 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65  page() call, the
fca0: 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e  n the page may n
fcb0: 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63  ot be in the cac
fcc0: 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20  he.  ** either. 
fcd0: 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  So the condition
fce0: 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68   described in th
fcf0: 65 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70  e above paragrap
fd00: 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73  h is not.  ** as
fd10: 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a  sert()able..  **
fd20: 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c  .  ** If in EXCL
fd30: 55 53 49 56 45 20 73 74 61 74 65 2c 20 74 68 65  USIVE state, the
fd40: 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65 20  n we update the 
fd50: 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69  pager cache if i
fd60: 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e  t exists.  ** an
fd70: 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e  d the main file.
fd80: 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65   The page is the
fd90: 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72  n marked not dir
fda0: 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69  ty..  **.  ** Ti
fdb0: 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65  cket #1171:  The
fdc0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
fdd0: 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
fde0: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68   page content th
fdf0: 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65  at is.  ** diffe
fe00: 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61  rent from the pa
fe10: 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68  ge content at th
fe20: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
fe30: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
fe40: 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65   This occurs whe
fe50: 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e  n a page is chan
fe60: 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ged prior to the
fe70: 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74   start of a stat
fe80: 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20  ement.  ** then 
fe90: 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69  changed again wi
fea0: 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
feb0: 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e  nt.  When rollin
fec0: 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20  g back such a.  
fed0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20  ** statement we 
fee0: 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74  must not write t
fef0: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
ff00: 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77  atabase unless w
ff10: 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20  e know.  ** for 
ff20: 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69  certain that ori
ff30: 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
ff40: 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69  nts are synced i
ff50: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c  nto the main rol
ff60: 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
ff70: 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  al.  Otherwise, 
ff80: 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67  a power loss mig
ff90: 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65  ht leave modifie
ffa0: 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20  d data in the.  
ffb0: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
ffc0: 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72   without an entr
ffd0: 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  y in the rollbac
ffe0: 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63  k journal that c
fff0: 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20  an.  ** restore 
10000 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
10010 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72  its original for
10020 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f  m.  Two conditio
10030 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  ns must be.  ** 
10040 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69  met before writi
10050 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
10060 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68  se files. (1) th
10070 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
10080 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20  be.  ** locked. 
10090 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61   (2) we know tha
100a0 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
100b0 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66  age content is f
100c0 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a  ully synced.  **
100d0 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
100e0 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61  rnal either beca
100f0 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20  use the page is 
10100 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
10110 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61  else.  ** the pa
10120 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
10130 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a  needSync==0..  *
10140 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31  *.  ** 2008-04-1
10150 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74  4:  When attempt
10160 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20  ing to vacuum a 
10170 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
10180 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69   file, it.  ** i
10190 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61  s possible to fa
101a0 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  il a statement o
101b0 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61  n a database tha
101c0 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65  t does not yet e
101d0 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f  xist..  ** Do no
101e0 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  t attempt to wri
101f0 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66  te if database f
10200 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65  ile has never be
10210 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a  en opened..  */.
10220 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
10230 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
10240 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73   pPg = 0;.  }els
10250 65 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67  e{.    pPg = pag
10260 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
10270 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61  , pgno);.  }.  a
10280 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d  ssert( pPg || !M
10290 45 4d 44 42 20 29 3b 0a 20 20 50 41 47 45 52 54  EMDB );.  PAGERT
102a0 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20  RACE(("PLAYBACK 
102b0 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
102c0 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20  %08x) %s\n",.   
102d0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
102e0 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
102f0 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
10300 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
10310 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20  (u8*)aData),.   
10320 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a          (isMainJ
10330 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61  rnl?"main-journa
10340 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22  l":"sub-journal"
10350 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73  ).  ));.  if( is
10360 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20  MainJrnl ){.    
10370 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65  isSynced = pPage
10380 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70  r->noSync || (*p
10390 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72  Offset <= pPager
103a0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20  ->journalHdr);. 
103b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79   }else{.    isSy
103c0 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c  nced = (pPg==0 |
103d0 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73  | 0==(pPg->flags
103e0 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59   & PGHDR_NEED_SY
103f0 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  NC));.  }.  if( 
10400 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d  (pPager->state>=
10410 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 29  PAGER_EXCLUSIVE)
10420 0a 20 20 20 26 26 20 69 73 4f 70 65 6e 28 70 50  .   && isOpen(pP
10430 61 67 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20  ager->fd).   && 
10440 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20  isSynced.  ){.  
10450 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67    i64 ofst = (pg
10460 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
10470 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
10480 20 74 65 73 74 63 61 73 65 28 20 21 69 73 53 61   testcase( !isSa
10490 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20  vepnt && pPg!=0 
104a0 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  && (pPg->flags&P
104b0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21  GHDR_NEED_SYNC)!
104c0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
104d0 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
104e0 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63  Pager) );.    rc
104f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
10500 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75  e(pPager->fd, (u
10510 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72  8*)aData, pPager
10520 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74  ->pageSize, ofst
10530 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  );.    if( pgno>
10540 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
10550 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  ze ){.      pPag
10560 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
10570 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20   pgno;.    }.   
10580 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61   if( pPager->pBa
10590 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f  ckup ){.      CO
105a0 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44 61  DEC1(pPager, aDa
105b0 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d  ta, pgno, 3, rc=
105c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
105d0 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
105e0 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
105f0 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20  >pBackup, pgno, 
10600 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20  (u8*)aData);.   
10610 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
10620 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37  , aData, pgno, 7
10630 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
10640 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  M, aData);.    }
10650 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73  .  }else if( !is
10660 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d  MainJrnl && pPg=
10670 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
10680 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61  this is a rollba
10690 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e  ck of a savepoin
106a0 74 20 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e  t and data was n
106b0 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ot written to.  
106c0 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
106d0 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  e and the page i
106e0 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c  s not in-memory,
106f0 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65   there is a pote
10700 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f  ntial.    ** pro
10710 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70  blem. When the p
10720 61 67 65 20 69 73 20 6e 65 78 74 20 66 65 74 63  age is next fetc
10730 68 65 64 20 62 79 20 74 68 65 20 62 2d 74 72 65  hed by the b-tre
10740 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20  e layer, it .   
10750 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64   ** will be read
10760 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
10770 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d  se file, which m
10780 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
10790 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74   .    ** current
107a0 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
107b0 20 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75   There are a cou
107c0 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74  ple of different
107d0 20 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68   ways this can h
107e0 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71  appen. All are q
107f0 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63  uite.    ** obsc
10800 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e  ure. When runnin
10810 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  g in synchronous
10820 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20   mode, this can 
10830 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20  only happen .   
10840 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20   ** if the page 
10850 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  is on the free-l
10860 69 73 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ist at the start
10870 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
10880 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
10890 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e   populated, then
108a0 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c   moved using sql
108b0 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
108c0 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
108d0 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  ** The solution 
108e0 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d  is to add an in-
108f0 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74  memory page to t
10900 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
10910 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64  ing.    ** the d
10920 61 74 61 20 6a 75 73 74 20 72 65 61 64 20 66 72  ata just read fr
10930 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
10940 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67  al. Mark the pag
10950 65 20 61 73 20 64 69 72 74 79 20 0a 20 20 20 20  e as dirty .    
10960 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70 61  ** and if the pa
10970 67 65 72 20 72 65 71 75 69 72 65 73 20 61 20 6a  ger requires a j
10980 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65  ournal-sync, the
10990 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  n mark the page 
109a0 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69  as .    ** requi
109b0 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ring a journal-s
109c0 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69 73  ync before it is
109d0 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f   written..    */
109e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 53  .    assert( isS
109f0 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 69 66  avepnt );.    if
10a00 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  ( (rc = sqlite3P
10a10 61 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67  agerAcquire(pPag
10a20 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20  er, pgno, &pPg, 
10a30 31 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  1))!=SQLITE_OK )
10a40 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
10a50 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  c;.    }.    pPg
10a60 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44  ->flags &= ~PGHD
10a70 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20  R_NEED_READ;.   
10a80 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
10a90 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
10aa0 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  }.  if( pPg ){. 
10ab0 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68     /* No page sh
10ac0 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70  ould ever be exp
10ad0 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62  licitly rolled b
10ae0 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75  ack that is in u
10af0 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a  se, except.    *
10b00 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69  * for page 1 whi
10b10 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73  ch is held in us
10b20 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65  e in order to ke
10b30 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  ep the lock on t
10b40 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
10b50 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76  se active. Howev
10b60 65 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d  er such a page m
10b70 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ay be rolled bac
10b80 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20  k as a result.  
10b90 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72    ** of an inter
10ba0 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74  nal error result
10bb0 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61  ing in an automa
10bc0 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  tic call to.    
10bd0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  ** sqlite3PagerR
10be0 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a  ollback()..    *
10bf0 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74  /.    void *pDat
10c00 61 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70  a;.    pData = p
10c10 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d  Pg->pData;.    m
10c20 65 6d 63 70 79 28 70 44 61 74 61 2c 20 28 75 38  emcpy(pData, (u8
10c30 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  *)aData, pPager-
10c40 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
10c50 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
10c60 72 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20  r(pPg);.    if( 
10c70 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21  isMainJrnl && (!
10c80 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f  isSavepnt || *pO
10c90 66 66 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a  ffset<=pPager->j
10ca0 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20  ournalHdr) ){.  
10cb0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
10cc0 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70  ntents of this p
10cd0 61 67 65 20 77 65 72 65 20 6a 75 73 74 20 72 65  age were just re
10ce0 73 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20  stored from the 
10cf0 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a  main .      ** j
10d00 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
10d10 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75  n its content mu
10d20 73 74 20 62 65 20 61 73 20 74 68 65 79 20 77 65  st be as they we
10d30 72 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20  re when the .   
10d40 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
10d50 6e 20 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e  n was first open
10d60 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
10d70 20 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65   we can mark the
10d80 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61   page.      ** a
10d90 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74  s clean, since t
10da0 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20  here will be no 
10db0 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 69 74  need to write it
10dc0 20 6f 75 74 20 74 6f 20 74 68 65 0a 20 20 20 20   out to the.    
10dd0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20    ** database.. 
10de0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
10df0 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 65 78   There is one ex
10e00 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  ception to this 
10e10 72 75 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67  rule. If the pag
10e20 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  e is being rolle
10e30 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20  d.      ** back 
10e40 61 73 20 70 61 72 74 20 6f 66 20 61 20 73 61 76  as part of a sav
10e50 65 70 6f 69 6e 74 20 28 6f 72 20 73 74 61 74 65  epoint (or state
10e60 6d 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66  ment) rollback f
10e70 72 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a  rom an .      **
10e80 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f   unsynced portio
10e90 6e 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  n of the main jo
10ea0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
10eb0 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 0a   it is not safe.
10ec0 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b        ** to mark
10ed0 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
10ee0 61 6e 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  an. This is beca
10ef0 75 73 65 20 6d 61 72 6b 69 6e 67 20 74 68 65 20  use marking the 
10f00 70 61 67 65 20 61 73 0a 20 20 20 20 20 20 2a 2a  page as.      **
10f10 20 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61   clean will clea
10f20 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  r the PGHDR_NEED
10f30 5f 53 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63  _SYNC flag. Sinc
10f40 65 20 74 68 65 20 70 61 67 65 20 69 73 0a 20 20  e the page is.  
10f50 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 69      ** already i
10f60 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
10f70 6c 65 20 28 72 65 63 6f 72 64 65 64 20 69 6e 20  le (recorded in 
10f80 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
10f90 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74  ) and.      ** t
10fa0 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
10fb0 4e 43 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  NC flag is clear
10fc0 65 64 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  ed, if the page 
10fd0 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  is written to.  
10fe0 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74      ** again wit
10ff0 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
11000 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65  tion, it will be
11010 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
11020 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68   but.      ** th
11030 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
11040 43 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20  C flag will not 
11050 62 65 20 73 65 74 2e 20 49 74 20 63 6f 75 6c 64  be set. It could
11060 20 74 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c   then potentiall
11070 79 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 77 72  y.      ** be wr
11080 69 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74  itten out into t
11090 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
110a0 20 62 65 66 6f 72 65 20 69 74 73 20 6a 6f 75 72   before its jour
110b0 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  nal file.      *
110c0 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 73 79 6e  * segment is syn
110d0 63 65 64 2e 20 49 66 20 61 20 63 72 61 73 68 20  ced. If a crash 
110e0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6f 72  occurs during or
110f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c   following this,
11100 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
11110 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61  se corruption ma
11120 79 20 65 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a  y ensue..      *
11130 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
11140 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
11150 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 73 71  ger) );.      sq
11160 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
11170 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d  lean(pPg);.    }
11180 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
11190 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
111a0 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
111b0 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
111c0 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f  g);.#endif.    /
111d0 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
111e0 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
111f0 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
11200 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
11210 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
11220 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f   before any deco
11230 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ding. */.    if(
11240 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
11250 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
11260 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
11270 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c  (u8*)pData)[24],
11280 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
11290 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
112a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
112b0 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20  e the page just 
112c0 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a  read from disk *
112d0 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61  /.    CODEC1(pPa
112e0 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
112f0 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c  >pgno, 3, rc=SQL
11300 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20  ITE_NOMEM);.    
11310 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
11320 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  ease(pPg);.  }. 
11330 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11340 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
11350 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61  Master is the na
11360 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
11370 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73  ournal file. A s
11380 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ingle journal.**
11390 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72   file that refer
113a0 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65  red to the maste
113b0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  r journal file h
113c0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c  as just been rol
113d0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69  led back..** Thi
113e0 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
113f0 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
11400 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
11410 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11420 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65  file,.** and doe
11430 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a  s so if it is..*
11440 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d  *.** Argument zM
11450 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20  aster may point 
11460 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  to Pager.pTmpSpa
11470 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66  ce. So that buff
11480 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76  er is not .** av
11490 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20  ailable for use 
114a0 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
114b0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  tion..**.** When
114c0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
114d0 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  l file is create
114e0 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74  d, it is populat
114f0 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  ed with the name
11500 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20  s .** of all of 
11510 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  its child journa
11520 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e  ls, one after an
11530 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64  other, formatted
11540 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e   as utf-8 .** en
11550 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65 20  coded text. The 
11560 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c  end of each chil
11570 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  d journal file i
11580 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20  s marked with a 
11590 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
115a0 6f 72 20 62 79 74 65 20 28 30 78 30 30 29 2e 20  or byte (0x00). 
115b0 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20  i.e. the entire 
115c0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61  contents of a ma
115d0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
115e0 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73  file for a trans
115f0 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67  action involving
11600 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d   two databases m
11610 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20  ight be:.**.**  
11620 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64   "/home/bill/a.d
11630 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f  b-journal\x00/ho
11640 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75  me/bill/b.db-jou
11650 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20  rnal\x00".**.** 
11660 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  A master journal
11670 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62   file may only b
11680 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61  e deleted once a
11690 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20  ll of its child 
116a0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76  .** journals hav
116b0 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  e been rolled ba
116c0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ck..**.** This f
116d0 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68  unction reads th
116e0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
116f0 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
11700 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d   file into .** m
11710 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20  emory and loops 
11720 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20  through each of 
11730 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
11740 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20  l names. For.** 
11750 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
11760 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66  al, it checks if
11770 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74  :.**.**   * if t
11780 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
11790 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20   exists, and if 
117a0 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65  so.**   * if the
117b0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
117c0 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72 65  ontains a refere
117d0 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f  nce to master jo
117e0 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69  urnal .**     fi
117f0 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a  le zMaster.**.**
11800 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72   If a child jour
11810 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  nal can be found
11820 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f   that matches bo
11830 74 68 20 6f 66 20 74 68 65 20 63 72 69 74 65 72  th of the criter
11840 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69  ia.** above, thi
11850 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
11860 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  ns without doing
11870 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72   anything. Other
11880 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73  wise, if.** no s
11890 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  uch child journa
118a0 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  l can be found, 
118b0 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20  file zMaster is 
118c0 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20  deleted from.** 
118d0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
118e0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
118f0 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  elete()..**.** I
11900 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69  f an IO error wi
11910 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69  thin this functi
11920 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  on, an error cod
11930 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54  e is returned. T
11940 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
11950 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79  allocates memory
11960 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69   by calling sqli
11970 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20  te3Malloc(). If 
11980 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  an allocation.**
11990 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e   fails, SQLITE_N
119a0 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
119b0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
119c0 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20  no IO or malloc 
119d0 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72  errors .** occur
119e0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
119f0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
11a00 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69  ODO: This functi
11a10 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73  on allocates a s
11a20 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d  ingle block of m
11a30 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a  emory to load.**
11a40 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
11a50 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ents of the mast
11a60 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
11a70 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a   This could be.*
11a80 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69  * a couple of ki
11a90 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20  lobytes or so - 
11aa0 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67  potentially larg
11ab0 65 72 20 74 68 61 6e 20 74 68 65 20 70 61 67 65  er than the page
11ac0 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74   .** size..*/.st
11ad0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64  atic int pager_d
11ae0 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a  elmaster(Pager *
11af0 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
11b00 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
11b10 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
11b20 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
11b30 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  ;.  int rc;     
11b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11b50 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
11b60 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
11b70 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d  pMaster;    /* M
11b80 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a  alloc'd master-j
11b90 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
11ba0 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69  riptor */.  sqli
11bb0 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e  te3_file *pJourn
11bc0 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27  al;   /* Malloc'
11bd0 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20  d child-journal 
11be0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
11bf0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
11c00 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f  erJournal = 0; /
11c10 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61  * Contents of ma
11c20 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
11c30 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74  e */.  i64 nMast
11c40 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  erJournal;      
11c50 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74   /* Size of mast
11c60 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
11c70 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
11c80 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68  e space for both
11c90 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e   the pJournal an
11ca0 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64  d pMaster file d
11cb0 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a  escriptors..  **
11cc0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
11cd0 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  open the master 
11ce0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
11cf0 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20   reading..  */. 
11d00 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69   pMaster = (sqli
11d10 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74  te3_file *)sqlit
11d20 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66  e3MallocZero(pVf
11d30 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29  s->szOsFile * 2)
11d40 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28  ;.  pJournal = (
11d50 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28  sqlite3_file *)(
11d60 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20  ((u8 *)pMaster) 
11d70 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  + pVfs->szOsFile
11d80 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65  );.  if( !pMaste
11d90 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  r ){.    rc = SQ
11da0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
11db0 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  lse{.    const i
11dc0 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49  nt flags = (SQLI
11dd0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
11de0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  |SQLITE_OPEN_MAS
11df0 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  TER_JOURNAL);.  
11e00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11e10 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74  Open(pVfs, zMast
11e20 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61  er, pMaster, fla
11e30 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  gs, 0);.  }.  if
11e40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11e50 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
11e60 5f 6f 75 74 3b 0a 0a 20 20 72 63 20 3d 20 73 71  _out;..  rc = sq
11e70 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
11e80 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65  pMaster, &nMaste
11e90 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  rJournal);.  if(
11ea0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11eb0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
11ec0 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73  out;..  if( nMas
11ed0 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a  terJournal>0 ){.
11ee0 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e      char *zJourn
11ef0 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d  al;.    char *zM
11f00 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 20 20  asterPtr = 0;.  
11f10 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72    int nMasterPtr
11f20 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
11f30 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c  ame+1;..    /* L
11f40 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d  oad the entire m
11f50 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11f60 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  le into space ob
11f70 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20  tained from.    
11f80 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
11f90 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
11fa0 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
11fb0 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rnal. .    */.  
11fc0 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
11fd0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
11fe0 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75  ((int)nMasterJou
11ff0 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74  rnal + nMasterPt
12000 72 20 2b 20 31 29 3b 0a 20 20 20 20 69 66 28 20  r + 1);.    if( 
12010 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  !zMasterJournal 
12020 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
12030 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
12040 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
12050 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
12060 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d  zMasterPtr = &zM
12070 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61  asterJournal[nMa
12080 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a  sterJournal+1];.
12090 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
120a0 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20  OsRead(pMaster, 
120b0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  zMasterJournal, 
120c0 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72  (int)nMasterJour
120d0 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  nal, 0);.    if(
120e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
120f0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
12100 6f 75 74 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72  out;.    zMaster
12110 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
12120 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20  ournal] = 0;..  
12130 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
12140 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  sterJournal;.   
12150 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
12160 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
12170 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
12180 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78   ){.      int ex
12190 69 73 74 73 3b 0a 20 20 20 20 20 20 72 63 20 3d  ists;.      rc =
121a0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
121b0 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
121c0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
121d0 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
121e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
121f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12200 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
12210 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
12220 20 20 20 20 20 20 69 66 28 20 65 78 69 73 74 73        if( exists
12230 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   ){.        /* O
12240 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
12250 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
12260 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
12270 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
12280 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
12290 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
122a0 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
122b0 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
122c0 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72          ** so, r
122d0 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
122e0 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
122f0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
12300 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
12310 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
12320 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53    int flags = (S
12330 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
12340 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
12350 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  MAIN_JOURNAL);. 
12360 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12370 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
12380 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e  zJournal, pJourn
12390 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  al, flags, 0);. 
123a0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
123b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
123c0 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
123d0 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
123e0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20    }..        rc 
123f0 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
12400 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d  nal(pJournal, zM
12410 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65  asterPtr, nMaste
12420 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73  rPtr);.        s
12430 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a  qlite3OsClose(pJ
12440 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
12450 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12460 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
12470 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
12480 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
12490 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74         c = zMast
124a0 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73  erPtr[0]!=0 && s
124b0 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
124c0 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
124d0 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a         if( c ){.
124e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
124f0 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
12500 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
12510 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
12520 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
12530 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
12540 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
12550 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a        }.      zJ
12560 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74  ournal += (sqlit
12570 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72  e3Strlen30(zJour
12580 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  nal)+1);.    }. 
12590 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c   }.  .  rc = sql
125a0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
125b0 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
125c0 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a  .delmaster_out:.
125d0 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75    if( zMasterJou
125e0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69  rnal ){.    sqli
125f0 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
12600 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a  Journal);.  }  .
12610 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b    if( pMaster ){
12620 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
12630 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
12640 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
12650 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20  n(pJournal) );. 
12660 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
12670 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  e(pMaster);.  re
12680 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
12690 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
126a0 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e   is used to chan
126b0 67 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69  ge the actual si
126c0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
126d0 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74  se .** file in t
126e0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
126f0 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
12700 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  s when committin
12710 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  g a transaction,
12720 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  .** or rolling b
12730 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
12740 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c  n (including rol
12750 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d  ling back a hot-
12760 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20  journal)..**.** 
12770 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  If the main data
12780 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
12790 20 6f 70 65 6e 2c 20 6f 72 20 61 6e 20 65 78 63   open, or an exc
127a0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 6e  lusive lock is n
127b0 6f 74 0a 2a 2a 20 68 65 6c 64 2c 20 74 68 69 73  ot.** held, this
127c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
127d0 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
127e0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
127f0 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 68 61 6e   file is.** chan
12800 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67  ged to nPage pag
12810 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72  es (nPage*pPager
12820 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
12830 29 2e 20 49 66 20 74 68 65 20 66 69 6c 65 0a 2a  ). If the file.*
12840 2a 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72  * on disk is cur
12850 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68  rently larger th
12860 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20  an nPage pages, 
12870 74 68 65 6e 20 75 73 65 20 74 68 65 20 56 46 53  then use the VFS
12880 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20  .** xTruncate() 
12890 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61  method to trunca
128a0 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  te it..**.** Or,
128b0 20 69 74 20 6d 69 67 68 74 20 6d 69 67 68 74 20   it might might 
128c0 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
128d0 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
128e0 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  k is smaller tha
128f0 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65  n .** nPage page
12900 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e  s. Some operatin
12910 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65  g system impleme
12920 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74  ntations can get
12930 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a   confused if .**
12940 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e   you try to trun
12950 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73  cate a file to s
12960 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69 73  ome size that is
12970 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74 20   larger than it 
12980 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73  .** currently is
12990 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68 69 73  , so detect this
129a0 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65 20   case and write 
129b0 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79  a single zero by
129c0 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e  te to .** the en
129d0 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c  d of the new fil
129e0 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  e instead..**.**
129f0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
12a00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12a10 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
12a20 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f   occurs while mo
12a30 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64  difying.** the d
12a40 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65  atabase file, re
12a50 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
12a60 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
12a70 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
12a80 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
12a90 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
12aa0 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  gno nPage){.  in
12ab0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12ac0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
12ad0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
12ae0 4c 55 53 49 56 45 20 26 26 20 69 73 4f 70 65 6e  LUSIVE && isOpen
12af0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
12b00 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53      i64 currentS
12b10 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20  ize, newSize;.  
12b20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74    /* TODO: Is it
12b30 20 73 61 66 65 20 74 6f 20 75 73 65 20 50 61 67   safe to use Pag
12b40 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65  er.dbFileSize he
12b50 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  re? */.    rc = 
12b60 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
12b70 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63  e(pPager->fd, &c
12b80 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20  urrentSize);.   
12b90 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67 65   newSize = pPage
12ba0 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34  r->pageSize*(i64
12bb0 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20  )nPage;.    if( 
12bc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
12bd0 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65   currentSize!=ne
12be0 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69  wSize ){.      i
12bf0 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e  f( currentSize>n
12c00 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
12c10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
12c20 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
12c30 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20  >fd, newSize);. 
12c40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12c50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12c60 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
12c70 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65 77 53 69  fd, "", 1, newSi
12c80 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ze-1);.      }. 
12c90 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
12ca0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12cb0 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
12cc0 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
12cd0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
12ce0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12cf0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61  /*.** Set the va
12d00 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  lue of the Pager
12d10 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
12d20 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69 76  able for the giv
12d30 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73 65  en.** pager base
12d40 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 72  d on the value r
12d50 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78  eturned by the x
12d60 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f  SectorSize metho
12d70 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e  d.** of the open
12d80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
12d90 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  The sector size 
12da0 77 69 6c 6c 20 62 65 20 75 73 65 64 20 75 73 65  will be used use
12db0 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  d .** to determi
12dc0 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20  ne the size and 
12dd0 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75  alignment of jou
12de0 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20  rnal header and 
12df0 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
12e00 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68  al pointers with
12e10 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e  in created journ
12e20 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  al files..**.** 
12e30 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  For temporary fi
12e40 6c 65 73 20 74 68 65 20 65 66 66 65 63 74 69 76  les the effectiv
12e50 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
12e60 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
12e70 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  s..**.** Otherwi
12e80 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70  se, for non-temp
12e90 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65  orary files, the
12ea0 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
12eb0 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65  r size is.** the
12ec0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
12ed0 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69  by the xSectorSi
12ee0 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e  ze() method roun
12ef0 64 65 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a  ded up to 32 if.
12f00 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74 68  ** it is less th
12f10 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65  an 32, or rounde
12f20 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45  d down to MAX_SE
12f30 43 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a  CTOR_SIZE if it.
12f40 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
12f50 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  an MAX_SECTOR_SI
12f60 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ZE..*/.static vo
12f70 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  id setSectorSize
12f80 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
12f90 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
12fa0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
12fb0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
12fc0 65 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  e );..  if( !pPa
12fd0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
12fe0 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73  .    /* Sector s
12ff0 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  ize doesn't matt
13000 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  er for temporary
13010 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68   files. Also, th
13020 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61  e file.    ** ma
13030 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  y not have been 
13040 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77  opened yet, in w
13050 68 69 63 68 20 63 61 73 65 20 74 68 65 20 4f 73  hich case the Os
13060 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
13070 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65   ** call will se
13080 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20  gfault..    */. 
13090 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
130a0 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f  rSize = sqlite3O
130b0 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  sSectorSize(pPag
130c0 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69  er->fd);.  }.  i
130d0 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  f( pPager->secto
130e0 72 53 69 7a 65 3c 33 32 20 29 7b 0a 20 20 20 20  rSize<32 ){.    
130f0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
13100 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 20 20  ze = 512;.  }.  
13110 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
13120 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f  orSize>MAX_SECTO
13130 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73  R_SIZE ){.    as
13140 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52  sert( MAX_SECTOR
13150 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20  _SIZE>=512 );.  
13160 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
13170 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45 43 54 4f  Size = MAX_SECTO
13180 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f  R_SIZE;.  }.}../
13190 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
131a0 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
131b0 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
131c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
131d0 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
131e0 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
131f0 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
13200 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
13210 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
13220 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
13230 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20  ollows: .**.**  
13240 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66  (1)  8 byte pref
13250 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61  ix.  A copy of a
13260 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
13270 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20  **  (2)  4 byte 
13280 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
13290 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
132a0 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  number of valid 
132b0 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20  page records.** 
132c0 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75        in the jou
132d0 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76  rnal.  If this v
132e0 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
132f0 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  ff, then compute
13300 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75   the.**       nu
13310 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
13320 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ords from the jo
13330 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20  urnal size..**  
13340 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (3)  4 byte big-
13350 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
13360 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74  hich is the init
13370 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ial value for th
13380 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69  e .**       sani
13390 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  ty checksum..** 
133a0 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74   (4)  4 byte int
133b0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
133c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
133d0 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
133e0 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
133f0 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
13400 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35  rollback..**  (5
13410 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
13420 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
13430 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72  ch is the sector
13440 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64   size.  The head
13450 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74  er.**       is t
13460 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69  his many bytes i
13470 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20  n size..**  (6) 
13480 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
13490 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
134a0 20 69 73 20 74 68 65 20 70 61 67 65 20 73 69 7a   is the page siz
134b0 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f  e..**  (7)  zero
134c0 20 70 61 64 64 69 6e 67 20 6f 75 74 20 74 6f 20   padding out to 
134d0 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
134e0 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a  size..**  (8)  Z
134f0 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  ero or more page
13500 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63  s instances, eac
13510 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  h as follows:.**
13520 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
13530 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  e page number..*
13540 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67  *        +  pPag
13550 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
13560 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20  es of data..**  
13570 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
13580 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57  checksum.**.** W
13590 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20  hen we speak of 
135a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
135b0 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20  er, we mean the 
135c0 66 69 72 73 74 20 37 20 69 74 65 6d 73 20 61 62  first 7 items ab
135d0 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74  ove..** Each ent
135e0 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ry in the journa
135f0 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  l is an instance
13600 20 6f 66 20 74 68 65 20 38 74 68 20 69 74 65 6d   of the 8th item
13610 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ..**.** Call the
13620 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
13630 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e  second bullet "n
13640 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74  Rec".  nRec is t
13650 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
13660 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69  valid page entri
13670 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  es in the journa
13680 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  l.  In most case
13690 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75  s, you can compu
136a0 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  te the.** value 
136b0 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65  of nRec from the
136c0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
136d0 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20  rnal file.  But 
136e0 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61  if a power.** fa
136f0 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
13700 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
13710 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74   was being writt
13720 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  en, it could be 
13730 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74  the.** case that
13740 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
13750 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
13760 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  d already been i
13770 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20  ncreased but.** 
13780 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65  the extra entrie
13790 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61  s had not yet ma
137a0 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20  de it safely to 
137b0 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61  disk.  In such a
137c0 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61   case,.** the va
137d0 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70  lue of nRec comp
137e0 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69  uted from the fi
137f0 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65  le size would be
13800 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72   too large.  For
13810 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  .** that reason,
13820 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
13830 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
13840 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
13850 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76  ** If the nRec v
13860 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
13870 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  ff it means that
13880 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20   nRec should be 
13890 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d  computed.** from
138a0 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20   the file size. 
138b0 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75   This value is u
138c0 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  sed when the use
138d0 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a  r selects the.**
138e0 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20   no-sync option 
138f0 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  for the journal.
13900 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72    A power failur
13910 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  e could lead to 
13920 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e  corruption.** in
13930 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74   this case.  But
13940 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65   for things like
13950 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
13960 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a   (which will be.
13970 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ** deleted when 
13980 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73  the power is res
13990 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20  tored) we don't 
139a0 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  care.  .**.** If
139b0 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
139c0 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
139d0 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65  file is not a we
139e0 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75  ll-formed.** jou
139f0 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61  rnal file then a
13a00 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74  ll pages up to t
13a10 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74  he first corrupt
13a20 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c  ed page are roll
13a30 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e  ed.** back (or n
13a40 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a  o pages if the j
13a50 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
13a60 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65   corrupted). The
13a70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
13a80 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64   is then deleted
13a90 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
13aa0 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73  eturned, just as
13ab0 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f   if no corruptio
13ac0 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e  n had.** been en
13ad0 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a  countered..**.**
13ae0 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61   If an I/O or ma
13af0 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
13b00 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  urs, the journal
13b10 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c  -file is not del
13b20 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  eted.** and an e
13b30 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
13b40 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urned..**.** The
13b50 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72   isHot parameter
13b60 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
13b70 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
13b80 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72   rollback a jour
13b90 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68  nal.** that migh
13ba0 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e  t be a hot journ
13bb0 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c  al.  Or, it coul
13bc0 64 20 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f  d be that the jo
13bd0 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65  urnal is .** pre
13be0 73 65 72 76 65 64 20 62 65 63 61 75 73 65 20 6f  served because o
13bf0 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  f JOURNALMODE_PE
13c00 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c  RSIST or JOURNAL
13c10 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a  MODE_TRUNCATE..*
13c20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
13c30 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20   really is hot, 
13c40 72 65 73 65 74 20 74 68 65 20 70 61 67 65 72 20  reset the pager 
13c50 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c  cache prior roll
13c60 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20  ing.** back any 
13c70 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65  content.  If the
13c80 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65   journal is mere
13c90 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e  ly persistent, n
13ca0 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65  o reset is.** ne
13cb0 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
13cc0 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
13cd0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
13ce0 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20  , int isHot){.  
13cf0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
13d00 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
13d10 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  ;.  i64 szJ;    
13d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13d30 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  Size of the jour
13d40 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
13d50 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b  s */.  u32 nRec;
13d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d70 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
13d80 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ords in the jour
13d90 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20  nal */.  u32 u; 
13da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13db0 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
13dc0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
13dd0 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20  Pgno mxPg = 0;  
13de0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
13df0 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
13e00 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a   file in pages *
13e10 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
13e20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13e30 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61  Result code of a
13e40 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
13e50 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20   int res = 1;   
13e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
13e70 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
13e80 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
13e90 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
13ea0 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ter = 0;       /
13eb0 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72  * Name of master
13ec0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
13ed0 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65   any */.  int ne
13ee0 65 64 50 61 67 65 72 52 65 73 65 74 3b 20 20 20  edPagerReset;   
13ef0 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65     /* True to re
13f00 73 65 74 20 70 61 67 65 20 70 72 69 6f 72 20 74  set page prior t
13f10 6f 20 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c  o first page rol
13f20 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 46  lback */..  /* F
13f30 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
13f40 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
13f50 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
13f60 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20  Abort early if. 
13f70 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
13f80 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  is empty..  */. 
13f90 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
13fa0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
13fb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13fc0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
13fd0 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  >jfd, &szJ);.  i
13fe0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13ff0 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20   || szJ==0 ){.  
14000 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
14010 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ack;.  }..  /* R
14020 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ead the master j
14030 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d  ournal name from
14040 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66   the journal, if
14050 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a   it is present..
14060 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72    ** If a master
14070 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
14080 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
14090 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73   but the file is
140a0 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e   not.  ** presen
140b0 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20  t on disk, then 
140c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
140d0 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20  ot hot and does 
140e0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
140f0 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   ** played back.
14100 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a  .  **.  ** TODO:
14110 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65   Technically the
14120 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e   following is an
14130 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20 69   error because i
14140 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20  t assumes that. 
14150 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65 72   ** buffer Pager
14160 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d  .pTmpSpace is (m
14170 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74  xPathname+1) byt
14180 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e  es or larger. i.
14190 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50  e. that.  ** (pP
141a0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e  ager->pageSize >
141b0 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  = pPager->pVfs->
141c0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55  mxPathname+1). U
141d0 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a  sing os_unix.c,.
141e0 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65    **  mxPathname
141f0 20 69 73 20 35 31 32 2c 20 77 68 69 63 68 20 69   is 512, which i
14200 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
14210 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61  e minimum allowa
14220 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66  ble value.  ** f
14230 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a  or pageSize..  *
14240 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50  /.  zMaster = pP
14250 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
14260 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74  .  rc = readMast
14270 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
14280 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
14290 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
142a0 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69  Pathname+1);.  i
142b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
142c0 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29   && zMaster[0] )
142d0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
142e0 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
142f0 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45   zMaster, SQLITE
14300 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
14310 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61  &res);.  }.  zMa
14320 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ster = 0;.  if( 
14330 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
14340 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74   !res ){.    got
14350 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
14360 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
14370 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
14380 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d  needPagerReset =
14390 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68   isHot;..  /* Th
143a0 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  is loop terminat
143b0 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 61  es either when a
143c0 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
143d0 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72  ) or .  ** pager
143e0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
143f0 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e  ge() call return
14400 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72  s SQLITE_DONE or
14410 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20   an IO error .  
14420 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f  ** occurs. .  */
14430 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
14440 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e     /* Read the n
14450 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ext journal head
14460 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  er from the jour
14470 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68  nal file.  If th
14480 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e  ere are.    ** n
14490 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20  ot enough bytes 
144a0 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  left in the jour
144b0 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63  nal file for a c
144c0 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20  omplete header, 
144d0 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20  or.    ** it is 
144e0 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20  corrupted, then 
144f0 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f  a process must o
14500 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77  f failed while w
14510 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
14520 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  * This indicates
14530 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65   nothing more ne
14540 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
14550 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   back..    */.  
14560 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
14570 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69 73  alHdr(pPager, is
14580 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  Hot, szJ, &nRec,
14590 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
145a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
145b0 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
145c0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
145d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
145e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
145f0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
14600 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
14610 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
14620 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
14630 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
14640 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
14650 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
14660 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
14670 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
14680 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
14690 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
146a0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
146b0 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
146c0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
146d0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
146e0 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
146f0 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
14700 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
14710 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
14720 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
14730 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
14740 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14750 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
14760 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
14770 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
14780 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28     nRec = (int)(
14790 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48  (szJ - JOURNAL_H
147a0 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a  DR_SZ(pPager))/J
147b0 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
147c0 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
147d0 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
147e0 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62  0 and this rollb
147f0 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e  ack is of a tran
14800 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20  saction created 
14810 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70  by this.    ** p
14820 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74 68  rocess and if th
14830 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20  is is the final 
14840 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f  header in the jo
14850 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d  urnal, then it m
14860 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  eans.    ** that
14870 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68   this part of th
14880 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
14890 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68  ing filled but h
148a0 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a  as not yet been.
148b0 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f      ** synced to
148c0 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20   disk.  Compute 
148d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
148e0 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ges based on the
148f0 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a   remaining.    *
14900 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  * size of the fi
14910 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
14920 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d  * The third term
14930 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73   of the test was
14940 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69   added to fix ti
14950 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20  cket #2565..    
14960 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  ** When rolling 
14970 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e  back a hot journ
14980 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61  al, nRec==0 alwa
14990 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ys means that th
149a0 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68  e next.    ** ch
149b0 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  unk of the journ
149c0 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f  al contains zero
149d0 20 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c   pages to be rol
149e0 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20  led back.  But. 
149f0 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67     ** when doing
14a00 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20   a ROLLBACK and 
14a10 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e  the nRec==0 chun
14a20 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20 63 68  k is the last ch
14a30 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  unk in.    ** th
14a40 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65  e journal, it me
14a50 61 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ans that the jou
14a60 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
14a70 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20  in additional.  
14a80 20 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20    ** pages that 
14a90 6e 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65  need to be rolle
14aa0 64 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20  d back and that 
14ab0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
14ac0 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75  ges .    ** shou
14ad0 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62  ld be computed b
14ae0 61 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  ased on the jour
14af0 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20  nal file size.. 
14b00 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
14b10 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20  ec==0 && !isHot 
14b20 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  &&.        pPage
14b30 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
14b40 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
14b50 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
14b60 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
14b70 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28    nRec = (int)((
14b80 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
14b90 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52  urnalOff) / JOUR
14ba0 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
14bb0 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
14bc0 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
14bd0 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65   first header re
14be0 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
14bf0 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68  nal, truncate th
14c00 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
14c10 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
14c20 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
14c30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
14c40 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14c50 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
14c60 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
14c70 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
14c80 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
14c90 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66   mxPg);.      if
14ca0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14cb0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
14cc0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
14cd0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
14ce0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50  er->dbSize = mxP
14cf0 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  g;.    }..    /*
14d00 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
14d10 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
14d20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
14d30 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a   into the .    *
14d40 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
14d50 61 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68  and/or page cach
14d60 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
14d70 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75  r(u=0; u<nRec; u
14d80 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  ++){.      if( n
14d90 65 65 64 50 61 67 65 72 52 65 73 65 74 20 29 7b  eedPagerReset ){
14da0 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
14db0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
14dc0 20 20 20 20 20 20 6e 65 65 64 50 61 67 65 72 52        needPagerR
14dd0 65 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  eset = 0;.      
14de0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  }.      rc = pag
14df0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
14e00 70 61 67 65 28 70 50 61 67 65 72 2c 26 70 50 61  page(pPager,&pPa
14e10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
14e20 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20 20 69 66  0,1,0);.      if
14e30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14e40 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
14e50 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
14e60 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
14e70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
14e80 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
14e90 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
14ea0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
14eb0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
14ec0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
14ed0 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
14ee0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
14ef0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  f the journal ha
14f00 73 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64  s been truncated
14f10 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65  , simply stop re
14f20 61 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20  ading and.      
14f30 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e      ** processin
14f40 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54  g the journal. T
14f50 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e  his might happen
14f60 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
14f70 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  was.          **
14f80 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   not completely 
14f90 77 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63  written and sync
14fa0 65 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72  ed prior to a cr
14fb0 61 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20  ash.  In that.  
14fc0 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c          ** case,
14fd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68   the database sh
14fe0 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20  ould have never 
14ff0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20  been written in 
15000 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
15010 20 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20   first place so 
15020 69 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70  it is OK to simp
15030 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72  ly abandon the r
15040 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20  ollback. */.    
15050 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15060 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
15070 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
15080 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
15090 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
150a0 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  f we are unable 
150b0 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69  to rollback, qui
150c0 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  t and return the
150d0 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20   error.         
150e0 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20   ** code.  This 
150f0 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70  will cause the p
15100 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68  ager to enter th
15110 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20  e error state.  
15120 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68          ** so th
15130 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61  at no further ha
15140 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e  rm will be done.
15150 20 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 65    Perhaps the ne
15160 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  xt.          ** 
15170 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20  process to come 
15180 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62  along will be ab
15190 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  le to rollback t
151a0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  he database..   
151b0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
151c0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
151d0 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
151e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
151f0 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45   }.  /*NOTREACHE
15200 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20  D*/.  assert( 0 
15210 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b  );..end_playback
15220 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67  :.  /* Following
15230 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65   a rollback, the
15240 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
15250 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e  hould be back in
15260 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20   its original.  
15270 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20 74  ** state prior t
15280 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
15290 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
152a0 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20  so invoke the.  
152b0 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ** SQLITE_FCNTL_
152c0 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c  DB_UNCHANGED fil
152d0 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64  e-control method
152e0 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a   to disable the.
152f0 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74    ** assertion t
15300 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
15310 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
15320 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20  modified..  */. 
15330 20 61 73 73 65 72 74 28 0a 20 20 20 20 70 50 61   assert(.    pPa
15340 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
15350 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73 71 6c 69  s==0 ||.    sqli
15360 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
15370 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49  (pPager->fd,SQLI
15380 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
15390 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c 49 54 45  ANGED,0)>=SQLITE
153a0 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49  _OK.  );..  /* I
153b0 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20  f this playback 
153c0 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74  is happening aut
153d0 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20  omatically as a 
153e0 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20  result of an IO 
153f0 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20  or .  ** malloc 
15400 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72  error that occur
15410 72 65 64 20 61 66 74 65 72 20 74 68 65 20 63 68  red after the ch
15420 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73  ange-counter was
15430 20 75 70 64 61 74 65 64 20 62 75 74 20 0a 20 20   updated but .  
15440 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  ** before the tr
15450 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f  ansaction was co
15460 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68  mmitted, then th
15470 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
15480 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74   .  ** modificat
15490 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76  ion may just hav
154a0 65 20 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e  e been reverted.
154b0 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
154c0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20   in exclusive . 
154d0 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73   ** mode, then s
154e0 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61  ubsequent transa
154f0 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64  ctions performed
15500 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   by the connecti
15510 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a  on will not.  **
15520 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
15530 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c  ge-counter at al
15540 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64  l. This may lead
15550 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73   to cache incons
15560 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f  istency.  ** pro
15570 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20  blems for other 
15580 70 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d  processes at som
15590 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
155a0 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a  uture. So, just.
155b0 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69    ** in case thi
155c0 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20  s has happened, 
155d0 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67 65  clear the change
155e0 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e  CountDone flag n
155f0 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ow..  */.  pPage
15600 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
15610 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
15620 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63  pFile;..  if( rc
15630 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15640 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61     zMaster = pPa
15650 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
15660 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
15670 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
15680 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
15690 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
156a0 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
156b0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
156c0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
156d0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
156e0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
156f0 6e 6f 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61  noSync==0 && pPa
15700 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
15710 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
15720 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
15730 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64  sSync(pPager->fd
15740 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
15750 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  lags);.  }.  if(
15760 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
15770 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  & pPager->noSync
15780 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ==0 && pPager->s
15790 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
157a0 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72 63 20  USIVE ){.    rc 
157b0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
157c0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
157d0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
157e0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
157f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15800 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
15810 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
15820 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27  r, zMaster[0]!='
15830 5c 30 27 29 3b 0a 20 20 20 20 74 65 73 74 63 61  \0');.    testca
15840 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
15850 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  K );.  }.  if( r
15860 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
15870 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65  zMaster[0] && re
15880 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  s ){.    /* If t
15890 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65  here was a maste
158a0 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  r journal and th
158b0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
158c0 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a  return success,.
158d0 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
158e0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
158f0 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
15900 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  r journal..    *
15910 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
15920 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65  _delmaster(pPage
15930 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  r, zMaster);.   
15940 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
15950 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
15960 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e  .  /* The Pager.
15970 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
15980 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ble may have bee
15990 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20  n updated while 
159a0 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63  rolling.  ** bac
159b0 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61  k a journal crea
159c0 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
159d0 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
159e0 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20  t sector size.  
159f0 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20  ** value. Reset 
15a00 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  it to the correc
15a10 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  t value for this
15a20 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   process..  */. 
15a30 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
15a40 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
15a50 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
15a60 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ead the content 
15a70 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75 74  for page pPg out
15a80 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
15a90 20 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a   file and into .
15aa0 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41  ** pPg->pData. A
15ab0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20   shared lock or 
15ac0 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20  greater must be 
15ad0 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
15ae0 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66  base.** file bef
15af0 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
15b00 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
15b10 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69 73 20  ** If page 1 is 
15b20 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76  read, then the v
15b30 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
15b40 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65  FileVers[] is se
15b50 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75  t to.** the valu
15b60 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
15b70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
15b80 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
15b90 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
15ba0 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73   the IO error is
15bb0 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
15bc0 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65   caller..** Othe
15bd0 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
15be0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
15bf0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
15c00 44 62 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  DbPage(PgHdr *pP
15c10 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
15c20 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
15c30 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65  r; /* Pager obje
15c40 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ct associated wi
15c50 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f 0a 20  th page pPg */. 
15c60 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67   Pgno pgno = pPg
15c70 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a  ->pgno;       /*
15c80 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
15c90 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63  read */.  int rc
15ca0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
15cb0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
15cc0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
15cd0 73 49 6e 57 61 6c 20 3d 20 30 3b 20 20 20 20 20  sInWal = 0;     
15ce0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
15cf0 69 66 20 70 61 67 65 20 69 73 20 69 6e 20 6c 6f  if page is in lo
15d00 67 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  g file */.  int 
15d10 70 67 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 70  pgsz = pPager->p
15d20 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d 62  ageSize; /* Numb
15d30 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72  er of bytes to r
15d40 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ead */..  assert
15d50 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
15d60 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 26 26  =PAGER_SHARED &&
15d70 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73   !MEMDB );.  ass
15d80 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
15d90 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 69 66  er->fd) );..  if
15da0 28 20 4e 45 56 45 52 28 21 69 73 4f 70 65 6e 28  ( NEVER(!isOpen(
15db0 70 50 61 67 65 72 2d 3e 66 64 29 29 20 29 7b 0a  pPager->fd)) ){.
15dc0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
15dd0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
15de0 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e      memset(pPg->
15df0 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72  pData, 0, pPager
15e00 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
15e10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15e20 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61  K;.  }..  if( pa
15e30 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
15e40 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 20  ) ){.    /* Try 
15e50 74 6f 20 70 75 6c 6c 20 74 68 65 20 70 61 67 65  to pull the page
15e60 20 66 72 6f 6d 20 74 68 65 20 77 72 69 74 65 2d   from the write-
15e70 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20  ahead log. */.  
15e80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
15e90 6c 52 65 61 64 28 70 50 61 67 65 72 2d 3e 70 57  lRead(pPager->pW
15ea0 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 73 49 6e 57  al, pgno, &isInW
15eb0 61 6c 2c 20 70 67 73 7a 2c 20 70 50 67 2d 3e 70  al, pgsz, pPg->p
15ec0 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Data);.  }.  if(
15ed0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
15ee0 26 20 21 69 73 49 6e 57 61 6c 20 29 7b 0a 20 20  & !isInWal ){.  
15ef0 20 20 69 36 34 20 69 4f 66 66 73 65 74 20 3d 20    i64 iOffset = 
15f00 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
15f10 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
15f20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15f30 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
15f40 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  d, pPg->pData, p
15f50 67 73 7a 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  gsz, iOffset);. 
15f60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15f70 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
15f80 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AD ){.      rc =
15f90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
15fa0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 67 6e  }.  }..  if( pgn
15fb0 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20  o==1 ){.    if( 
15fc0 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  rc ){.      /* I
15fd0 66 20 74 68 65 20 72 65 61 64 20 69 73 20 75 6e  f the read is un
15fe0 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
15ff0 74 68 65 20 64 62 46 69 6c 65 56 65 72 73 5b 5d  the dbFileVers[]
16000 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20   to something.  
16010 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c      ** that will
16020 20 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c 69   never be a vali
16030 64 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20  d file version. 
16040 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73   dbFileVers[] is
16050 20 61 20 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a   a copy.      **
16060 20 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33 39   of bytes 24..39
16070 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
16080 2e 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31 20  .  Bytes 28..31 
16090 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
160a0 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2e 20  .      ** zero. 
160b0 20 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e   Bytes 32..35 an
160c0 64 20 33 35 2e 2e 33 39 20 73 68 6f 75 6c 64 20  d 35..39 should 
160d0 62 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  be page numbers 
160e0 77 68 69 63 68 20 61 72 65 0a 20 20 20 20 20 20  which are.      
160f0 2a 2a 20 6e 65 76 65 72 20 30 78 66 66 66 66 66  ** never 0xfffff
16100 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67  fff.  So filling
16110 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56   pPager->dbFileV
16120 65 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30  ers[] with all 0
16130 78 66 66 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  xff.      ** byt
16140 65 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63  es should suffic
16150 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
16160 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72    ** For an encr
16170 79 70 74 65 64 20 64 61 74 61 62 61 73 65 2c 20  ypted database, 
16180 74 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73  the situation is
16190 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20   more complex:  
161a0 62 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32  bytes.      ** 2
161b0 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74  4..39 of the dat
161c0 61 62 61 73 65 20 61 72 65 20 77 68 69 74 65 20  abase are white 
161d0 6e 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65 20  noise.  But the 
161e0 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20  probability of. 
161f0 20 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f       ** white no
16200 69 73 69 6e 67 20 65 71 75 61 6c 69 6e 67 20 31  ising equaling 1
16210 36 20 62 79 74 65 73 20 6f 66 20 30 78 66 66 20  6 bytes of 0xff 
16220 69 73 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73  is vanishingly s
16230 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a  mall so.      **
16240 20 77 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c   we should still
16250 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f   be ok..      */
16260 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
16270 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
16280 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70  , 0xff, sizeof(p
16290 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
162a0 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  s));.    }else{.
162b0 20 20 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65        u8 *dbFile
162c0 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50  Vers = &((u8*)pP
162d0 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20  g->pData)[24];. 
162e0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
162f0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
16300 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a   dbFileVers, siz
16310 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
16320 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a  leVers));.    }.
16330 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61    }.  CODEC1(pPa
16340 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  ger, pPg->pData,
16350 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53   pgno, 3, rc = S
16360 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20  QLITE_NOMEM);.. 
16370 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
16380 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
16390 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52  _count);.  PAGER
163a0 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52  _INCR(pPager->nR
163b0 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ead);.  IOTRACE(
163c0 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c  ("PGIN %p %d\n",
163d0 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
163e0 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
163f0 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64  FETCH %d page %d
16400 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
16410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
16420 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
16430 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
16440 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20  hash(pPg)));..  
16450 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
16460 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16470 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73  T_WAL./*.** This
16480 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76   function is inv
16490 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  oked once for ea
164a0 63 68 20 70 61 67 65 20 74 68 61 74 20 68 61 73  ch page that has
164b0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a   already been .*
164c0 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  * written into t
164d0 68 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e  he log file when
164e0 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69   a WAL transacti
164f0 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
16500 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  k..** Parameter 
16510 69 50 67 20 69 73 20 74 68 65 20 70 61 67 65 20  iPg is the page 
16520 6e 75 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70  number of said p
16530 61 67 65 2e 20 54 68 65 20 70 43 74 78 20 61 72  age. The pCtx ar
16540 67 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63  gument .** is ac
16550 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72  tually a pointer
16560 20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74   to the Pager st
16570 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49  ructure..**.** I
16580 66 20 70 61 67 65 20 69 50 67 20 69 73 20 70 72  f page iPg is pr
16590 65 73 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63  esent in the cac
165a0 68 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f  he, and has no o
165b0 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
165c0 65 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20  ences,.** it is 
165d0 64 69 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72  discarded. Other
165e0 77 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 61  wise, if there a
165f0 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
16600 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65  utstanding.** re
16610 66 65 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61  ferences, the pa
16620 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65  ge content is re
16630 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20  loaded from the 
16640 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65  database. If the
16650 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72  .** attempt to r
16660 65 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72  eload content fr
16670 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
16680 69 73 20 72 65 71 75 69 72 65 64 20 61 6e 64 20  is required and 
16690 66 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72  fails, .** retur
166a0 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
166b0 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
166c0 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  e, SQLITE_OK..*/
166d0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
166e0 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f  rUndoCallback(vo
166f0 69 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69  id *pCtx, Pgno i
16700 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Pg){.  int rc = 
16710 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
16720 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61  er *pPager = (Pa
16730 67 65 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67  ger *)pCtx;.  Pg
16740 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67  Hdr *pPg;..  pPg
16750 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
16760 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50  ookup(pPager, iP
16770 67 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b  g);.  if( pPg ){
16780 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
16790 50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75  PcachePageRefcou
167a0 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20  nt(pPg)==1 ){.  
167b0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
167c0 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20  eDrop(pPg);.    
167d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
167e0 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67  = readDbPage(pPg
167f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
16800 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16810 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52        pPager->xR
16820 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20  einiter(pPg);.  
16830 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
16840 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
16850 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  g);.    }.  }.. 
16860 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66   /* Normally, if
16870 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
16880 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61  s rolled back, a
16890 6e 79 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73  ny backup proces
168a0 73 65 73 20 61 72 65 0a 20 20 2a 2a 20 75 70 64  ses are.  ** upd
168b0 61 74 65 64 20 61 73 20 64 61 74 61 20 69 73 20  ated as data is 
168c0 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68  copied out of th
168d0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
168e0 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a  al and into the.
168f0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54    ** database. T
16900 68 69 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 72  his is not gener
16910 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69  ally possible wi
16920 74 68 20 61 20 57 41 4c 20 64 61 74 61 62 61 73  th a WAL databas
16930 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62  e, as.  ** rollb
16940 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d  ack involves sim
16950 70 6c 79 20 74 72 75 6e 63 61 74 69 6e 67 20 74  ply truncating t
16960 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65  he log file. The
16970 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20  refore, if one. 
16980 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d   ** or more fram
16990 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
169a0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
169b0 74 68 65 20 6c 6f 67 20 28 61 6e 64 20 74 68 65  the log (and the
169c0 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73  refore .  ** als
169d0 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68  o copied into th
169e0 65 20 62 61 63 6b 75 70 20 64 61 74 61 62 61 73  e backup databas
169f0 65 73 29 20 61 73 20 70 61 72 74 20 6f 66 20 74  es) as part of t
16a00 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  his transaction,
16a10 0a 20 20 2a 2a 20 74 68 65 20 62 61 63 6b 75 70  .  ** the backup
16a20 73 20 6d 75 73 74 20 62 65 20 72 65 73 74 61 72  s must be restar
16a30 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ted..  */.  sqli
16a40 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
16a50 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
16a60 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
16a70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
16a80 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
16a90 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  d to rollback a 
16aa0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61  transaction on a
16ab0 20 57 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a   WAL database..*
16ac0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
16ad0 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61  erRollbackWal(Pa
16ae0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
16af0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
16b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b10 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
16b20 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74  /.  PgHdr *pList
16b30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16b40 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64      /* List of d
16b50 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 72 65  irty pages to re
16b60 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f  vert */..  /* Fo
16b70 72 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74  r all pages in t
16b80 68 65 20 63 61 63 68 65 20 74 68 61 74 20 61 72  he cache that ar
16b90 65 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74  e currently dirt
16ba0 79 20 6f 72 20 68 61 76 65 20 61 6c 72 65 61 64  y or have alread
16bb0 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72 69 74  y.  ** been writ
16bc0 74 65 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d  ten (but not com
16bd0 6d 69 74 74 65 64 29 20 74 6f 20 74 68 65 20 6c  mitted) to the l
16be0 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20  og file, do one 
16bf0 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c  of the .  ** fol
16c00 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a  lowing:.  **.  *
16c10 2a 20 20 20 2b 20 44 69 73 63 61 72 64 20 74 68  *   + Discard th
16c20 65 20 63 61 63 68 65 64 20 70 61 67 65 20 28 69  e cached page (i
16c30 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20  f refcount==0), 
16c40 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f  or.  **   + Relo
16c50 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  ad page content 
16c60 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
16c70 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3e 30  e (if refcount>0
16c80 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  )..  */.  pPager
16c90 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
16ca0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20  r->dbOrigSize;. 
16cb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
16cc0 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61  Undo(pPager->pWa
16cd0 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c  l, pagerUndoCall
16ce0 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50  back, (void *)pP
16cf0 61 67 65 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d  ager);.  pList =
16d00 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69   sqlite3PcacheDi
16d10 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
16d20 70 50 43 61 63 68 65 29 3b 0a 20 20 77 68 69 6c  pPCache);.  whil
16d30 65 28 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d  e( pList && rc==
16d40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16d50 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20   PgHdr *pNext = 
16d60 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
16d70 20 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64     rc = pagerUnd
16d80 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20  oCallback((void 
16d90 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d  *)pPager, pList-
16da0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73  >pgno);.    pLis
16db0 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a  t = pNext;.  }..
16dc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16dd0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
16de0 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70 65 72  ion is a wrapper
16df0 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57   around sqlite3W
16e00 61 6c 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77  alFrames(). As w
16e10 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a  ell as logging.*
16e20 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * the contents o
16e30 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61  f the list of pa
16e40 67 65 73 20 68 65 61 64 65 64 20 62 79 20 70 4c  ges headed by pL
16e50 69 73 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62  ist (connected b
16e60 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68  y pDirty),.** th
16e70 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69  is function noti
16e80 66 69 65 73 20 61 6e 79 20 61 63 74 69 76 65 20  fies any active 
16e90 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73  backup processes
16ea0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 73 20   that the pages 
16eb0 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e  have.** changed.
16ec0 20 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74   .*/ .static int
16ed0 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
16ee0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
16ef0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16f00 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
16f10 63 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ct */.  PgHdr *p
16f20 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
16f30 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
16f40 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67  of frames to log
16f50 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e   */.  Pgno nTrun
16f60 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  cate,           
16f70 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
16f80 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 69  e size after thi
16f90 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e  s commit */.  in
16fa0 74 20 69 73 43 6f 6d 6d 69 74 2c 20 20 20 20 20  t isCommit,     
16fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16fc0 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
16fd0 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69   a commit */.  i
16fe0 6e 74 20 73 79 6e 63 5f 66 6c 61 67 73 20 20 20  nt sync_flags   
16ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17000 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20  * Flags to pass 
17010 74 6f 20 4f 73 53 79 6e 63 28 29 20 28 6f 72 20  to OsSync() (or 
17020 30 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  0) */.){.  int r
17030 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
17040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
17050 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
17060 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17070 70 57 61 6c 20 29 3b 0a 20 20 72 63 20 3d 20 73  pWal );.  rc = s
17080 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28  qlite3WalFrames(
17090 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20  pPager->pWal, . 
170a0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
170b0 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54  eSize, pList, nT
170c0 72 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69  runcate, isCommi
170d0 74 2c 20 73 79 6e 63 5f 66 6c 61 67 73 0a 20 20  t, sync_flags.  
170e0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
170f0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
17100 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20  ->pBackup ){.   
17110 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66   PgHdr *p;.    f
17120 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70  or(p=pList; p; p
17130 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
17140 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
17150 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
17160 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c  Backup, p->pgno,
17170 20 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29   (u8 *)p->pData)
17180 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
17190 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
171a0 2a 20 4f 70 65 6e 20 61 20 57 41 4c 20 73 6e 61  * Open a WAL sna
171b0 70 73 68 6f 74 20 6f 6e 20 74 68 65 20 6c 6f 67  pshot on the log
171c0 20 66 69 6c 65 20 74 68 69 73 20 70 61 67 65 72   file this pager
171d0 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f   is connected to
171e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
171f0 70 61 67 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f  pagerOpenSnapsho
17200 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
17210 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
17220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17230 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
17240 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e  de */.  int chan
17250 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ged = 0;        
17260 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
17270 69 66 20 63 61 63 68 65 20 6d 75 73 74 20 62 65  if cache must be
17280 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73   reset */..  ass
17290 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
172a0 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72  (pPager) );..  r
172b0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 4f 70  c = sqlite3WalOp
172c0 65 6e 53 6e 61 70 73 68 6f 74 28 70 50 61 67 65  enSnapshot(pPage
172d0 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67 65  r->pWal, &change
172e0 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  d);.  if( rc==SQ
172f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
17300 6e 74 20 64 75 6d 6d 79 3b 0a 20 20 20 20 69 66  nt dummy;.    if
17310 28 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20  ( changed ){.   
17320 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
17330 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
17340 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
17350 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  rCode || pPager-
17360 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20  >dbSizeValid==0 
17370 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
17380 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
17390 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
173a0 26 64 75 6d 6d 79 29 3b 0a 20 20 7d 0a 20 20 70  &dummy);.  }.  p
173b0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
173c0 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 0a 20 20  AGER_SHARED;..  
173d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
173e0 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65  .** Check if the
173f0 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74   *-wal file that
17400 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
17410 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  the database ope
17420 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a  ned by pPager.**
17430 20 65 78 69 73 74 73 2e 20 41 73 73 75 6d 69 6e   exists. Assumin
17440 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  g no error occur
17450 73 2c 20 73 65 74 20 2a 70 45 78 69 73 74 73 20  s, set *pExists 
17460 74 6f 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  to 1 if the file
17470 20 65 78 69 73 74 73 2c 0a 2a 2a 20 6f 72 20 30   exists,.** or 0
17480 20 6f 74 68 65 72 77 69 73 65 20 61 6e 64 20 72   otherwise and r
17490 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
174a0 20 49 66 20 61 6e 20 49 4f 20 6f 72 20 4f 4f 4d   If an IO or OOM
174b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
174c0 65 74 75 72 6e 0a 2a 2a 20 61 6e 20 53 51 4c 69  eturn.** an SQLi
174d0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
174e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
174f0 65 72 48 61 73 57 41 4c 28 50 61 67 65 72 20 2a  erHasWAL(Pager *
17500 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78  pPager, int *pEx
17510 69 73 74 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ists){.  int rc;
17520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17530 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
17540 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61  rn code */.  cha
17550 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20  r *zWal;        
17560 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17570 4e 61 6d 65 20 6f 66 20 74 68 65 20 57 41 4c 20  Name of the WAL 
17580 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  file */..  asser
17590 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
175a0 46 69 6c 65 20 29 3b 0a 20 20 7a 57 61 6c 20 3d  File );.  zWal =
175b0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
175c0 28 22 25 73 2d 77 61 6c 22 2c 20 70 50 61 67 65  ("%s-wal", pPage
175d0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  r->zFilename);. 
175e0 20 69 66 28 20 21 7a 57 61 6c 20 29 7b 0a 20 20   if( !zWal ){.  
175f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
17600 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
17610 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
17620 41 63 63 65 73 73 28 70 50 61 67 65 72 2d 3e 70  Access(pPager->p
17630 56 66 73 2c 20 7a 57 61 6c 2c 20 53 51 4c 49 54  Vfs, zWal, SQLIT
17640 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
17650 20 70 45 78 69 73 74 73 29 3b 0a 20 20 20 20 73   pExists);.    s
17660 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 61 6c  qlite3_free(zWal
17670 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
17680 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  rc;.}../*.** Che
17690 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20  ck if the *-wal 
176a0 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73  file that corres
176b0 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74  ponds to the dat
176c0 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
176d0 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73  pPager.** exists
176e0 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20 6f 70  . If it does, op
176f0 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 6e 20  en the pager in 
17700 57 41 4c 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77  WAL mode. Otherw
17710 69 73 65 2c 20 69 66 20 6e 6f 20 65 72 72 6f 72  ise, if no error
17720 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65  .** occurs, make
17730 20 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75 72   sure Pager.jour
17740 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73  nalMode is not s
17750 65 74 20 74 6f 20 50 41 47 45 52 5f 4a 4f 55 52  et to PAGER_JOUR
17760 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 20  NALMODE_WAL..** 
17770 49 66 20 61 6e 20 49 4f 20 6f 72 20 4f 4f 4d 20  If an IO or OOM 
17780 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
17790 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
177a0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
177b0 20 49 66 20 74 68 65 20 57 41 4c 20 66 69 6c 65   If the WAL file
177c0 20 69 73 20 6f 70 65 6e 65 64 2c 20 61 6c 73 6f   is opened, also
177d0 20 6f 70 65 6e 20 61 20 73 6e 61 70 73 68 6f 74   open a snapshot
177e0 20 28 72 65 61 64 20 74 72 61 6e 73 61 63 74 69   (read transacti
177f0 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  on)..**.** The c
17800 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20  aller must hold 
17810 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e  a SHARED lock on
17820 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17830 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a  le to call this.
17840 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63  ** function. Bec
17850 61 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56  ause an EXCLUSIV
17860 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62  E lock on the db
17870 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65   file is require
17880 64 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20  d to delete .** 
17890 61 20 57 41 4c 2c 20 74 68 69 73 20 65 6e 73 75  a WAL, this ensu
178a0 72 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20  res there is no 
178b0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 62  race condition b
178c0 65 74 77 65 65 6e 20 74 68 65 20 78 41 63 63 65  etween the xAcce
178d0 73 73 28 29 20 0a 2a 2a 20 62 65 6c 6f 77 20 61  ss() .** below a
178e0 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29 20  nd an xDelete() 
178f0 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 20 62  being executed b
17900 79 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e  y some other con
17910 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  nection..*/.stat
17920 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e  ic int pagerOpen
17930 57 61 6c 49 66 50 72 65 73 65 6e 74 28 50 61 67  WalIfPresent(Pag
17940 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
17950 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
17960 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  K;.  if( !pPager
17970 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
17980 20 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20    int isWal;    
17990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179a0 2f 2a 20 54 72 75 65 20 69 66 20 57 41 4c 20 66  /* True if WAL f
179b0 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ile exists */.  
179c0 20 20 72 63 20 3d 20 70 61 67 65 72 48 61 73 57    rc = pagerHasW
179d0 41 4c 28 70 50 61 67 65 72 2c 20 26 69 73 57 61  AL(pPager, &isWa
179e0 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  l);.    if( rc==
179f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17a00 20 20 20 69 66 28 20 69 73 57 61 6c 20 29 7b 0a     if( isWal ){.
17a10 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
17a20 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
17a30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17a40 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50  3PagerOpenWal(pP
17a50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
17a60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17a70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
17a80 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 53   rc = pagerOpenS
17a90 6e 61 70 73 68 6f 74 28 70 50 61 67 65 72 29 3b  napshot(pPager);
17aa0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17ab0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
17ac0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
17ad0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
17ae0 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  E_WAL ){.       
17af0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
17b00 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
17b10 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b  RNALMODE_DELETE;
17b20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17b30 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
17b40 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
17b50 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69  Playback savepoi
17b60 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f  nt pSavepoint. O
17b70 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74  r, if pSavepoint
17b80 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61  ==NULL, then pla
17b90 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74  yback.** the ent
17ba0 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
17bb0 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73  al file. The cas
17bc0 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  e pSavepoint==NU
17bd0 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a  LL occurs when .
17be0 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f  ** a ROLLBACK TO
17bf0 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f   command is invo
17c00 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49  ked on a SAVEPOI
17c10 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61  NT that is a tra
17c20 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76  nsaction .** sav
17c30 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68  epoint..**.** Wh
17c40 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  en pSavepoint is
17c50 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69   not NULL (meani
17c60 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63  ng a non-transac
17c70 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
17c80 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c  s .** being roll
17c90 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74  ed back), then t
17ca0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73  he rollback cons
17cb0 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68  ists of up to th
17cc0 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70  ree stages,.** p
17cd0 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20  erformed in the 
17ce0 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a  order specified:
17cf0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
17d00 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
17d10 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
17d20 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
17d30 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f  at byte.**     o
17d40 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70  ffset PagerSavep
17d50 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64  oint.iOffset and
17d60 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a   continuing to .
17d70 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
17d80 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
17d90 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20  , or to the end 
17da0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
17db0 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  nal.**     file 
17dc0 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  if PagerSavepoin
17dd0 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
17de0 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  zero..**.**   * 
17df0 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  If PagerSavepoin
17e00 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
17e10 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70  not zero, then p
17e20 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a  ages are played.
17e30 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72  **     back star
17e40 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ting from the jo
17e50 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d  urnal header imm
17e60 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
17e70 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  ng .**     Pager
17e80 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
17e90 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20  fset to the end 
17ea0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
17eb0 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
17ec0 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68    * Pages are th
17ed0 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  en played back f
17ee0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
17ef0 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69  nal file, starti
17f00 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74  ng.**     with t
17f10 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
17f20 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f  t.iSubRec and co
17f30 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
17f40 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68  end of.**     th
17f50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
17f60 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74  **.** Throughout
17f70 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72   the rollback pr
17f80 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65  ocess, each time
17f90 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65   a page is rolle
17fa0 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63  d back, the.** c
17fb0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
17fc0 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74   is set in a bit
17fd0 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76  vec structure (v
17fe0 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e  ariable pDone in
17ff0 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e   the.** implemen
18000 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54  tation below). T
18010 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65  his is used to e
18020 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67  nsure that a pag
18030 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c  e is only.** rol
18040 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72  led back the fir
18050 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e  st time it is en
18060 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74  countered in eit
18070 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  her journal..**.
18080 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74  ** If pSavepoint
18090 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70   is NULL, then p
180a0 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c  ages are only pl
180b0 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
180c0 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e  he main.** journ
180d0 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69  al file. There i
180e0 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20  s no need for a 
180f0 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63  bitvec in this c
18100 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69  ase..**.** In ei
18110 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72  ther case, befor
18120 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65  e playback comme
18130 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64  nces the Pager.d
18140 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a  bSize variable.*
18150 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68  * is reset to th
18160 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20  e value that it 
18170 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72  held at the star
18180 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69  t of the savepoi
18190 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73  nt .** (or trans
181a0 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65  action). No page
181b0 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d   with a page-num
181c0 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
181d0 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69   this value.** i
181e0 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49  s played back. I
181f0 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74  f one is encount
18200 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c  ered it is simpl
18210 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74  y skipped..*/.st
18220 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c  atic int pagerPl
18230 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28  aybackSavepoint(
18240 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
18250 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
18260 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36  Savepoint){.  i6
18270 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
18280 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74         /* Effect
18290 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
182a0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  main journal */.
182b0 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
182c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
182d0 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65  d of first segme
182e0 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e  nt of main-journ
182f0 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al records */.  
18300 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
18310 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
18320 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74  rn code */.  Bit
18330 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20  vec *pDone = 0; 
18340 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
18350 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20  to ensure pages 
18360 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79  played back only
18370 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65   once */..  asse
18380 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
18390 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
183a0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
183b0 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73  e a bitvec to us
183c0 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
183d0 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c  et of pages roll
183e0 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  ed back */.  if(
183f0 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
18400 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74     pDone = sqlit
18410 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
18420 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
18430 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e  );.    if( !pDon
18440 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
18450 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
18460 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
18470 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  Set the database
18480 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68   size back to th
18490 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62  e value it was b
184a0 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f  efore the savepo
184b0 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20  int .  ** being 
184c0 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65  reverted was ope
184d0 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ned..  */.  pPag
184e0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61  er->dbSize = pSa
184f0 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70  vepoint ? pSavep
18500 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50  oint->nOrig : pP
18510 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
18520 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65 70  ;..  if( !pSavep
18530 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 65  oint && pagerUse
18540 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
18550 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 52     return pagerR
18560 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65  ollbackWal(pPage
18570 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73  r);.  }..  /* Us
18580 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e pPager->journa
18590 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65  lOff as the effe
185a0 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
185b0 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
185c0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54    ** journal.  T
185d0 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d  he actual file m
185e0 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
185f0 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a  han this in.  **
18600 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
18610 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50  DE_TRUNCATE or P
18620 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
18630 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61  _PERSIST.  But a
18640 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73  nything.  ** pas
18650 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  t pPager->journa
18660 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69  lOff is off-limi
18670 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20  ts to us..  */. 
18680 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a   szJ = pPager->j
18690 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73  ournalOff;.  ass
186a0 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
186b0 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73  (pPager)==0 || s
186c0 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42  zJ==0 );..  /* B
186d0 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20  egin by rolling 
186e0 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f  back records fro
186f0 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
18700 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20  al starting at. 
18710 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
18720 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63  nt.iOffset and c
18730 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
18740 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
18750 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65  ader..  ** There
18760 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64   might be record
18770 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  s in the main jo
18780 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20  urnal that have 
18790 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  a page number.  
187a0 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
187b0 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
187c0 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65  base size (pPage
187d0 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74  r->dbSize) but t
187e0 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  hose.  ** will b
187f0 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61  e skipped automa
18800 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20  tically.  Pages 
18810 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f  are added to pDo
18820 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20  ne as they.  ** 
18830 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e  are played back.
18840 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
18850 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72  epoint && !pager
18860 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
18870 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20  {.    iHdrOff = 
18880 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72  pSavepoint->iHdr
18890 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f  Offset ? pSavepo
188a0 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
188b0 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65  : szJ;.    pPage
188c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
188d0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66  pSavepoint->iOff
188e0 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  set;.    while( 
188f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18900 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
18910 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20  Off<iHdrOff ){. 
18920 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
18930 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
18940 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
18950 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
18960 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Done, 1, 1);.   
18970 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
18980 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
18990 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
189a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
189b0 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  f = 0;.  }..  /*
189c0 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e   Continue rollin
189d0 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f  g back records o
189e0 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ut of the main j
189f0 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
18a00 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  at.  ** the firs
18a10 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
18a20 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e   seen and contin
18a30 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65  uing until the e
18a40 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a  ffective end.  *
18a50 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * of the main jo
18a60 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e  urnal file.  Con
18a70 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75  tinue to skip ou
18a80 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73  t-of-range pages
18a90 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e   and.  ** contin
18aa0 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20  ue adding pages 
18ab0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70  rolled back to p
18ac0 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  Done..  */.  whi
18ad0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
18ae0 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
18af0 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20  rnalOff<szJ ){. 
18b00 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20     u32 ii;      
18b10 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
18b20 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  unter */.    u32
18b30 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20   nJRec = 0;     
18b40 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75  /* Number of Jou
18b50 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a  rnal Records */.
18b60 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
18b70 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
18b80 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30  nalHdr(pPager, 0
18b90 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26  , szJ, &nJRec, &
18ba0 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65  dummy);.    asse
18bb0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
18bc0 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  ONE );..    /*. 
18bd0 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65     ** The "pPage
18be0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
18bf0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
18c00 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
18c10 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a  urnalOff".    **
18c20 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64   test is related
18c30 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35   to ticket #2565
18c40 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75  .  See the discu
18c50 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20  ssion in the.   
18c60 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
18c70 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ck() function fo
18c80 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
18c90 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  ormation..    */
18ca0 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d  .    if( nJRec==
18cb0 30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65  0 .     && pPage
18cc0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
18cd0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
18ce0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
18cf0 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a  urnalOff.    ){.
18d00 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75        nJRec = (u
18d10 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  32)((szJ - pPage
18d20 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a  r->journalOff)/J
18d30 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
18d40 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ger));.    }.   
18d50 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53   for(ii=0; rc==S
18d60 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e  QLITE_OK && ii<n
18d70 4a 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e  JRec && pPager->
18d80 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20  journalOff<szJ; 
18d90 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20  ii++){.      rc 
18da0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
18db0 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
18dc0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
18dd0 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c  alOff, pDone, 1,
18de0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
18df0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
18e00 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20  E_DONE );.  }.  
18e10 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
18e20 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
18e30 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 73 7a 4a  >journalOff==szJ
18e40 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c   );..  /* Finall
18e50 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  y,  rollback pag
18e60 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  es from the sub-
18e70 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74  journal.  Page t
18e80 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72  hat were.  ** pr
18e90 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20  eviously rolled 
18ea0 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  back out of the 
18eb0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e  main journal (an
18ec0 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70  d are hence in p
18ed0 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20  Done).  ** will 
18ee0 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74  be skipped.  Out
18ef0 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
18f00 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64  are also skipped
18f10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
18f20 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75  vepoint ){.    u
18f30 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
18f40 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
18f50 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66  r */.    i64 off
18f60 73 65 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  set = pSavepoint
18f70 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
18f80 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
18f90 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
18fa0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
18fb0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18fc0 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e  e3WalSavepointUn
18fd0 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
18fe0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61   pSavepoint->aWa
18ff0 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  lData);.    }.  
19000 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
19010 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
19020 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
19030 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  i<pPager->nSubRe
19040 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
19050 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d  assert( offset==
19060 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ii*(4+pPager->pa
19070 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20  geSize) );.     
19080 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
19090 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
190a0 61 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70  ager, &offset, p
190b0 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20  Done, 0, 1);.   
190c0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
190d0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
190e0 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
190f0 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44  BitvecDestroy(pD
19100 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  one);.  if( rc==
19110 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19120 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
19130 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a  Off = szJ;.  }..
19140 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19150 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
19160 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
19170 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
19180 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
19190 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wed..*/.void sql
191a0 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
191b0 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
191c0 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
191d0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
191e0 65 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50  eSetCachesize(pP
191f0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d  ager->pPCache, m
19200 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xPage);.}../*.**
19210 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75   Adjust the robu
19220 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61  stness of the da
19230 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65  tabase to damage
19240 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
19250 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  es.** or power f
19260 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67  ailures by chang
19270 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
19280 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20  f syncs()s when 
19290 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72  writing.** the r
192a0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
192b0 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65    There are thre
192c0 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20  e levels:.**.** 
192d0 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c     OFF       sql
192e0 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20  ite3OsSync() is 
192f0 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54  never called.  T
19300 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
19310 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
19320 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79     for temporary
19330 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66   and transient f
19340 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  iles..**.**    N
19350 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75  ORMAL    The jou
19360 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f  rnal is synced o
19370 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  nce before write
19380 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
19390 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
193a0 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
193b0 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75  s normally adequ
193c0 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20  ate protection, 
193d0 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  but.**          
193e0 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65      it is theore
193f0 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  tically possible
19400 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e  , though very un
19410 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20  likely,.**      
19420 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20          that an 
19430 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72  inopertune power
19440 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
19450 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eave the journal
19460 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
19470 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63   in a state whic
19480 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61  h would cause da
19490 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
194a0 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
194b0 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20       when it is 
194c0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
194d0 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20  **    FULL      
194e0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
194f0 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f  ynced twice befo
19500 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
19510 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
19520 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
19530 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74  (with some addit
19540 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
19550 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65  n - the nRec fie
19560 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ld.**           
19570 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61     of the journa
19580 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67  l header - being
19590 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77   written in betw
195a0 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20  een the two.**  
195b0 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63              sync
195c0 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d  s).  If we assum
195d0 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61  e that writing a
195e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
195f0 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
19600 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74  tor is atomic, t
19610 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72  hen this mode pr
19620 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20  ovides.**       
19630 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65         assurance
19640 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
19650 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f  l will not be co
19660 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a  rrupted to the.*
19670 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  *              p
19680 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20  oint of causing 
19690 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
196a0 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f  tabase during ro
196b0 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75  llback..**.** Nu
196c0 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
196d0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
196e0 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
196f0 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
19700 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
19710 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
19720 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
19730 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
19740 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
19750 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  vel(Pager *pPage
19760 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  r, int level, in
19770 74 20 62 46 75 6c 6c 46 73 79 6e 63 29 7b 0a 20  t bFullFsync){. 
19780 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
19790 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20  =  (level==1 || 
197a0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
197b0 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72  ) ?1:0;.  pPager
197c0 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65  ->fullSync = (le
197d0 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65  vel==3 && !pPage
197e0 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a  r->tempFile) ?1:
197f0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  0;.  pPager->syn
19800 63 5f 66 6c 61 67 73 20 3d 20 28 62 46 75 6c 6c  c_flags = (bFull
19810 46 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e  Fsync?SQLITE_SYN
19820 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59  C_FULL:SQLITE_SY
19830 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66  NC_NORMAL);.  if
19840 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
19850 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53   ) pPager->needS
19860 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69  ync = 0;.}.#endi
19870 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
19880 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
19890 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
198a0 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  ented whenever t
198b0 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74  he library.** at
198c0 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61  tempts to open a
198d0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
198e0 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
198f0 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  on is used for.*
19900 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  * testing and an
19910 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a  alysis only.  .*
19920 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
19930 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
19940 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20  _opentemp_count 
19950 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
19960 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
19970 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ary file..**.** 
19980 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
19990 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
199a0 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51  pFile. Return SQ
199b0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
199c0 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ss .** or some o
199d0 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
199e0 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20  if we fail. The 
199f0 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
19a00 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65  cally .** delete
19a10 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
19a20 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63  ile when it is c
19a30 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  losed..**.** The
19a40 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f   flags passed to
19a50 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78   the VFS layer x
19a60 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20  Open() call are 
19a70 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a  those specified.
19a80 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ** by parameter 
19a90 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69  vfsFlags ORed wi
19aa0 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
19ab0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
19ac0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
19ad0 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
19ae0 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20  OPEN_CREATE.**  
19af0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
19b00 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20  XCLUSIVE.**     
19b10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
19b20 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61  TEONCLOSE.*/.sta
19b30 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65  tic int pagerOpe
19b40 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a  ntemp(.  Pager *
19b50 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f  pPager,        /
19b60 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65  * The pager obje
19b70 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ct */.  sqlite3_
19b80 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a  file *pFile,  /*
19b90 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
19ba0 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20  descriptor here 
19bb0 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
19bc0 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  s          /* Fl
19bd0 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
19be0 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f  gh to the VFS */
19bf0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
19c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
19c10 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23  eturn code */..#
19c20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
19c30 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  T.  sqlite3_open
19c40 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f  temp_count++;  /
19c50 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69  * Used for testi
19c60 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
19c70 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  only */.#endif..
19c80 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53    vfsFlags |=  S
19c90 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
19ca0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
19cb0 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
19cc0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
19cd0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20  PEN_EXCLUSIVE | 
19ce0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
19cf0 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20  TEONCLOSE;.  rc 
19d00 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
19d10 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c  pPager->pVfs, 0,
19d20 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73   pFile, vfsFlags
19d30 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
19d40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
19d50 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29   isOpen(pFile) )
19d60 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
19d70 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
19d80 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e  busy handler fun
19d90 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
19da0 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74   pager invokes t
19db0 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
19dc0 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  if sqlite3OsLock
19dd0 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  () returns .** S
19de0 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20  QLITE_BUSY when 
19df0 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
19e00 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74  e from no-lock t
19e10 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  o a SHARED lock,
19e20 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69  .** or when tryi
19e30 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ng to upgrade fr
19e40 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  om a RESERVED lo
19e50 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ck to an EXCLUSI
19e60 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20  VE .** lock. It 
19e70 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b  does *not* invok
19e80 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
19e90 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  er when upgradin
19ea0 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44  g from.** SHARED
19eb0 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72   to RESERVED, or
19ec0 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
19ed0 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45  from SHARED to E
19ee0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69  XCLUSIVE.** (whi
19ef0 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  ch occurs during
19f00 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
19f10 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a  lback). Summary:
19f20 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74  .**.**   Transit
19f30 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ion             
19f40 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76             | Inv
19f50 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65  okes xBusyHandle
19f60 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  r.**   ---------
19f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
19fa0 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20  **   NO_LOCK    
19fb0 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43     -> SHARED_LOC
19fc0 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20  K      | Yes.** 
19fd0 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
19fe0 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  -> RESERVED_LOCK
19ff0 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48      | No.**   SH
1a000 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45  ARED_LOCK   -> E
1a010 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
1a020 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56  | No.**   RESERV
1a030 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55  ED_LOCK -> EXCLU
1a040 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65  SIVE_LOCK   | Ye
1a050 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  s.**.** If the b
1a060 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
1a070 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e  back returns non
1a080 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
1a090 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20  is .** retried. 
1a0a0 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  If it returns ze
1a0b0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c  ro, then the SQL
1a0c0 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69  ITE_BUSY error i
1a0d0 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f  s.** returned to
1a0e0 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74   the caller of t
1a0f0 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e  he pager API fun
1a100 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
1a110 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
1a120 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67  syhandler(.  Pag
1a130 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
1a140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a150 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
1a160 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  t */.  int (*xBu
1a170 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20  syHandler)(void 
1a180 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  *),         /* P
1a190 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68  ointer to busy-h
1a1a0 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
1a1b0 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
1a1c0 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20  HandlerArg      
1a1d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
1a1e0 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f  ument to pass to
1a1f0 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f   xBusyHandler */
1a200 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72 2d 3e  .){  .  pPager->
1a210 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78  xBusyHandler = x
1a220 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70  BusyHandler;.  p
1a230 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
1a240 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61  lerArg = pBusyHa
1a250 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a  ndlerArg;.}../*.
1a260 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75  ** Report the cu
1a270 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20  rrent page size 
1a280 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  and number of re
1a290 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63  served bytes bac
1a2a0 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65  k.** to the code
1a2b0 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  c..*/.#ifdef SQL
1a2c0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74  ITE_HAS_CODEC.st
1a2d0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52  atic void pagerR
1a2e0 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20  eportSize(Pager 
1a2f0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
1a300 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
1a310 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50  zeChng ){.    pP
1a320 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
1a330 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f  Chng(pPager->pCo
1a340 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  dec, pPager->pag
1a350 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
1a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a370 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e    (int)pPager->n
1a380 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a  Reserve);.  }.}.
1a390 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
1a3a0 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58  agerReportSize(X
1a3b0 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69  )     /* No-op i
1a3c0 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  f we do not supp
1a3d0 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23  ort a codec */.#
1a3e0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  endif../*.** Cha
1a3f0 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a  nge the page siz
1a400 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61  e used by the Pa
1a410 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20  ger object. The 
1a420 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a  new page size .*
1a430 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a  * is passed in *
1a440 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
1a450 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
1a460 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
1a470 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
1a480 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1a490 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  , it.** is a no-
1a4a0 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  op. The value re
1a4b0 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72  turned is the er
1a4c0 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
1a4d0 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f  code (i.e. .** o
1a4e0 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45  ne of SQLITE_IOE
1a4f0 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
1a500 50 54 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  PT or SQLITE_FUL
1a510 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  L)..**.** Otherw
1a520 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74  ise, if all of t
1a530 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
1a540 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   true:.**.**   *
1a550 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   the new page si
1a560 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50  ze (value of *pP
1a570 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69  ageSize) is vali
1a580 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20  d (a power .**  
1a590 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65     of two betwee
1a5a0 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45  n 512 and SQLITE
1a5b0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20  _MAX_PAGE_SIZE, 
1a5c0 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a  inclusive), and.
1a5d0 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20  **.**   * there 
1a5e0 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
1a5f0 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
1a600 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  es, and.**.**   
1a610 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
1a620 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20  s either not an 
1a630 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1a640 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20  se or it is.**  
1a650 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20     an in-memory 
1a660 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75  database that cu
1a670 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73  rrently consists
1a680 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a   of zero pages..
1a690 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70  **.** then the p
1a6a0 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65  ager object page
1a6b0 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
1a6c0 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
1a6d0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
1a6e0 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74  ze is changed, t
1a6f0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1a700 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61  n uses sqlite3Pa
1a710 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20  gerMalloc() .** 
1a720 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20  to obtain a new 
1a730 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
1a740 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20  buffer. If this 
1a750 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
1a760 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  pt .** fails, SQ
1a770 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
1a780 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70  turned and the p
1a790 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73  age size remains
1a7a0 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20   unchanged. .** 
1a7b0 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73  In all other cas
1a7c0 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  es, SQLITE_OK is
1a7d0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
1a7e0 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
1a7f0 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64  e is not changed
1a800 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  , either because
1a810 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d   one of the enum
1a820 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74  erated.** condit
1a830 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f  ions above is no
1a840 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65  t true, the page
1a850 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73  r was in error s
1a860 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
1a870 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  * function was c
1a880 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73  alled, or becaus
1a890 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  e the memory all
1a8a0 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
1a8b0 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e  failed, .** then
1a8c0 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73   *pPageSize is s
1a8d0 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72  et to the old, r
1a8e0 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a  etained page siz
1a8f0 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
1a900 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
1a910 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
1a920 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
1a930 2c 20 75 31 36 20 2a 70 50 61 67 65 53 69 7a 65  , u16 *pPageSize
1a940 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b  , int nReserve){
1a950 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67  .  int rc = pPag
1a960 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
1a970 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a980 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67  K ){.    u16 pag
1a990 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69  eSize = *pPageSi
1a9a0 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ze;.    assert( 
1a9b0 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28  pageSize==0 || (
1a9c0 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
1a9d0 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
1a9e0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
1a9f0 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61   );.    if( (pPa
1aa00 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c  ger->memDb==0 ||
1aa10 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
1aa20 3d 30 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69  =0).     && sqli
1aa30 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
1aa40 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
1aa50 65 29 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70  e)==0 .     && p
1aa60 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53  ageSize && pageS
1aa70 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70 61 67  ize!=pPager->pag
1aa80 65 53 69 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20  eSize .    ){.  
1aa90 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d      char *pNew =
1aaa0 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1aab0 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53  PageMalloc(pageS
1aac0 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
1aad0 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20  !pNew ){.       
1aae0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1aaf0 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
1ab00 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
1ab10 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1ab20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
1ab30 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
1ab40 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
1ab50 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65  e3PageFree(pPage
1ab60 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
1ab70 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
1ab80 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b  TmpSpace = pNew;
1ab90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1aba0 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a  PcacheSetPageSiz
1abb0 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
1abc0 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  e, pageSize);.  
1abd0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1abe0 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 28 75 31  *pPageSize = (u1
1abf0 36 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  6)pPager->pageSi
1ac00 7a 65 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 73  ze;.    if( nRes
1ac10 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76  erve<0 ) nReserv
1ac20 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73  e = pPager->nRes
1ac30 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
1ac40 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26  ( nReserve>=0 &&
1ac50 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20 29   nReserve<1000 )
1ac60 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
1ac70 65 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52  eserve = (i16)nR
1ac80 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65  eserve;.    page
1ac90 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
1aca0 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
1acb0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1acc0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1acd0 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72  to the "temporar
1ace0 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68  y page" buffer h
1acf0 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  eld internally.*
1ad00 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20  * by the pager. 
1ad10 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65   This is a buffe
1ad20 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e  r that is big en
1ad30 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
1ad40 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  .** entire conte
1ad50 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  nt of a database
1ad60 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66   page.  This buf
1ad70 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65  fer is used inte
1ad80 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67  rnally.** during
1ad90 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69   rollback and wi
1ada0 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ll be overwritte
1adb0 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c  n whenever a rol
1adc0 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e  lback.** occurs.
1add0 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75    But other modu
1ade0 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20  les are free to 
1adf0 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c  use it too, as l
1ae00 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c  ong as.** no rol
1ae10 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65  lbacks are happe
1ae20 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ning..*/.void *s
1ae30 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
1ae40 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67  pace(Pager *pPag
1ae50 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
1ae60 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
1ae70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
1ae80 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78  t to set the max
1ae90 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61  imum database pa
1aea0 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61  ge count if mxPa
1aeb0 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20  ge is positive. 
1aec0 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e  .** Make no chan
1aed0 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73  ges if mxPage is
1aee0 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76   zero or negativ
1aef0 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65  e.  And never re
1af00 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69  duce the.** maxi
1af10 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62  mum page count b
1af20 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74  elow the current
1af30 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1af40 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67  abase..**.** Reg
1af50 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67  ardless of mxPag
1af60 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75  e, return the cu
1af70 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61  rrent maximum pa
1af80 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
1af90 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
1afa0 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20  PageCount(Pager 
1afb0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
1afc0 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67  age){.  int nPag
1afd0 65 3b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  e;.  if( mxPage>
1afe0 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
1aff0 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65  >mxPgno = mxPage
1b000 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
1b010 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
1b020 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73  _UNLOCK ){.    s
1b030 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1b040 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
1b050 61 67 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  age);.    assert
1b060 28 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  ( pPager->mxPgno
1b070 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 7d 0a 20  >=nPage );.  }. 
1b080 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1b090 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
1b0a0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
1b0b0 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
1b0c0 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
1b0d0 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
1b0e0 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
1b0f0 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
1b100 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
1b110 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
1b120 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
1b130 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
1b140 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
1b150 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
1b160 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
1b170 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
1b180 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
1b190 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
1b1a0 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
1b1b0 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
1b1c0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
1b1d0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
1b1e0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
1b1f0 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
1b200 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
1b210 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
1b220 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
1b230 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
1b240 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
1b250 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
1b260 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
1b270 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
1b280 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
1b290 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
1b2a0 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
1b2b0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
1b2c0 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
1b2d0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
1b2e0 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
1b2f0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
1b300 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
1b310 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
1b320 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
1b330 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
1b340 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1b350 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
1b360 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
1b370 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1b380 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
1b390 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
1b3a0 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
1b3b0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77  * If the pager w
1b3c0 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74  as opened on a t
1b3d0 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a  ransient file (z
1b3e0 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f  Filename==""), o
1b3f0 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r.** opened on a
1b400 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20   file less than 
1b410 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  N bytes in size,
1b420 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
1b430 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20  er is.** zeroed 
1b440 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
1b450 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69  turned. The rati
1b460 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69  onale for this i
1b470 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20  s that this .** 
1b480 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1b490 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73   to read databas
1b4a0 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61  e headers, and a
1b4b0 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f   new transient o
1b4c0 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20  r.** zero sized 
1b4d0 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68  database has a h
1b4e0 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69  eader than consi
1b4f0 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
1b500 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  zeroes..**.** If
1b510 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70   any IO error ap
1b520 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  art from SQLITE_
1b530 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
1b540 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
1b550 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f  .** the error co
1b560 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
1b570 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64  o the caller and
1b580 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1b590 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62   the.** output b
1b5a0 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e  uffer undefined.
1b5b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1b5c0 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
1b5d0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
1b5e0 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
1b5f0 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
1b600 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1b610 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
1b620 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61  Dest, 0, N);.  a
1b630 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1b640 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
1b650 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
1b660 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
1b670 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
1b680 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65  ed by btree imme
1b690 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63 72  diately after cr
1b6a0 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  eating.  ** the 
1b6b0 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54  Pager object.  T
1b6c0 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65  here has not bee
1b6d0 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  n an opportunity
1b6e0 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20   to transition. 
1b6f0 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20   ** to WAL mode 
1b700 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  yet..  */.  asse
1b710 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
1b720 28 70 50 61 67 65 72 29 20 29 3b 0a 23 69 66 20  (pPager) );.#if 
1b730 30 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  0.  if( pagerUse
1b740 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
1b750 20 20 20 69 6e 74 20 69 73 49 6e 57 61 6c 20 3d     int isInWal =
1b760 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
1b770 69 74 65 33 57 61 6c 52 65 61 64 28 70 50 61 67  ite3WalRead(pPag
1b780 65 72 2d 3e 70 57 61 6c 2c 20 31 2c 20 26 69 73  er->pWal, 1, &is
1b790 49 6e 57 61 6c 2c 20 4e 2c 20 70 44 65 73 74 29  InWal, N, pDest)
1b7a0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1b7b0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 49 6e 57  LITE_OK || isInW
1b7c0 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  al ){.      retu
1b7d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
1b7e0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 69  .#endif..  if( i
1b7f0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1b800 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  ) ){.    IOTRACE
1b810 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64  (("DBHDR %p 0 %d
1b820 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29  \n", pPager, N))
1b830 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1b840 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
1b850 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29  fd, pDest, N, 0)
1b860 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1b870 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1b880 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
1b890 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1b8a0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1b8b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1b8c0 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
1b8d0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1b8e0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1b8f0 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  file associated 
1b900 0a 2a 2a 20 77 69 74 68 20 70 50 61 67 65 72 2e  .** with pPager.
1b910 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20   Normally, this 
1b920 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73  is calculated as
1b930 20 28 3c 64 62 20 66 69 6c 65 20 73 69 7a 65 3e   (<db file size>
1b940 2f 3c 70 61 67 65 2d 73 69 7a 65 3e 29 2e 0a 2a  /<page-size>)..*
1b950 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  * However, if th
1b960 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65  e file is betwee
1b970 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69  n 1 and <page-si
1b980 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ze> bytes in siz
1b990 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73  e, then .** this
1b9a0 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
1b9b0 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2a   1 page file..**
1b9c0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
1b9d0 20 69 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61   is in error sta
1b9e0 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
1b9f0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
1ba00 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 65 72 72   then the.** err
1ba10 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
1ba20 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
1ba30 61 6e 64 20 2a 70 6e 50 61 67 65 20 6c 65 66 74  and *pnPage left
1ba40 20 75 6e 63 68 61 6e 67 65 64 2e 20 4f 72 2c 0a   unchanged. Or,.
1ba50 2a 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 73  ** if the file s
1ba60 79 73 74 65 6d 20 68 61 73 20 74 6f 20 62 65 20  ystem has to be 
1ba70 71 75 65 72 69 65 64 20 66 6f 72 20 74 68 65 20  queried for the 
1ba80 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1ba90 20 61 6e 64 0a 2a 2a 20 74 68 65 20 71 75 65 72   and.** the quer
1baa0 79 20 61 74 74 65 6d 70 74 20 72 65 74 75 72 6e  y attempt return
1bab0 73 20 61 6e 20 49 4f 20 65 72 72 6f 72 2c 20 74  s an IO error, t
1bac0 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
1bad0 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
1bae0 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c  and *pnPage is l
1baf0 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
1bb00 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1bb10 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
1bb20 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65   successful, the
1bb30 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  n SQLITE_OK is r
1bb40 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a  eturned.** and *
1bb50 70 6e 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  pnPage is set to
1bb60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1bb70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
1bb80 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  base..*/.int sql
1bb90 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1bba0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
1bbb0 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a  , int *pnPage){.
1bbc0 20 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30    Pgno nPage = 0
1bbd0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  ;           /* V
1bbe0 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76  alue to return v
1bbf0 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20  ia *pnPage */.. 
1bc00 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68   /* Determine th
1bc10 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1bc20 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 53  s in the file. S
1bc30 74 6f 72 65 20 74 68 69 73 20 69 6e 20 6e 50 61  tore this in nPa
1bc40 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ge. */.  if( pPa
1bc50 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
1bc60 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20   ){.    nPage = 
1bc70 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
1bc80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1bc90 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1bca0 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 72 65       /* Error re
1bcb0 74 75 72 6e 65 64 20 62 79 20 4f 73 46 69 6c 65  turned by OsFile
1bcc0 53 69 7a 65 28 29 20 2a 2f 0a 20 20 20 20 69 36  Size() */.    i6
1bcd0 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  4 n = 0;        
1bce0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 73 69        /* File si
1bcf0 7a 65 20 69 6e 20 62 79 74 65 73 20 72 65 74 75  ze in bytes retu
1bd00 72 6e 65 64 20 62 79 20 4f 73 46 69 6c 65 53 69  rned by OsFileSi
1bd10 7a 65 28 29 20 2a 2f 0a 0a 20 20 20 20 69 66 28  ze() */..    if(
1bd20 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1bd30 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e  ger) && pPager->
1bd40 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
1bd50 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  OCK ){.      sql
1bd60 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70 50  ite3WalDbsize(pP
1bd70 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 6e 50 61  ager->pWal, &nPa
1bd80 67 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ge);.    }..    
1bd90 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a  if( nPage==0 ){.
1bda0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
1bdb0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1bdc0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
1bdd0 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 69 66  File );.      if
1bde0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1bdf0 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >fd) ){.        
1be00 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
1be10 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1be20 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
1be30 64 2c 20 26 6e 29 29 20 29 7b 0a 20 20 20 20 20  d, &n)) ){.     
1be40 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
1be50 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
1be60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1be70 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
1be80 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
1be90 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e  >0 && n<pPager->
1bea0 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
1beb0 20 20 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20      nPage = 1;. 
1bec0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1bed0 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e      nPage = (Pgn
1bee0 6f 29 28 6e 20 2f 20 70 50 61 67 65 72 2d 3e 70  o)(n / pPager->p
1bef0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1bf00 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1bf10 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
1bf20 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
1bf30 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
1bf40 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
1bf50 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
1bf60 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  eSize = nPage;. 
1bf70 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
1bf80 69 7a 65 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  izeValid = 1;.  
1bf90 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
1bfa0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d   the current num
1bfb0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1bfc0 74 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61  the file is grea
1bfd0 74 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ter than the .  
1bfe0 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61  ** configured ma
1bff0 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62  ximum pager numb
1c000 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  er, increase the
1c010 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73   allowed limit s
1c020 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  o.  ** that the 
1c030 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64  file can be read
1c040 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61  ..  */.  if( nPa
1c050 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  ge>pPager->mxPgn
1c060 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
1c070 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29  >mxPgno = (Pgno)
1c080 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  nPage;.  }..  /*
1c090 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   Set the output 
1c0a0 76 61 72 69 61 62 6c 65 20 61 6e 64 20 72 65 74  variable and ret
1c0b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 2a 2f  urn SQLITE_OK */
1c0c0 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61  .  *pnPage = nPa
1c0d0 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ge;.  return SQL
1c0e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
1c0f0 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
1c100 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c  a lock of type l
1c110 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64  ocktype on the d
1c120 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
1c130 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72  .** a similar or
1c140 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
1c150 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74   already held, t
1c160 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1c170 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75  a no-op.** (retu
1c180 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20  rning SQLITE_OK 
1c190 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a  immediately)..**
1c1a0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
1c1b0 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e  ttempt to obtain
1c1c0 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
1c1d0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e  sqlite3OsLock().
1c1e0 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20   Invoke .** the 
1c1f0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
1c200 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72   the lock is cur
1c210 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c  rently not avail
1c220 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a  able. Repeat .**
1c230 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
1c240 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
1c250 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
1c260 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a  the attempt to .
1c270 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  ** obtain the lo
1c280 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
1c290 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
1c2a0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
1c2b0 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
1c2c0 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
1c2d0 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
1c2e0 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  . If the lock is
1c2f0 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73   obtained succes
1c300 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20  sfully, set the 
1c310 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20  Pager.state .** 
1c320 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  variable to lock
1c330 74 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75  type before retu
1c340 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
1c350 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
1c360 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
1c370 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
1c380 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ype){.  int rc; 
1c390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c3b0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
1c3c0 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b    /* The OS lock
1c3d0 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
1c3e0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
1c3f0 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65  Pager lock value
1c400 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50  s */.  assert( P
1c410 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41  AGER_SHARED==SHA
1c420 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
1c430 73 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45  sert( PAGER_RESE
1c440 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c  RVED==RESERVED_L
1c450 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
1c460 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
1c470 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
1c480 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
1c490 20 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74   file is current
1c4a0 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e  ly unlocked then
1c4b0 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62   the size must b
1c4c0 65 20 75 6e 6b 6e 6f 77 6e 2e 20 49 74 0a 20 20  e unknown. It.  
1c4d0 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 68 61 76 65  ** must not have
1c4e0 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61   been modified a
1c4f0 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20  t this point..  
1c500 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
1c510 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1c520 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67  R_SHARED || pPag
1c530 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d  er->dbSizeValid=
1c540 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1c550 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1c560 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70  AGER_SHARED || p
1c570 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
1c580 64 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  d==0 );..  /* Ch
1c590 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73  eck that this is
1c5a0 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20   either a no-op 
1c5b0 28 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71  (because the req
1c5c0 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a  uested lock is .
1c5d0 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c    ** already hel
1c5e0 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  d, or one of the
1c5f0 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68   transistions th
1c600 61 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  at the busy-hand
1c610 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  ler.  ** may be 
1c620 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20  invoked during, 
1c630 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
1c640 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20   comment above. 
1c650 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
1c660 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29  SetBusyhandler()
1c670 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1c680 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e   (pPager->state>
1c690 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20  =locktype).     
1c6a0 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73 74    || (pPager->st
1c6b0 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
1c6c0 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50  K && locktype==P
1c6d0 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20  AGER_SHARED).   
1c6e0 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
1c6f0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
1c700 45 52 56 45 44 20 26 26 20 6c 6f 63 6b 74 79 70  ERVED && locktyp
1c710 65 3d 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e==PAGER_EXCLUSI
1c720 56 45 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20  VE).  );..  if( 
1c730 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c  pPager->state>=l
1c740 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
1c750 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1c760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b   }else{.    do {
1c770 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1c780 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
1c790 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b  ->fd, locktype);
1c7a0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
1c7b0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
1c7c0 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
1c7d0 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
1c7e0 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b  syHandlerArg) );
1c7f0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1c800 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c810 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1c820 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  (u8)locktype;.  
1c830 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f      IOTRACE(("LO
1c840 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
1c850 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a  ger, locktype)).
1c860 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1c870 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1c880 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54  Function assertT
1c890 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
1c8a0 74 28 70 50 61 67 65 72 29 20 63 68 65 63 6b 73  t(pPager) checks
1c8b0 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
1c8c0 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   .** following i
1c8d0 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64  s true for all d
1c8e0 69 72 74 79 20 70 61 67 65 73 20 63 75 72 72 65  irty pages curre
1c8f0 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65  ntly in the page
1c900 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  -cache:.**.**   
1c910 61 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  a) The page numb
1c920 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  er is less than 
1c930 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
1c940 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  size of the .** 
1c950 20 20 20 20 20 63 75 72 72 65 6e 74 20 64 61 74       current dat
1c960 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20  abase image, in 
1c970 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20  pages, OR.**.** 
1c980 20 20 62 29 20 69 66 20 74 68 65 20 70 61 67 65    b) if the page
1c990 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72   content were wr
1c9a0 69 74 74 65 6e 20 61 74 20 74 68 69 73 20 74 69  itten at this ti
1c9b0 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74  me, it would not
1c9c0 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65  .**      be nece
1c9d0 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74  ssary to write t
1c9e0 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
1c9f0 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75  nt out to the su
1ca00 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  b-journal.**    
1ca10 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64    (as determined
1ca20 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62   by function sub
1ca30 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29 29  jRequiresPage())
1ca40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
1ca50 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65  ondition asserte
1ca60 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
1ca70 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65  on were not true
1ca80 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72  , and the.** dir
1ca90 74 79 20 70 61 67 65 20 77 65 72 65 20 74 6f 20  ty page were to 
1caa0 62 65 20 64 69 73 63 61 72 64 65 64 20 66 72 6f  be discarded fro
1cab0 6d 20 74 68 65 20 63 61 63 68 65 20 76 69 61 20  m the cache via 
1cac0 74 68 65 20 70 61 67 65 72 53 74 72 65 73 73 28  the pagerStress(
1cad0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61  ).** routine, pa
1cae0 67 65 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c  gerStress() woul
1caf0 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20  d not write the 
1cb00 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
1cb10 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64  tent to.** the d
1cb20 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
1cb30 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61   a savepoint tra
1cb40 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f  nsaction were ro
1cb50 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a  lled back after.
1cb60 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65 64  ** this happened
1cb70 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  , the correct be
1cb80 68 61 76 69 6f 75 72 20 77 6f 75 6c 64 20 62 65  haviour would be
1cb90 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
1cba0 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65  current.** conte
1cbb0 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  nt of the page. 
1cbc0 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74  However, since t
1cbd0 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  his content is n
1cbe0 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69  ot present in ei
1cbf0 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61  ther.** the data
1cc00 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65  base file or the
1cc10 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
1cc20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1cc30 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75   and .** sub-jou
1cc40 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b  rnal rolled back
1cc50 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75   the content cou
1cc60 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72  ld not be restor
1cc70 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61  ed and the.** da
1cc80 74 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75  tabase image wou
1cc90 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70  ld become corrup
1cca0 74 2e 20 49 74 20 69 73 20 74 68 65 72 65 66 6f  t. It is therefo
1ccb0 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61  re fortunate tha
1ccc0 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75  t .** this circu
1ccd0 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61  mstance cannot a
1cce0 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  rise..*/.#if def
1ccf0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
1cd00 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  G).static void a
1cd10 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
1cd20 73 74 72 61 69 6e 74 43 62 28 50 67 48 64 72 20  straintCb(PgHdr 
1cd30 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28  *pPg){.  assert(
1cd40 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
1cd50 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73  R_DIRTY );.  ass
1cd60 65 72 74 28 20 21 73 75 62 6a 52 65 71 75 69 72  ert( !subjRequir
1cd70 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70  esPage(pPg) || p
1cd80 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70  Pg->pgno<=pPg->p
1cd90 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b  Pager->dbSize );
1cda0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  .}.static void a
1cdb0 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
1cdc0 73 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70  straint(Pager *p
1cdd0 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
1cde0 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69  3PcacheIterateDi
1cdf0 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
1ce00 63 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63  che, assertTrunc
1ce10 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29  ateConstraintCb)
1ce20 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
1ce30 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  ne assertTruncat
1ce40 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
1ce50 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  er).#endif../*.*
1ce60 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 69  * Truncate the i
1ce70 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1ce80 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20  e file image to 
1ce90 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 69  nPage pages. Thi
1cea0 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64  s .** function d
1ceb0 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  oes not actually
1cec0 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
1ced0 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
1cee0 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73  k. It .** just s
1cef0 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ets the internal
1cf00 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
1cf10 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68  ger object so th
1cf20 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63  at the .** trunc
1cf30 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f  ation will be do
1cf40 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ne when the curr
1cf50 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1cf60 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f  is committed..*/
1cf70 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
1cf80 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
1cf90 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1cfa0 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73  gno nPage){.  as
1cfb0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
1cfc0 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 61  SizeValid );.  a
1cfd0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
1cfe0 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a  bSize>=nPage );.
1cff0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1d000 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
1d010 45 53 45 52 56 45 44 20 29 3b 0a 20 20 70 50 61  ESERVED );.  pPa
1d020 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
1d030 61 67 65 3b 0a 20 20 61 73 73 65 72 74 54 72 75  age;.  assertTru
1d040 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
1d050 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  pPager);.}.../*.
1d060 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1d070 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   is called befor
1d080 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68  e attempting a h
1d090 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1d0a0 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73  ack. It.** syncs
1d0b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1d0c0 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20  e to disk, then 
1d0d0 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75  sets pPager->jou
1d0e0 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a  rnalHdr to the.*
1d0f0 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * size of the jo
1d100 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68  urnal file so th
1d110 61 74 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61  at the pager_pla
1d120 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  yback() routine 
1d130 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68  knows.** that th
1d140 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
1d150 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73   file has been s
1d160 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e  ynced..**.** Syn
1d170 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  cing a hot-journ
1d180 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72  al to disk befor
1d190 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  e attempting to 
1d1a0 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73  roll it back ens
1d1b0 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66  ures .** that if
1d1c0 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65   a power-failure
1d1d0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
1d1e0 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  he rollback, the
1d1f0 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a   process that.**
1d200 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61   attempts rollba
1d210 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73  ck following sys
1d220 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65  tem recovery see
1d230 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e  s the same journ
1d240 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73  al.** content as
1d250 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a   this process..*
1d260 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
1d270 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e  ng goes as plann
1d280 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ed, SQLITE_OK is
1d290 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
1d2a0 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c  wise, .** an SQL
1d2b0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
1d2c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1d2d0 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
1d2e0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
1d2f0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1d300 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70  ITE_OK;.  if( !p
1d310 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
1d320 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1d330 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
1d340 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
1d350 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20  _NORMAL);.  }.  
1d360 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d370 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1d380 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
1d390 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
1d3a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1d3b0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1d3c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  rc;.}../*.** Shu
1d3d0 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
1d3e0 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
1d3f0 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
1d400 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
1d410 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
1d420 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
1d430 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
1d440 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
1d450 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
1d460 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
1d470 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
1d480 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
1d490 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
1d4a0 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
1d4b0 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
1d4c0 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
1d4d0 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
1d4e0 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
1d4f0 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
1d500 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1d510 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
1d520 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
1d530 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  redump..**.** Th
1d540 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
1d550 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20  ys succeeds. If 
1d560 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1d570 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d   active an attem
1d580 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f  pt.** is made to
1d590 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49   roll it back. I
1d5a0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1d5b0 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
1d5c0 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20  lback .** a hot 
1d5d0 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c  journal may be l
1d5e0 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73  eft in the files
1d5f0 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72  ystem but no err
1d600 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  or is returned.*
1d610 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  * to the caller.
1d620 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1d630 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20  agerClose(Pager 
1d640 2a 70 50 61 67 65 72 29 7b 0a 20 20 75 38 20 2a  *pPager){.  u8 *
1d650 70 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50 61  pTmp = (u8 *)pPa
1d660 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
1d670 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
1d680 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
1d690 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
1d6a0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
1d6b0 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
1d6c0 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
1d6d0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
1d6e0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
1d6f0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71  TE_OMIT_WAL.  sq
1d700 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50  lite3WalClose(pP
1d710 61 67 65 72 2d 3e 70 57 61 6c 2c 0a 20 20 20 20  ager->pWal,.    
1d720 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  (pPager->noSync 
1d730 3f 20 30 20 3a 20 70 50 61 67 65 72 2d 3e 73 79  ? 0 : pPager->sy
1d740 6e 63 5f 66 6c 61 67 73 29 2c 20 0a 20 20 20 20  nc_flags), .    
1d750 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1d760 2c 20 70 54 6d 70 0a 20 20 29 3b 0a 20 20 70 50  , pTmp.  );.  pP
1d770 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a  ager->pWal = 0;.
1d780 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72  #endif.  pager_r
1d790 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1d7a0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1d7b0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
1d7c0 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
1d7d0 20 20 20 20 2f 2a 20 53 65 74 20 50 61 67 65 72      /* Set Pager
1d7e0 2e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 2d  .journalHdr to -
1d7f0 31 20 66 6f 72 20 74 68 65 20 62 65 6e 65 66 69  1 for the benefi
1d800 74 20 6f 66 20 74 68 65 20 70 61 67 65 72 5f 70  t of the pager_p
1d810 6c 61 79 62 61 63 6b 28 29 20 0a 20 20 20 20 2a  layback() .    *
1d820 2a 20 63 61 6c 6c 20 77 68 69 63 68 20 6d 61 79  * call which may
1d830 20 62 65 20 6d 61 64 65 20 66 72 6f 6d 20 77 69   be made from wi
1d840 74 68 69 6e 20 70 61 67 65 72 55 6e 6c 6f 63 6b  thin pagerUnlock
1d850 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 49  AndRollback(). I
1d860 66 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e  f it.    ** is n
1d870 6f 74 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20  ot -1, then the 
1d880 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
1d890 20 6f 66 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72   of an open jour
1d8a0 6e 61 6c 20 66 69 6c 65 20 6d 61 79 0a 20 20 20  nal file may.   
1d8b0 20 2a 2a 20 62 65 20 70 6c 61 79 65 64 20 62 61   ** be played ba
1d8c0 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
1d8d0 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72  base. If a power
1d8e0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
1d8f0 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69  while.    ** thi
1d900 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20  s is happening, 
1d910 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79  the database may
1d920 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e   become corrupt.
1d930 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1d940 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
1d950 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61  fd) ){.      pPa
1d960 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70  ger->errCode = p
1d970 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
1d980 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
1d990 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  }.    pagerUnloc
1d9a0 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
1d9b0 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
1d9c0 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
1d9d0 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73  oc();.  enable_s
1d9e0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
1d9f0 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41  rs();.  PAGERTRA
1da00 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE(("CLOSE %d\n"
1da10 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1da20 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  )));.  IOTRACE((
1da30 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
1da40 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33  ager)).  sqlite3
1da50 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
1da60 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  fd);.  sqlite3Pa
1da70 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20  geFree(pTmp);.  
1da80 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f  sqlite3PcacheClo
1da90 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  se(pPager->pPCac
1daa0 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  he);..#ifdef SQL
1dab0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
1dac0 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
1dad0 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d  ecFree ) pPager-
1dae0 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67  >xCodecFree(pPag
1daf0 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e  er->pCodec);.#en
1db00 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21  dif..  assert( !
1db10 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
1db20 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70  nt && !pPager->p
1db30 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  InJournal );.  a
1db40 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
1db50 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21  Pager->jfd) && !
1db60 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
1db70 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74  jfd) );..  sqlit
1db80 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
1db90 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1dba0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  _OK;.}..#if !def
1dbb0 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
1dbc0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1dbd0 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
1dbe0 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
1dbf0 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  r for page pPg..
1dc00 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50  */.Pgno sqlite3P
1dc10 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44  agerPagenumber(D
1dc20 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
1dc30 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b  eturn pPg->pgno;
1dc40 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1dc50 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
1dc60 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
1dc70 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
1dc80 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
1dc90 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
1dca0 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
1dcb0 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f  heRef(pPg);.}../
1dcc0 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
1dcd0 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20  urnal. In other 
1dce0 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
1dcf0 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
1dd00 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
1dd10 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1dd20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
1dd30 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
1dd40 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
1dd50 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e  .** disk and can
1dd60 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20   be restored in 
1dd70 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68  the event of a h
1dd80 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1dd90 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
1dda0 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
1ddb0 20 66 6c 61 67 20 69 73 20 6e 6f 74 20 73 65 74   flag is not set
1ddc0 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
1ddd0 74 69 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d  tion is a.** no-
1dde0 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  op. Otherwise, t
1ddf0 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69  he actions requi
1de00 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68  red depend on th
1de10 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 0a 2a  e journal-mode.*
1de20 2a 20 61 6e 64 20 74 68 65 20 64 65 76 69 63 65  * and the device
1de30 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
1de40 20 6f 66 20 74 68 65 20 74 68 65 20 66 69 6c 65   of the the file
1de50 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c  -system, as foll
1de60 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ows:.**.**   * I
1de70 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1de80 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  le is an in-memo
1de90 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ry journal file,
1dea0 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a   no action need.
1deb0 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e  **     be taken.
1dec0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72  .**.**   * Other
1ded0 77 69 73 65 2c 20 69 66 20 74 68 65 20 64 65 76  wise, if the dev
1dee0 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
1def0 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41 50  port the SAFE_AP
1df00 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a  PEND property,.*
1df10 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e  *     then the n
1df20 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65  Rec field of the
1df30 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77   most recently w
1df40 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68  ritten journal h
1df50 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20  eader.**     is 
1df60 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61  updated to conta
1df70 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  in the number of
1df80 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73   journal records
1df90 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20   that have.**   
1dfa0 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66    been written f
1dfb0 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20  ollowing it. If 
1dfc0 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 70 65  the pager is ope
1dfd0 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73  rating in full-s
1dfe0 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c  ync.**     mode,
1dff0 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
1e000 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  l file is synced
1e010 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 69 65   before this fie
1e020 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a  ld is updated..*
1e030 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
1e040 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20  device does not 
1e050 73 75 70 70 6f 72 74 20 74 68 65 20 53 45 51 55  support the SEQU
1e060 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c  ENTIAL property,
1e070 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f   then .**     jo
1e080 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79  urnal file is sy
1e090 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  nced..**.** Or, 
1e0a0 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a  in pseudo-code:.
1e0b0 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20  **.**   if( NOT 
1e0c0 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e  <in-memory journ
1e0d0 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66  al> ){.**     if
1e0e0 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e  ( NOT SAFE_APPEN
1e0f0 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66  D ){.**       if
1e100 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  ( <full-sync mod
1e110 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72  e> ) xSync(<jour
1e120 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20  nal file>);.**  
1e130 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65       <update nRe
1e140 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20  c field>.**     
1e150 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f  } .**     if( NO
1e160 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78  T SEQUENTIAL ) x
1e170 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
1e180 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a  le>);.**   }.**.
1e190 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 6e 65 65  ** The Pager.nee
1e1a0 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 65  dSync flag is ne
1e1b0 76 65 72 20 62 65 20 73 65 74 20 66 6f 72 20 74  ver be set for t
1e1c0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20  emporary files, 
1e1d0 6f 72 20 61 6e 79 0a 2a 2a 20 66 69 6c 65 20 6f  or any.** file o
1e1e0 70 65 72 61 74 69 6e 67 20 69 6e 20 6e 6f 2d 73  perating in no-s
1e1f0 79 6e 63 20 6d 6f 64 65 20 28 50 61 67 65 72 2e  ync mode (Pager.
1e200 6e 6f 53 79 6e 63 20 73 65 74 20 74 6f 20 6e 6f  noSync set to no
1e210 6e 2d 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49  n-zero)..**.** I
1e220 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  f successful, th
1e230 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72  is routine clear
1e240 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  s the PGHDR_NEED
1e250 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76  _SYNC flag of ev
1e260 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72  ery .** page cur
1e270 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d  rently held in m
1e280 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74  emory before ret
1e290 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b  urning SQLITE_OK
1e2a0 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  . If an IO.** er
1e2b0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
1e2c0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  ed, then the IO 
1e2d0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1e2e0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
1e2f0 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
1e300 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
1e310 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1e320 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65    if( pPager->ne
1e330 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  edSync ){.    as
1e340 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
1e350 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
1e360 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
1e370 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
1e380 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
1e390 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
1e3a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e3c0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1e3d0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
1e3e0 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
1e3f0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1e400 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
1e410 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e420 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1e430 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69  jfd) );..      i
1e440 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
1e450 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
1e460 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
1e470 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65  /* This block de
1e480 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63  als with an obsc
1e490 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20  ure problem. If 
1e4a0 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74  the last connect
1e4b0 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ion.        ** t
1e4c0 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69  hat wrote to thi
1e4d0 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f  s database was o
1e4e0 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73  perating in pers
1e4f0 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20  istent-journal. 
1e500 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20         ** mode, 
1e510 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1e520 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69   file may at thi
1e530 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79  s point actually
1e540 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20   be larger.     
1e550 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
1e560 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65  .journalOff byte
1e570 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74  s. If the next t
1e580 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72  hing in the jour
1e590 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  nal.        ** f
1e5a0 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  ile happens to b
1e5b0 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  e a journal-head
1e5c0 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70  er (written as p
1e5d0 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20  art of the.     
1e5e0 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63     ** previous c
1e5f0 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e  onnection's tran
1e600 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20  saction), and a 
1e610 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66  crash or power-f
1e620 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20  ailure .        
1e630 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20  ** occurs after 
1e640 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
1e650 62 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20  but before this 
1e660 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65  connection write
1e670 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  s .        ** an
1e680 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74  ything else to t
1e690 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1e6a0 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c  (or commits/roll
1e6b0 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20  s back its .    
1e6c0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1e6d0 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65  on), then SQLite
1e6e0 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66   may become conf
1e6f0 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20  used when doing 
1e700 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
1e710 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
1e720 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72  back following r
1e730 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20  ecovery. It may 
1e740 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20  roll back all.  
1e750 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73        ** of this
1e760 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74   connections dat
1e770 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20  a, then proceed 
1e780 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  to rolling back 
1e790 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20  the old,.       
1e7a0 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20   ** out-of-date 
1e7b0 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77  data that follow
1e7c0 73 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63  s it. Database c
1e7d0 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20  orruption..     
1e7e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
1e7f0 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
1e800 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75  this, if the jou
1e810 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61  rnal file does a
1e820 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e  ppear to contain
1e830 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61  .        ** a va
1e840 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f  lid header follo
1e850 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e  wing Pager.journ
1e860 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74  alOff, then writ
1e870 65 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20  e a 0x00.       
1e880 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20   ** byte to the 
1e890 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70  start of it to p
1e8a0 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62  revent it from b
1e8b0 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e  eing recognized.
1e8c0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1e8d0 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20      ** Variable 
1e8e0 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69  iNextHdrOffset i
1e8f0 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66  s set to the off
1e900 73 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69  set at which thi
1e910 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  s.        ** pro
1e920 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20  blematic header 
1e930 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69  will occur, if i
1e940 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63  t exists. aMagic
1e950 20 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20   is used .      
1e960 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72    ** as a tempor
1e970 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e  ary buffer to in
1e980 73 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20  spect the first 
1e990 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20  couple of bytes 
1e9a0 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  of.        ** th
1e9b0 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72  e potential jour
1e9c0 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20  nal header..    
1e9d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1e9e0 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  64 iNextHdrOffse
1e9f0 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d  t;.        u8 aM
1ea00 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20  agic[8];.       
1ea10 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65   u8 zHeader[size
1ea20 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
1ea30 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d  )+4];..        m
1ea40 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
1ea50 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
1ea60 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
1ea70 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75  ic));.        pu
1ea80 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
1ea90 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
1eaa0 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d  Magic)], pPager-
1eab0 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20  >nRec);..       
1eac0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20   iNextHdrOffset 
1ead0 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
1eae0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
1eaf0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1eb00 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
1eb10 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69  fd, aMagic, 8, i
1eb20 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a  NextHdrOffset);.
1eb30 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1eb40 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d  SQLITE_OK && 0==
1eb50 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
1eb60 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
1eb70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
1eb80 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65  atic const u8 ze
1eb90 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20  robyte = 0;.    
1eba0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1ebb0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
1ebc0 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65  ->jfd, &zerobyte
1ebd0 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66  , 1, iNextHdrOff
1ebe0 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  set);.        }.
1ebf0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1ec00 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
1ec10 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
1ec20 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
1ec30 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1ec40 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1ec50 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
1ec60 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f   nRec value into
1ec70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1ec80 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a  e header. If in.
1ec90 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d          ** full-
1eca0 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
1ecb0 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
1ecc0 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65  al first. This e
1ecd0 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20  nsures that.    
1ece0 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20      ** all data 
1ecf0 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74  has really hit t
1ed00 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e  he disk before n
1ed10 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74  Rec is updated t
1ed20 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a  o mark.        *
1ed30 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64  * it as a candid
1ed40 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  ate for rollback
1ed50 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
1ed60 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
1ed70 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20  not required if 
1ed80 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d  the persistent m
1ed90 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68  edia supports th
1eda0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46  e.        ** SAF
1edb0 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74  E_APPEND propert
1edc0 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68  y. Because in th
1edd0 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f  is case it is no
1ede0 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20  t possible .    
1edf0 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61      ** for garba
1ee00 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70  ge data to be ap
1ee10 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69  pended to the fi
1ee20 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65  le, the nRec fie
1ee30 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  ld.        ** is
1ee40 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
1ee50 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20  0xFFFFFFFF when 
1ee60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
1ee70 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20  er is written.  
1ee80 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76        ** and nev
1ee90 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  er needs to be u
1eea0 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20  pdated..        
1eeb0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
1eec0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
1eed0 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  && 0==(iDc&SQLIT
1eee0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
1eef0 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  AL) ){.         
1ef00 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59   PAGERTRACE(("SY
1ef10 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
1ef20 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1ef30 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ger)));.        
1ef40 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
1ef50 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
1ef60 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ).          rc =
1ef70 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
1ef80 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
1ef90 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
1efa0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1efb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1efc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1efd0 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52    }.        IOTR
1efe0 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
1eff0 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  ld\n", pPager, p
1f000 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1f010 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  r));.        rc 
1f020 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1f030 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
1f040 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
1f050 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64  er, sizeof(zHead
1f060 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  er), pPager->jou
1f070 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20  rnalHdr.        
1f080 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1f090 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1f0a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1f0b0 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  }.      if( 0==(
1f0c0 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
1f0d0 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
1f0e0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1f0f0 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
1f100 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
1f110 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
1f120 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
1f130 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
1f140 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72  ager)).        r
1f150 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
1f160 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
1f170 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
1f180 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  s| .          (p
1f190 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
1f1a0 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  s==SQLITE_SYNC_F
1f1b0 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ULL?SQLITE_SYNC_
1f1c0 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20  DATAONLY:0).    
1f1d0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1f1e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f1f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1f200 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1f210 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
1f220 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 73 75  file was just su
1f230 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65  ccessfully synce
1f240 64 2e 20 53 65 74 20 50 61 67 65 72 2e 6e 65 65  d. Set Pager.nee
1f250 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 74 6f  dSync .    ** to
1f260 20 7a 65 72 6f 20 61 6e 64 20 63 6c 65 61 72 20   zero and clear 
1f270 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
1f280 59 4e 43 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20  YNC flag on all 
1f290 70 61 67 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20  pagess..    */. 
1f2a0 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
1f2b0 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ync = 0;.    pPa
1f2c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
1f2d0 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ted = 1;.    pPa
1f2e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
1f2f0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
1f300 6c 4f 66 66 3b 0a 20 20 20 20 73 71 6c 69 74 65  lOff;.    sqlite
1f310 33 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63  3PcacheClearSync
1f320 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50  Flags(pPager->pP
1f330 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 72  Cache);.  }..  r
1f340 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f350 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
1f360 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  gument is the fi
1f370 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20  rst in a linked 
1f380 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  list of dirty pa
1f390 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a  ges connected.**
1f3a0 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
1f3b0 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68  irty pointer. Th
1f3c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  is function writ
1f3d0 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74  es each one of t
1f3e0 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  he.** in-memory 
1f3f0 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73  pages in the lis
1f400 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
1f410 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75  e file. The argu
1f420 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e  ment may.** be N
1f430 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e  ULL, representin
1f440 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e  g an empty list.
1f450 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
1f460 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a  is function is.*
1f470 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  * a no-op..**.**
1f480 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20   The pager must 
1f490 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20  hold at least a 
1f4a0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68  RESERVED lock wh
1f4b0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1f4c0 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42  .** is called. B
1f4d0 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e  efore writing an
1f4e0 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  ything to the da
1f4f0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
1f500 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67  s lock.** is upg
1f510 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c  raded to an EXCL
1f520 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74  USIVE lock. If t
1f530 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  he lock cannot b
1f540 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53  e obtained,.** S
1f550 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
1f560 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61  turned and no da
1f570 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
1f580 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f590 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  le..** .** If th
1f5a0 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d  e pager is a tem
1f5b0 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64  p-file pager and
1f5c0 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   the actual file
1f5d0 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20  -system file.** 
1f5e0 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c  is not yet open,
1f5f0 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61   it is created a
1f600 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  nd opened before
1f610 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a   any data is .**
1f620 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a   written out..**
1f630 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63  .** Once the loc
1f640 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61  k has been upgra
1f650 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65  ded and, if nece
1f660 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20  ssary, the file 
1f670 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70  opened,.** the p
1f680 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e  ages are written
1f690 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
1f6a0 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73  base file in lis
1f6b0 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67  t order. Writing
1f6c0 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b  .** a page is sk
1f6d0 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74  ipped if it meet
1f6e0 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  s either of the 
1f6f0 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
1f700 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ia:.**.**   * Th
1f710 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
1f720 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61   greater than Pa
1f730 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a  ger.dbSize, or.*
1f740 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f  *   * The PGHDR_
1f750 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20  DONT_WRITE flag 
1f760 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61  is set on the pa
1f770 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69  ge..**.** If wri
1f780 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20  ting out a page 
1f790 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62  causes the datab
1f7a0 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77  ase file to grow
1f7b0 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  , Pager.dbFileSi
1f7c0 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64  ze.** is updated
1f7d0 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66   accordingly. If
1f7e0 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74   page 1 is writt
1f7f0 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65  en out, then the
1f800 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a   value cached.**
1f810 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65   in Pager.dbFile
1f820 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65  Vers[] is update
1f830 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e  d to match the n
1f840 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ew value stored 
1f850 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  in.** the databa
1f860 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
1f870 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
1f880 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
1f890 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1f8a0 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
1f8b0 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e  r .** occurs, an
1f8c0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
1f8d0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20  s returned. Or, 
1f8e0 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  if the EXCLUSIVE
1f8f0 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20   lock cannot.** 
1f900 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c  be obtained, SQL
1f910 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
1f920 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1f930 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
1f940 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a  pagelist(PgHdr *
1f950 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20  pList){.  Pager 
1f960 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20  *pPager;        
1f970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f980 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
1f990 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1f9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1f9c0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66  rn code */..  if
1f9d0 28 20 4e 45 56 45 52 28 70 4c 69 73 74 3d 3d 30  ( NEVER(pList==0
1f9e0 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
1f9f0 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d  E_OK;.  pPager =
1fa00 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a   pList->pPager;.
1fa10 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
1fa20 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65  int there may be
1fa30 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56   either a RESERV
1fa40 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
1fa50 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
1fa60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1fa70 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
1fa80 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ady an EXCLUSIVE
1fa90 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f   lock, the follo
1faa0 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 20 69  wing.  ** call i
1fab0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a  s a no-op..  **.
1fac0 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20    ** Moving the 
1fad0 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56  lock from RESERV
1fae0 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20  ED to EXCLUSIVE 
1faf0 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65  actually involve
1fb00 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72  s going.  ** thr
1fb10 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64  ough an intermed
1fb20 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49  iate state PENDI
1fb30 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20  NG.   A PENDING 
1fb40 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65  lock prevents ne
1fb50 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66  w.  ** readers f
1fb60 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f  rom attaching to
1fb70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75   the database bu
1fb80 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e  t is unsufficien
1fb90 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a  t for us to.  **
1fba0 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65   write.  The ide
1fbb0 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c  a of a PENDING l
1fbc0 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e  ock is to preven
1fbd0 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72  t new readers fr
1fbe0 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69  om.  ** coming i
1fbf0 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20  n while we wait 
1fc00 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61  for existing rea
1fc10 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20  ders to clear.. 
1fc20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74   **.  ** While t
1fc30 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
1fc40 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74  he RESERVED stat
1fc50 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  e, the original 
1fc60 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
1fc70 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  ** is unchanged 
1fc80 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62  and we can rollb
1fc90 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
1fca0 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74  ng to playback t
1fcb0 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
1fcc0 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
1fcd0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  l database file.
1fce0 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69    Once we transi
1fcf0 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43  tion to.  ** EXC
1fd00 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73  LUSIVE, it means
1fd10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1fd20 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e  le has been chan
1fd30 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c  ged and any roll
1fd40 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72  back.  ** will r
1fd50 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c  equire a journal
1fd60 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a   playback..  */.
1fd70 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
1fd80 55 73 65 57 61 6c 28 70 4c 69 73 74 2d 3e 70 50  UseWal(pList->pP
1fd90 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
1fda0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1fdb0 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
1fdc0 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72   );.  rc = pager
1fdd0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
1fde0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
1fdf0 4c 4f 43 4b 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  LOCK);..  /* If 
1fe00 74 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65  the file is a te
1fe10 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  mp-file has not 
1fe20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
1fe30 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74   open it now. It
1fe40 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73  .  ** is not pos
1fe50 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20  sible for rc to 
1fe60 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  be other than SQ
1fe70 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20  LITE_OK if this 
1fe80 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74  branch.  ** is t
1fe90 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77  aken, as pager_w
1fea0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73  ait_on_lock() is
1feb0 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d   a no-op for tem
1fec0 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20  p-files..  */.  
1fed0 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
1fee0 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
1fef0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
1ff00 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53  empFile && rc==S
1ff10 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
1ff20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65  rc = pagerOpente
1ff30 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  mp(pPager, pPage
1ff40 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76  r->fd, pPager->v
1ff50 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20  fsFlags);.  }.. 
1ff60 20 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66   /* Before the f
1ff70 69 72 73 74 20 77 72 69 74 65 2c 20 67 69 76 65  irst write, give
1ff80 20 74 68 65 20 56 46 53 20 61 20 68 69 6e 74 20   the VFS a hint 
1ff90 6f 66 20 77 68 61 74 20 74 68 65 20 66 69 6e 61  of what the fina
1ffa0 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65  l.  ** file size
1ffb0 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20   will be..  */. 
1ffc0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
1ffd0 69 7a 65 20 3e 20 28 70 50 61 67 65 72 2d 3e 64  ize > (pPager->d
1ffe0 62 4f 72 69 67 53 69 7a 65 2b 31 29 20 26 26 20  bOrigSize+1) && 
1fff0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
20000 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  d) ){.    sqlite
20010 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d  3_int64 szFile =
20020 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
20030 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  e * (sqlite3_int
20040 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  64)pPager->dbSiz
20050 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  e;.    sqlite3Os
20060 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67  FileControl(pPag
20070 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
20080 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20  CNTL_SIZE_HINT, 
20090 26 73 7a 46 69 6c 65 29 3b 0a 20 20 7d 0a 0a 20  &szFile);.  }.. 
200a0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
200b0 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29  TE_OK && pList )
200c0 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20  {.    Pgno pgno 
200d0 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a  = pList->pgno;..
200e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
200f0 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20  are dirty pages 
20100 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
20110 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  e with page numb
20120 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20  ers greater.    
20130 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  ** than Pager.db
20140 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  Size, this means
20150 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
20160 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73  ncateImage() was
20170 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a   called to.    *
20180 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
20190 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61  smaller (presuma
201a0 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75  bly by auto-vacu
201b0 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74  um code). Do not
201c0 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e   write.    ** an
201d0 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20  y such pages to 
201e0 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  the file..    **
201f0 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f  .    ** Also, do
20200 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61   not write out a
20210 6e 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73  ny page that has
20220 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f   the PGHDR_DONT_
20230 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a  WRITE flag.    *
20240 2a 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71  * set (set by sq
20250 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
20260 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20  ite())..    */. 
20270 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61     if( pgno<=pPa
20280 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30  ger->dbSize && 0
20290 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26  ==(pList->flags&
202a0 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
202b0 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f  ) ){.      i64 o
202c0 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29  ffset = (pgno-1)
202d0 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
202e0 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66  geSize;   /* Off
202f0 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  set to write */.
20300 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
20310 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
20320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20330 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20       /* Data to 
20340 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20  write */    ..  
20350 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68      /* Encode th
20360 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
20370 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
20380 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c  r, pList->pData,
20390 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e   pgno, 6, return
203a0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70   SQLITE_NOMEM, p
203b0 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Data);..      /*
203c0 20 57 72 69 74 65 20 6f 75 74 20 74 68 65 20 70   Write out the p
203d0 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20  age data. */.   
203e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
203f0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
20400 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72  d, pData, pPager
20410 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
20420 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  et);..      /* I
20430 66 20 70 61 67 65 20 31 20 77 61 73 20 6a 75 73  f page 1 was jus
20440 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74  t written, updat
20450 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  e Pager.dbFileVe
20460 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20  rs to match.    
20470 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e    ** the value n
20480 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ow stored in the
20490 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
204a0 49 66 20 77 72 69 74 69 6e 67 20 74 68 69 73 20  If writing this 
204b0 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63  .      ** page c
204c0 61 75 73 65 64 20 74 68 65 20 64 61 74 61 62 61  aused the databa
204d0 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c  se file to grow,
204e0 20 75 70 64 61 74 65 20 64 62 46 69 6c 65 53 69   update dbFileSi
204f0 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ze. .      */.  
20500 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
20510 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
20520 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
20530 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34  eVers, &pData[24
20540 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ], sizeof(pPager
20550 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
20560 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
20570 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ( pgno>pPager->d
20580 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  bFileSize ){.   
20590 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
205a0 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a  ileSize = pgno;.
205b0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
205c0 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62 61 63  * Update any bac
205d0 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79  kup objects copy
205e0 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ing the contents
205f0 20 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e 20   of this pager. 
20600 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
20610 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
20620 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67  ger->pBackup, pg
20630 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e  no, (u8*)pList->
20640 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50  pData);..      P
20650 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4f 52  AGERTRACE(("STOR
20660 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  E %d page %d has
20670 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
20680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
20690 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
206a0 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
206b0 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20  hash(pList)));. 
206c0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50       IOTRACE(("P
206d0 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70  GOUT %p %d\n", p
206e0 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
206f0 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
20700 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
20710 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  itedb_count);.  
20720 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
20730 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a  Pager->nWrite);.
20740 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20750 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f   PAGERTRACE(("NO
20760 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
20770 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
20780 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ger), pgno));.  
20790 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
207a0 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
207b0 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73    pList->pageHas
207c0 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
207d0 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69  sh(pList);.#endi
207e0 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c  f.    pList = pL
207f0 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d  ist->pDirty;.  }
20800 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
20810 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
20820 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63   record of the c
20830 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
20840 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20  page pPg to the 
20850 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a  sub-journal. .**
20860 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65   It is the calle
20870 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  rs responsibilit
20880 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52 65 71  y to use subjReq
20890 75 69 72 65 73 50 61 67 65 28 29 20 74 6f 20 63  uiresPage() to c
208a0 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74  heck .** that it
208b0 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71 75 69   is really requi
208c0 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  red before calli
208d0 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
208e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
208f0 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62  ssful, set the b
20900 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
20910 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e   to pPg->pgno in
20920 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20   the bitvecs.** 
20930 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76  for all open sav
20940 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72  epoints before r
20950 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
20960 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
20970 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20  turns SQLITE_OK 
20980 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
20990 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20   successful, an 
209a0 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  IO.** error code
209b0 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
209c0 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
209d0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c  sub-journal fail
209e0 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45  s, or .** SQLITE
209f0 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c  _NOMEM if a mall
20a00 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73  oc fails while s
20a10 65 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20  etting a bit in 
20a20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62  a savepoint.** b
20a30 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  itvec..*/.static
20a40 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50   int subjournalP
20a50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
20a60 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
20a70 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
20a80 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
20a90 61 67 65 72 3b 0a 20 20 69 66 28 20 69 73 4f 70  ager;.  if( isOp
20aa0 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
20ab0 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 44   ){.    void *pD
20ac0 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
20ad0 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  ;.    i64 offset
20ae0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52   = pPager->nSubR
20af0 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
20b00 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 63 68 61  geSize);.    cha
20b10 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20 20  r *pData2;..    
20b20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
20b30 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
20b40 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   7, return SQLIT
20b50 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29  E_NOMEM, pData2)
20b60 3b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  ;.    PAGERTRACE
20b70 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  (("STMT-JOURNAL 
20b80 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
20b90 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
20ba0 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 0a  pPg->pgno));.  .
20bb0 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
20bc0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
20bd0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67  .         || pag
20be0 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20  eInJournal(pPg) 
20bf0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 67  .         || pPg
20c00 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
20c10 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 29  bOrigSize .    )
20c20 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65  ;.    rc = write
20c30 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73  32bits(pPager->s
20c40 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67  jfd, offset, pPg
20c50 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  ->pgno);.    if(
20c60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20c70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
20c80 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
20c90 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61 32  er->sjfd, pData2
20ca0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
20cb0 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20  ze, offset+4);. 
20cc0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
20cd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20ce0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62      pPager->nSub
20cf0 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  Rec++;.    asser
20d00 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  t( pPager->nSave
20d10 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72  point>0 );.    r
20d20 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69  c = addToSavepoi
20d30 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
20d40 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
20d50 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20d60 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20d70 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
20d80 62 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61  by the pcache la
20d90 79 65 72 20 77 68 65 6e 20 69 74 20 68 61 73 20  yer when it has 
20da0 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20  reached some.** 
20db0 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69  soft memory limi
20dc0 74 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67  t. The first arg
20dd0 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
20de0 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62  er to a Pager ob
20df0 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73  ject.** (cast as
20e00 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70   a void*). The p
20e10 61 67 65 72 20 69 73 20 61 6c 77 61 79 73 20 27  ager is always '
20e20 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20  purgeable' (not 
20e30 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  an in-memory.** 
20e40 64 61 74 61 62 61 73 65 29 2e 20 54 68 65 20 73  database). The s
20e50 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
20e60 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
20e70 20 61 20 70 61 67 65 20 74 68 61 74 20 69 73 20   a page that is 
20e80 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69  .** currently di
20e90 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f  rty but has no o
20ea0 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
20eb0 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a  ences. The page.
20ec0 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73 73  ** is always ass
20ed0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
20ee0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61   Pager object pa
20ef0 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
20f00 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  t .** argument..
20f10 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66  **.** The job of
20f20 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
20f30 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c  s to make pPg cl
20f40 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69  ean by writing i
20f50 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  ts contents.** o
20f60 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
20f70 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73  se file, if poss
20f80 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69  ible. This may i
20f90 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74  nvolve syncing t
20fa0 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
20fb0 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  le. .**.** If su
20fc0 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65  ccessful, sqlite
20fd0 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
20fe0 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
20ff0 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20  the page and.** 
21000 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
21010 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
21020 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
21030 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74  trying to make t
21040 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e  he.** page clean
21050 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  , the IO error c
21060 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
21070 20 49 66 20 74 68 65 20 70 61 67 65 20 63 61 6e   If the page can
21080 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63  not be.** made c
21090 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74  lean for some ot
210a0 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20  her reason, but 
210b0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
210c0 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a   then SQLITE_OK.
210d0 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 62  ** is returned b
210e0 79 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  y sqlite3PcacheM
210f0 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f  akeClean() is no
21100 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  t called..*/.sta
21110 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72  tic int pagerStr
21120 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48  ess(void *p, PgH
21130 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
21140 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67  r *pPager = (Pag
21150 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63  er *)p;.  int rc
21160 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
21170 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
21180 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
21190 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
211a0 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
211b0 20 29 3b 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72   );..  pPg->pDir
211c0 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61  ty = 0;.  if( pa
211d0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
211e0 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74  ) ){.    /* Writ
211f0 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65  e a single frame
21200 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 74   for this page t
21210 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20  o the log. */.  
21220 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72    if( subjRequir
21230 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 20 0a  esPage(pPg) ){ .
21240 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f        rc = subjo
21250 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 20  urnalPage(pPg); 
21260 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
21270 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21280 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
21290 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72  WalFrames(pPager
212a0 2c 20 70 50 67 2c 20 30 2c 20 30 2c 20 30 29 3b  , pPg, 0, 0, 0);
212b0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
212c0 20 20 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74      /* The doNot
212d0 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
212e0 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 50   by the sqlite3P
212f0 61 67 65 72 57 72 69 74 65 28 29 20 66 75 6e 63  agerWrite() func
21300 74 69 6f 6e 20 77 68 69 6c 65 20 69 74 0a 20 20  tion while it.  
21310 20 20 2a 2a 20 69 73 20 6a 6f 75 72 6e 61 6c 6c    ** is journall
21320 69 6e 67 20 61 20 73 65 74 20 6f 66 20 74 77 6f  ing a set of two
21330 20 6f 72 20 6d 6f 72 65 20 64 61 74 61 62 61 73   or more databas
21340 65 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  e pages that are
21350 20 73 74 6f 72 65 64 0a 20 20 20 20 2a 2a 20 6f   stored.    ** o
21360 6e 20 74 68 65 20 73 61 6d 65 20 64 69 73 6b 20  n the same disk 
21370 73 65 63 74 6f 72 2e 20 53 79 6e 63 69 6e 67 20  sector. Syncing 
21380 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
21390 6f 74 20 61 6c 6c 6f 77 65 64 20 77 68 69 6c 65  ot allowed while
213a0 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20  .    ** this is 
213b0 68 61 70 70 65 6e 69 6e 67 20 61 73 20 69 74 20  happening as it 
213c0 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  is important tha
213d0 74 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66  t all members of
213e0 20 73 75 63 68 20 61 0a 20 20 20 20 2a 2a 20 73   such a.    ** s
213f0 65 74 20 6f 66 20 70 61 67 65 73 20 61 72 65 20  et of pages are 
21400 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 74  synced to disk t
21410 6f 67 65 74 68 65 72 2e 20 53 6f 2c 20 69 66 20  ogether. So, if 
21420 74 68 65 20 70 61 67 65 20 74 68 69 73 20 66 75  the page this fu
21430 6e 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 73  nction.    ** is
21440 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20   trying to make 
21450 63 6c 65 61 6e 20 77 69 6c 6c 20 72 65 71 75 69  clean will requi
21460 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e  re a journal syn
21470 63 20 61 6e 64 20 74 68 65 20 64 6f 4e 6f 74 53  c and the doNotS
21480 79 6e 63 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20  ync.    ** flag 
21490 69 73 20 73 65 74 2c 20 72 65 74 75 72 6e 20 77  is set, return w
214a0 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
214b0 74 68 69 6e 67 2e 20 54 68 65 20 70 63 61 63 68  thing. The pcach
214c0 65 20 6c 61 79 65 72 20 77 69 6c 6c 0a 20 20 20  e layer will.   
214d0 20 2a 2a 20 6a 75 73 74 20 68 61 76 65 20 74 6f   ** just have to
214e0 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 61 6c   go ahead and al
214f0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
21500 65 20 62 75 66 66 65 72 20 69 6e 73 74 65 61 64  e buffer instead
21510 20 6f 66 0a 20 20 20 20 2a 2a 20 72 65 75 73 69   of.    ** reusi
21520 6e 67 20 70 50 67 2e 0a 20 20 20 20 2a 2a 0a 20  ng pPg..    **. 
21530 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c     ** Similarly,
21540 20 69 66 20 74 68 65 20 70 61 67 65 72 20 68 61   if the pager ha
21550 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  s already entere
21560 64 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  d the error stat
21570 65 2c 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a  e, do not.    **
21580 20 74 72 79 20 74 6f 20 77 72 69 74 65 20 74 68   try to write th
21590 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50  e contents of pP
215a0 67 20 74 6f 20 64 69 73 6b 2e 0a 20 20 20 20 2a  g to disk..    *
215b0 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  /.    if( NEVER(
215c0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
215d0 0a 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72  .     || (pPager
215e0 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 26 26 20 70  ->doNotSync && p
215f0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
21600 4e 45 45 44 5f 53 59 4e 43 29 0a 20 20 20 20 29  NEED_SYNC).    )
21610 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
21620 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
21630 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74    .    /* Sync t
21640 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
21650 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
21660 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61      if( pPg->fla
21670 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
21680 4e 43 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  NC ){.      rc =
21690 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
216a0 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
216b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
216c0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
216d0 63 20 26 26 20 0a 20 20 20 20 20 20 20 20 21 28  c && .        !(
216e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
216f0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
21700 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 20 26  ALMODE_MEMORY) &
21710 26 0a 20 20 20 20 20 20 20 20 21 28 73 71 6c 69  &.        !(sqli
21720 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
21730 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
21740 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f  r->fd)&SQLITE_IO
21750 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29  CAP_SAFE_APPEND)
21760 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
21770 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
21780 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
21790 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
217a0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
217b0 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
217c0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75  * If the page nu
217d0 6d 62 65 72 20 6f 66 20 74 68 69 73 20 70 61 67  mber of this pag
217e0 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  e is larger than
217f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
21800 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  e of.    ** the 
21810 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20  database image, 
21820 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62  it may need to b
21830 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
21840 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20   sub-journal..  
21850 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63    ** This is bec
21860 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  ause the call to
21870 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
21880 65 6c 69 73 74 28 29 20 62 65 6c 6f 77 20 77 69  elist() below wi
21890 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 63  ll not.    ** ac
218a0 74 75 61 6c 6c 79 20 77 72 69 74 65 20 64 61 74  tually write dat
218b0 61 20 74 6f 20 74 68 65 20 66 69 6c 65 20 69 6e  a to the file in
218c0 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
218d0 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e 73 69 64  **.    ** Consid
218e0 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  er the following
218f0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76 65   sequence of eve
21900 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nts:.    **.    
21910 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  **   BEGIN;.    
21920 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20  **     <journal 
21930 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20  page X>.    **  
21940 20 20 20 3c 6d 6f 64 69 66 79 20 70 61 67 65 20     <modify page 
21950 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 41  X>.    **     SA
21960 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20  VEPOINT sp;.    
21970 2a 2a 20 20 20 20 20 20 20 3c 73 68 72 69 6e 6b  **       <shrink
21980 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
21990 6f 20 59 20 70 61 67 65 73 3e 0a 20 20 20 20 2a  o Y pages>.    *
219a0 2a 20 20 20 20 20 20 20 70 61 67 65 72 53 74 72  *       pagerStr
219b0 65 73 73 28 70 61 67 65 20 58 29 0a 20 20 20 20  ess(page X).    
219c0 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20  **     ROLLBACK 
219d0 54 4f 20 73 70 3b 0a 20 20 20 20 2a 2a 0a 20 20  TO sp;.    **.  
219e0 20 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74    ** If (X>Y), t
219f0 68 65 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74  hen when pagerSt
21a00 72 65 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70  ress is called p
21a10 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62  age X will not b
21a20 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a  e written.    **
21a30 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
21a40 62 61 73 65 20 66 69 6c 65 2c 20 62 75 74 20 77  base file, but w
21a50 69 6c 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66  ill be dropped f
21a60 72 6f 6d 20 74 68 65 20 63 61 63 68 65 2e 20 54  rom the cache. T
21a70 68 65 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c  hen,.    ** foll
21a80 6f 77 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42  owing the "ROLLB
21a90 41 43 4b 20 54 4f 20 73 70 22 20 73 74 61 74 65  ACK TO sp" state
21aa0 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67 20 70 61  ment, reading pa
21ab0 67 65 20 58 20 77 69 6c 6c 20 72 65 61 64 0a 20  ge X will read. 
21ac0 20 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20     ** data from 
21ad0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21ae0 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20  e. This will be 
21af0 74 68 65 20 63 6f 70 79 20 6f 66 20 70 61 67 65  the copy of page
21b00 20 58 20 61 73 20 69 74 0a 20 20 20 20 2a 2a 20   X as it.    ** 
21b10 77 61 73 20 77 68 65 6e 20 74 68 65 20 74 72 61  was when the tra
21b20 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64  nsaction started
21b30 2c 20 6e 6f 74 20 61 73 20 69 74 20 77 61 73 20  , not as it was 
21b40 77 68 65 6e 20 22 53 41 56 45 50 4f 49 4e 54 20  when "SAVEPOINT 
21b50 73 70 22 0a 20 20 20 20 2a 2a 20 77 61 73 20 65  sp".    ** was e
21b60 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a  xecuted..    **.
21b70 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74      ** The solut
21b80 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20  ion is to write 
21b90 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
21ba0 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f   for page X into
21bb0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62   the .    ** sub
21bc0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f  -journal file no
21bd0 77 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  w (if it is not 
21be0 61 6c 72 65 61 64 79 20 74 68 65 72 65 29 2c 20  already there), 
21bf0 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a  so that it will.
21c00 20 20 20 20 2a 2a 20 62 65 20 72 65 73 74 6f 72      ** be restor
21c10 65 64 20 74 6f 20 69 74 73 20 63 75 72 72 65 6e  ed to its curren
21c20 74 20 76 61 6c 75 65 20 77 68 65 6e 20 74 68 65  t value when the
21c30 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70   "ROLLBACK TO sp
21c40 22 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 78 65  " is .    ** exe
21c50 63 75 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  cuted..    */.  
21c60 20 20 69 66 28 20 4e 45 56 45 52 28 0a 20 20 20    if( NEVER(.   
21c70 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
21c80 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e  OK && pPg->pgno>
21c90 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26  pPager->dbSize &
21ca0 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  & subjRequiresPa
21cb0 67 65 28 70 50 67 29 0a 20 20 20 20 29 20 29 7b  ge(pPg).    ) ){
21cc0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a  .      rc = subj
21cd0 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b  ournalPage(pPg);
21ce0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
21cf0 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65   Write the conte
21d00 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
21d10 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
21d20 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
21d30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21d40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
21d50 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
21d60 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  elist(pPg);.    
21d70 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b  }.  }..  /* Mark
21d80 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
21d90 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  an. */.  if( rc=
21da0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21db0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
21dc0 54 52 45 53 53 20 25 64 20 70 61 67 65 20 25 64  TRESS %d page %d
21dd0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
21de0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
21df0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  );.    sqlite3Pc
21e00 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
21e10 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  g);.  }..  retur
21e20 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
21e30 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 0a 2f  ager, rc);.}.../
21e40 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
21e50 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  d initialize a n
21e60 65 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  ew Pager object 
21e70 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65  and put a pointe
21e80 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70  r to it.** in *p
21e90 70 50 61 67 65 72 2e 20 54 68 65 20 70 61 67 65  pPager. The page
21ea0 72 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61  r should eventua
21eb0 6c 6c 79 20 62 65 20 66 72 65 65 64 20 62 79 20  lly be freed by 
21ec0 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f  passing it.** to
21ed0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
21ee0 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  se()..**.** The 
21ef0 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65  zFilename argume
21f00 6e 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74  nt is the path t
21f10 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
21f20 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20  ile to open..** 
21f30 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
21f40 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64  NULL then a rand
21f50 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f  omly-named tempo
21f60 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65  rary file is cre
21f70 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64  ated.** and used
21f80 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20   as the file to 
21f90 62 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f  be cached. Tempo
21fa0 72 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 62  rary files are b
21fb0 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74  e deleted.** aut
21fc0 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20  omatically when 
21fd0 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e  they are closed.
21fe0 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
21ff0 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
22000 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61   .** all informa
22010 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20  tion is held in 
22020 63 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76  cache. It is nev
22030 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  er written to di
22040 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e  sk. .** This can
22050 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
22060 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ement an in-memo
22070 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  ry database..**.
22080 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70 61  ** The nExtra pa
22090 72 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65  rameter specifie
220a0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
220b0 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
220c0 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e  llocated.** alon
220d0 67 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65  g with each page
220e0 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73   reference. This
220f0 20 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61   space is availa
22100 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a  ble to the user.
22110 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74  ** via the sqlit
22120 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
22130 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ) API..**.** The
22140 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20   flags argument 
22150 69 73 20 75 73 65 64 20 74 6f 20 73 70 65 63 69  is used to speci
22160 66 79 20 70 72 6f 70 65 72 74 69 65 73 20 74 68  fy properties th
22170 61 74 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a  at affect the.**
22180 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   operation of th
22190 65 20 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75  e pager. It shou
221a0 6c 64 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d  ld be passed som
221b0 65 20 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e  e bitwise combin
221c0 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  ation.** of the 
221d0 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  PAGER_OMIT_JOURN
221e0 41 4c 20 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f  AL and PAGER_NO_
221f0 52 45 41 44 4c 4f 43 4b 20 66 6c 61 67 73 2e 0a  READLOCK flags..
22200 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61  **.** The vfsFla
22210 67 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  gs parameter is 
22220 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73  a bitmask to pas
22230 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70  s to the flags p
22240 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74  arameter.** of t
22250 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f  he xOpen() metho
22260 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  d of the supplie
22270 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69  d VFS when openi
22280 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a  ng files. .**.**
22290 20 49 66 20 74 68 65 20 70 61 67 65 72 20 6f 62   If the pager ob
222a0 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65  ject is allocate
222b0 64 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 66  d and the specif
222c0 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  ied file opened 
222d0 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79  .** successfully
222e0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
222f0 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50  eturned and *ppP
22300 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e  ager set to poin
22310 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20  t to.** the new 
22320 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66  pager object. If
22330 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
22340 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20 73 65  , *ppPager is se
22350 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64  t to NULL.** and
22360 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75   error code retu
22370 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  rned. This funct
22380 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ion may return S
22390 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28  QLITE_NOMEM.** (
223a0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20  sqlite3Malloc() 
223b0 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  is used to alloc
223c0 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c  ate memory), SQL
223d0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20  ITE_CANTOPEN or 
223e0 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49  .** various SQLI
223f0 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73  TE_IO_XXX errors
22400 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22410 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c  PagerOpen(.  sql
22420 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
22430 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
22440 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d  tual file system
22450 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67   to use */.  Pag
22460 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20  er **ppPager,   
22470 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
22480 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73  turn the Pager s
22490 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
224a0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
224b0 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e  Filename,   /* N
224c0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
224d0 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
224e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
224f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
22500 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70  * Extra bytes ap
22510 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d  pend to each in-
22520 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
22530 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
22540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
22550 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74  gs controlling t
22560 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  his file */.  in
22570 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20  t vfsFlags,     
22580 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
22590 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
225a0 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
225b0 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20  pen() */.  void 
225c0 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67  (*xReinit)(DbPag
225d0 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  e*) /* Function 
225e0 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20  to reinitialize 
225f0 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38  pages */.){.  u8
22600 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20   *pPtr;.  Pager 
22610 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20  *pPager = 0;    
22620 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
22630 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ct to allocate a
22640 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  nd return */.  i
22650 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
22660 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
22670 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
22680 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20  tempFile = 0;   
22690 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
226a0 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63   temp files (inc
226b0 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  l. in-memory fil
226c0 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d  es) */.  int mem
226d0 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Db = 0;         
226e0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
226f0 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
22700 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  y file */.  int 
22710 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20  readOnly = 0;   
22720 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
22730 74 68 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f  this is a read-o
22740 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nly file */.  in
22750 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  t journalFileSiz
22760 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20  e;     /* Bytes 
22770 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
22780 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20  each journal fd 
22790 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68  */.  char *zPath
227a0 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  name = 0;     /*
227b0 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61   Full path to da
227c0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
227d0 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d   int nPathname =
227e0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d   0;       /* Num
227f0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
22800 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69  zPathname */.  i
22810 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  nt useJournal = 
22820 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f  (flags & PAGER_O
22830 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b  MIT_JOURNAL)==0;
22840 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69   /* False to omi
22850 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  t journal */.  i
22860 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20  nt noReadlock = 
22870 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e  (flags & PAGER_N
22880 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 20  O_READLOCK)!=0; 
22890 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74   /* True to omit
228a0 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20   read-lock */.  
228b0 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d  int pcacheSize =
228c0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69   sqlite3PcacheSi
228d0 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42  ze();       /* B
228e0 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ytes to allocate
228f0 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20   for PCache */. 
22900 20 75 31 36 20 73 7a 50 61 67 65 44 66 6c 74 20   u16 szPageDflt 
22910 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
22920 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20  _PAGE_SIZE;  /* 
22930 44 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  Default page siz
22940 65 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  e */..  /* Figur
22950 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73  e out how much s
22960 70 61 63 65 20 69 73 20 72 65 71 75 69 72 65 64  pace is required
22970 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61   for each journa
22980 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20  l file-handle.  
22990 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20 74 77  ** (there are tw
229a0 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d  o of them, the m
229b0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ain journal and 
229c0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29  the sub-journal)
229d0 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69 73 20 74  . This.  ** is t
229e0 68 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65  he maximum space
229f0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e   required for an
22a00 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
22a10 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a  al file handle .
22a20 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 67 75 6c    ** and a regul
22a30 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d  ar journal file-
22a40 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61  handle. Note tha
22a50 74 20 61 20 22 72 65 67 75 6c 61 72 20 6a 6f 75  t a "regular jou
22a60 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a  rnal-handle".  *
22a70 2a 20 6d 61 79 20 62 65 20 61 20 77 72 61 70 70  * may be a wrapp
22a80 65 72 20 63 61 70 61 62 6c 65 20 6f 66 20 63 61  er capable of ca
22a90 63 68 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ching the first 
22aa0 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  portion of the j
22ab0 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
22ac0 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d   in memory to im
22ad0 70 6c 65 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d  plement the atom
22ae0 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
22af0 61 74 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a  ation (see .  **
22b00 20 73 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f 75   source file jou
22b10 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20  rnal.c)..  */.  
22b20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  if( sqlite3Journ
22b30 61 6c 53 69 7a 65 28 70 56 66 73 29 3e 73 71 6c  alSize(pVfs)>sql
22b40 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69  ite3MemJournalSi
22b50 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72  ze() ){.    jour
22b60 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f  nalFileSize = RO
22b70 55 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72  UND8(sqlite3Jour
22b80 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a  nalSize(pVfs));.
22b90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75    }else{.    jou
22ba0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52  rnalFileSize = R
22bb0 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4d 65 6d  OUND8(sqlite3Mem
22bc0 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a  JournalSize());.
22bd0 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
22be0 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
22bf0 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73  e to NULL in cas
22c00 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  e an error occur
22c10 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  s. */.  *ppPager
22c20 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70   = 0;..  /* Comp
22c30 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ute and store th
22c40 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
22c50 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20  in an allocated 
22c60 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20  buffer pointed. 
22c70 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e   ** to by zPathn
22c80 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74  ame, length nPat
22c90 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68  hname. Or, if th
22ca0 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
22cb0 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61  y file,.  ** lea
22cc0 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d  ve both nPathnam
22cd0 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20  e and zPathname 
22ce0 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20  set to 0..  */. 
22cf0 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
22d00 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
22d10 7b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  {.    nPathname 
22d20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
22d30 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e  me+1;.    zPathn
22d40 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
22d50 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29  loc(nPathname*2)
22d60 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e  ;.    if( zPathn
22d70 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
22d80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
22d90 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  MEM;.    }.#ifnd
22da0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
22db0 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20  EMORYDB.    if( 
22dc0 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
22dd0 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20  ,":memory:")==0 
22de0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d  ){.      memDb =
22df0 20 31 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e   1;.      zPathn
22e00 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  ame[0] = 0;.    
22e10 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
22e20 20 7b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61   {.      zPathna
22e30 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61  me[0] = 0; /* Ma
22e40 6b 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69  ke sure initiali
22e50 7a 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c  zed even if Full
22e60 50 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73  Pathname() fails
22e70 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
22e80 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
22e90 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
22ea0 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c  name, nPathname,
22eb0 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
22ec0 20 7d 0a 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d   }..    nPathnam
22ed0 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
22ee0 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  n30(zPathname);.
22ef0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
22f00 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61  TE_OK && nPathna
22f10 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74  me+8>pVfs->mxPat
22f20 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f  hname ){.      /
22f30 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
22f40 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20   taken when the 
22f50 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71  journal path req
22f60 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a  uired by.      *
22f70 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  * the database b
22f80 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c  eing opened will
22f90 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56   be more than pV
22fa0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20  fs->mxPathname. 
22fb0 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e       ** bytes in
22fc0 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65   length. This me
22fd0 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
22fe0 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65   cannot be opene
22ff0 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69  d,.      ** as i
23000 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f  t will not be po
23010 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74  ssible to open t
23020 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
23030 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a  or even.      **
23040 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74   check for a hot
23050 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20  -journal before 
23060 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a  reading..      *
23070 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
23080 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
23090 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
230a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
230b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
230c0 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
230d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
230e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
230f0 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
23100 79 20 66 6f 72 20 74 68 65 20 50 61 67 65 72 20  y for the Pager 
23110 73 74 72 75 63 74 75 72 65 2c 20 50 43 61 63 68  structure, PCach
23120 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20  e object, the.  
23130 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64 65  ** three file de
23140 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64  scriptors, the d
23150 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
23160 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  e and the journa
23170 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d  l .  ** file nam
23180 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e  e. The layout in
23190 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f   memory is as fo
231a0 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
231b0 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63       Pager objec
231c0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
231d0 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67       (sizeof(Pag
231e0 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  er) bytes).  ** 
231f0 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63      PCache objec
23200 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
23210 20 20 20 20 28 73 71 6c 69 74 65 33 50 63 61 63      (sqlite3Pcac
23220 68 65 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a  heSize() bytes).
23230 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
23240 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  e file handle   
23250 20 20 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e           (pVfs->
23260 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a  szOsFile bytes).
23270 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75    **     Sub-jou
23280 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
23290 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61           (journa
232a0 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29  lFileSize bytes)
232b0 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a  .  **     Main j
232c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
232d0 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e  le        (journ
232e0 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73  alFileSize bytes
232f0 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62  ).  **     Datab
23300 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20  ase file name   
23310 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74             (nPat
23320 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20  hname+1 bytes). 
23330 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20   **     Journal 
23340 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20  file name       
23350 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
23360 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20  me+8+1 bytes).  
23370 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20  */.  pPtr = (u8 
23380 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
23390 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28  ero(.    ROUND8(
233a0 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29  sizeof(*pPager))
233b0 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72   +      /* Pager
233c0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
233d0 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53    ROUND8(pcacheS
233e0 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20 20  ize) +          
233f0 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63   /* PCache objec
23400 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28  t */.    ROUND8(
23410 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20  pVfs->szOsFile) 
23420 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d  +       /* The m
23430 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20  ain db file */. 
23440 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
23450 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20  ze * 2 +        
23460 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75    /* The two jou
23470 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20  rnal files */ . 
23480 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31     nPathname + 1
23490 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
234a0 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a    /* zFilename *
234b0 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  /.    nPathname 
234c0 2b 20 38 20 2b 20 31 20 20 20 20 20 20 20 20 20  + 8 + 1         
234d0 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c       /* zJournal
234e0 20 2a 2f 0a 20 20 29 3b 0a 20 20 61 73 73 65 72   */.  );.  asser
234f0 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
23500 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49  IGNMENT(SQLITE_I
23510 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61  NT_TO_PTR(journa
23520 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20  lFileSize)) );. 
23530 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20   if( !pPtr ){.  
23540 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
23550 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72  Pathname);.    r
23560 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
23570 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  EM;.  }.  pPager
23580 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   =              
23590 28 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a  (Pager*)(pPtr);.
235a0 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68    pPager->pPCach
235b0 65 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29  e =    (PCache*)
235c0 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
235d0 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29  sizeof(*pPager))
235e0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20  );.  pPager->fd 
235f0 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  =   (sqlite3_fil
23600 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
23610 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b  D8(pcacheSize));
23620 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20  .  pPager->sjfd 
23630 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  = (sqlite3_file*
23640 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
23650 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29  (pVfs->szOsFile)
23660 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64  );.  pPager->jfd
23670 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c   =  (sqlite3_fil
23680 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72  e*)(pPtr += jour
23690 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20  nalFileSize);.  
236a0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
236b0 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70  e =    (char*)(p
236c0 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69  Ptr += journalFi
236d0 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72  leSize);.  asser
236e0 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
236f0 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e  IGNMENT(pPager->
23700 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  jfd) );..  /* Fi
23710 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  ll in the Pager.
23720 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61  zFilename and Pa
23730 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66  ger.zJournal buf
23740 66 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65  fers, if require
23750 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74  d. */.  if( zPat
23760 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 70 50 61  hname ){.    pPa
23770 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ger->zJournal = 
23780 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b    (char*)(pPtr +
23790 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 29  = nPathname + 1)
237a0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
237b0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
237c0 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
237d0 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70  name);.    memcp
237e0 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
237f0 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  al, zPathname, n
23800 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d  Pathname);.    m
23810 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  emcpy(&pPager->z
23820 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d  Journal[nPathnam
23830 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20  e], "-journal", 
23840 38 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  8);.    if( pPag
23850 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d  er->zFilename[0]
23860 3d 3d 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 4a  ==0 ) pPager->zJ
23870 6f 75 72 6e 61 6c 5b 30 5d 20 3d 20 30 3b 0a 20  ournal[0] = 0;. 
23880 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
23890 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zPathname);.  }.
238a0 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d    pPager->pVfs =
238b0 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d   pVfs;.  pPager-
238c0 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46  >vfsFlags = vfsF
238d0 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  lags;..  /* Open
238e0 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
238f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
23900 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
23910 6d 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20  me[0] && !memDb 
23920 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20  ){.    int fout 
23930 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
23940 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66          /* VFS f
23950 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79  lags returned by
23960 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20   xOpen() */.    
23970 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
23980 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
23990 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
239a0 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73  er->fd, vfsFlags
239b0 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 72 65  , &fout);.    re
239c0 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53  adOnly = (fout&S
239d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
239e0 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  NLY);..    /* If
239f0 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75   the file was su
23a00 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
23a10 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  d for read/write
23a20 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20   access,.    ** 
23a30 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74  choose a default
23a40 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61   page size in ca
23a50 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72  se we have to cr
23a60 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  eate the.    ** 
23a70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
23a80 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
23a90 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69  size is the maxi
23aa0 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  mum of:.    **. 
23ab0 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54     **    + SQLIT
23ac0 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
23ad0 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b  IZE,.    **    +
23ae0 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
23af0 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
23b00 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
23b10 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72   **    + The lar
23b20 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74  gest page size t
23b30 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74  hat can be writt
23b40 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  en atomically.. 
23b50 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
23b60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
23b70 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
23b80 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
23b90 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
23ba0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46  ssert(SQLITE_DEF
23bb0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
23bc0 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
23bd0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  LT_PAGE_SIZE);. 
23be0 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44       if( szPageD
23bf0 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74  flt<pPager->sect
23c00 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  orSize ){.      
23c10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
23c20 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f  ctorSize>SQLITE_
23c30 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
23c40 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
23c50 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
23c60 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
23c70 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  LT_PAGE_SIZE;.  
23c80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23c90 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
23ca0 74 20 3d 20 28 75 31 36 29 70 50 61 67 65 72 2d  t = (u16)pPager-
23cb0 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
23cc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
23cd0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
23ce0 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
23cf0 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
23d00 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
23d10 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
23d20 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
23d30 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69  ->fd);.        i
23d40 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61  nt ii;.        a
23d50 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
23d60 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
23d70 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  12>>8));.       
23d80 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
23d90 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
23da0 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
23db0 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
23dc0 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
23dd0 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29  AGE_SIZE<=65536)
23de0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69  ;.        for(ii
23df0 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c  =szPageDflt; ii<
23e00 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  =SQLITE_MAX_DEFA
23e10 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69  ULT_PAGE_SIZE; i
23e20 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20  i=ii*2){.       
23e30 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49     if( iDc&(SQLI
23e40 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c  TE_IOCAP_ATOMIC|
23e50 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20  (ii>>8)) ){.    
23e60 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
23e70 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20  lt = ii;.       
23e80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
23e90 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
23ea0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
23eb0 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61   /* If a tempora
23ec0 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65  ry file is reque
23ed0 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20  sted, it is not 
23ee0 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  opened immediate
23ef0 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  ly..    ** In th
23f00 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70  is case we accep
23f10 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  t the default pa
23f20 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61  ge size and dela
23f30 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a  y actually.    *
23f40 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69  * opening the fi
23f50 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  le until the fir
23f60 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69  st call to OsWri
23f70 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  te()..    **.   
23f80 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   ** This branch 
23f90 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20  is also run for 
23fa0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
23fb0 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d  abase. An in-mem
23fc0 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  ory.    ** datab
23fd0 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ase is the same 
23fe0 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74  as a temp-file t
23ff0 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69  hat is never wri
24000 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20  tten out to.    
24010 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73  ** disk and uses
24020 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f   an in-memory ro
24030 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
24040 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70      */ .    temp
24050 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  File = 1;.    pP
24060 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
24070 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
24080 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76     readOnly = (v
24090 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
240a0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20  PEN_READONLY);. 
240b0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
240c0 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50  lowing call to P
240d0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
240e0 29 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20  ) serves to set 
240f0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20  the value of .  
24100 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  ** Pager.pageSiz
24110 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74  e and to allocat
24120 65 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70  e the Pager.pTmp
24130 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20  Space buffer..  
24140 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
24150 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
24160 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65  sert( pPager->me
24170 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  mDb==0 );.    rc
24180 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
24190 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
241a0 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20  r, &szPageDflt, 
241b0 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  -1);.    testcas
241c0 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
241d0 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   );.  }..  /* If
241e0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
241f0 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20  ed in either of 
24200 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65  the blocks above
24210 2c 20 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a  , free the .  **
24220 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
24230 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66   and close the f
24240 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
24250 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
24260 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
24270 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
24280 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
24290 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
242a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
242b0 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ree(pPager);.   
242c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
242d0 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
242e0 20 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65   the PCache obje
242f0 63 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ct. */.  assert(
24300 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a   nExtra<1000 );.
24310 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44    nExtra = ROUND
24320 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c  8(nExtra);.  sql
24330 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73  ite3PcacheOpen(s
24340 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72  zPageDflt, nExtr
24350 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20  a, !memDb,.     
24360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
24370 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73  memDb?pagerStres
24380 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61  s:0, (void *)pPa
24390 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43  ger, pPager->pPC
243a0 61 63 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54  ache);..  PAGERT
243b0 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25  RACE(("OPEN %d %
243c0 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45  s\n", FILEHANDLE
243d0 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20  ID(pPager->fd), 
243e0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
243f0 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  e));.  IOTRACE((
24400 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20  "OPEN %p %s\n", 
24410 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
24420 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70  zFilename))..  p
24430 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
24440 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e  l = (u8)useJourn
24450 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  al;.  pPager->no
24460 52 65 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65  Readlock = (noRe
24470 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e  adlock && readOn
24480 6c 79 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70  ly) ?1:0;.  /* p
24490 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
244a0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
244b0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
244c0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
244d0 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f  er->nRef = 0; */
244e0 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
244f0 65 56 61 6c 69 64 20 3d 20 28 75 38 29 6d 65 6d  eValid = (u8)mem
24500 44 62 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  Db;.  /* pPager-
24510 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a  >stmtSize = 0; *
24520 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
24530 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  tmtJSize = 0; */
24540 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50  .  /* pPager->nP
24550 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  age = 0; */.  pP
24560 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53  ager->mxPgno = S
24570 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43  QLITE_MAX_PAGE_C
24580 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65  OUNT;.  /* pPage
24590 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
245a0 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73  _UNLOCK; */.  as
245b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
245c0 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65  ate == (tempFile
245d0 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   ? PAGER_EXCLUSI
245e0 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43  VE : PAGER_UNLOC
245f0 4b 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65  K) );.  /* pPage
24600 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20  r->errMask = 0; 
24610 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d  */.  pPager->tem
24620 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70  pFile = (u8)temp
24630 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20  File;.  assert( 
24640 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
24650 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
24660 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  AL .          ||
24670 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
24680 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
24690 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
246a0 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
246b0 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d  GMODE_EXCLUSIVE=
246c0 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =1 );.  pPager->
246d0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
246e0 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20  (u8)tempFile; . 
246f0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
24700 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
24710 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
24720 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28  Pager->memDb = (
24730 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67  u8)memDb;.  pPag
24740 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28  er->readOnly = (
24750 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f  u8)readOnly;.  /
24760 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  * pPager->needSy
24770 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 61 73 73  nc = 0; */.  ass
24780 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20  ert( useJournal 
24790 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
247a0 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ile );.  pPager-
247b0 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72  >noSync = pPager
247c0 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
247d0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
247e0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
247f0 3f 30 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ?0:1;.  pPager->
24800 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c  sync_flags = SQL
24810 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
24820 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
24830 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  irst = 0; */.  /
24840 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
24850 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20  Synced = 0; */. 
24860 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73   /* pPager->pLas
24870 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  t = 0; */.  pPag
24880 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31  er->nExtra = (u1
24890 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67  6)nExtra;.  pPag
248a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
248b0 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45  imit = SQLITE_DE
248c0 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49  FAULT_JOURNAL_SI
248d0 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65  ZE_LIMIT;.  asse
248e0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
248f0 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69  r->fd) || tempFi
24900 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f  le );.  setSecto
24910 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
24920 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c   if( !useJournal
24930 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
24940 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
24950 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
24960 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  OFF;.  }else if(
24970 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50   memDb ){.    pP
24980 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
24990 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
249a0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20  LMODE_MEMORY;.  
249b0 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78  }.  /* pPager->x
249c0 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b  BusyHandler = 0;
249d0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
249e0 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
249f0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
24a00 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78  r->xReiniter = x
24a10 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d  Reinit;.  /* mem
24a20 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73  set(pPager->aHas
24a30 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  h, 0, sizeof(pPa
24a40 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f  ger->aHash)); */
24a50 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70  ..  *ppPager = p
24a60 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  Pager;.  return 
24a70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a  SQLITE_OK;.}....
24a80 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
24a90 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ion is called af
24aa0 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e  ter transitionin
24ab0 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c  g from PAGER_UNL
24ac0 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f  OCK to.** PAGER_
24ad0 53 48 41 52 45 44 20 73 74 61 74 65 2e 20 49 74  SHARED state. It
24ae0 20 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20   tests if there 
24af0 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  is a hot journal
24b00 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74   present in.** t
24b10 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  he file-system f
24b20 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
24b30 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61  er. A hot journa
24b40 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a  l is one that .*
24b50 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  * needs to be pl
24b60 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72  ayed back. Accor
24b70 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e  ding to this fun
24b80 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75  ction, a hot-jou
24b90 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69  rnal.** file exi
24ba0 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  sts if the follo
24bb0 77 69 6e 67 20 63 72 69 74 65 72 69 61 20 61 72  wing criteria ar
24bc0 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  e met:.**.**   *
24bd0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
24be0 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  e exists in the 
24bf0 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64  file system, and
24c00 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65  .**   * No proce
24c10 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52  ss holds a RESER
24c20 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  VED or greater l
24c30 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
24c40 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a  ase file, and.**
24c50 20 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73     * The databas
24c60 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73  e file itself is
24c70 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20   greater than 0 
24c80 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61  bytes in size, a
24c90 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69  nd.**   * The fi
24ca0 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
24cb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
24cc0 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30  sts and is not 0
24cd0 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  x00..**.** If th
24ce0 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
24cf0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
24d00 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a  ile is 0 but a j
24d10 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65  ournal file.** e
24d20 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70  xists, that is p
24d30 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a  robably an old j
24d40 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72  ournal left over
24d50 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a   from a prior.**
24d60 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
24d70 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e  he same name. In
24d80 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
24d90 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a  ournal file is.*
24da0 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75  * just deleted u
24db0 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a  sing OsDelete, *
24dc0 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74  pExists is set t
24dd0 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  o 0 and SQLITE_O
24de0 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
24df0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
24e00 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68  tine does not ch
24e10 65 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20  eck if there is 
24e20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
24e30 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20   filename.** at 
24e40 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
24e50 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
24e60 2c 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65  , and that maste
24e70 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  r journal file.*
24e80 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  * does not exist
24e90 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
24ea0 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72  al file is not r
24eb0 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68  eally hot. In th
24ec0 69 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20  is.** case this 
24ed0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
24ee0 75 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69  urn a false-posi
24ef0 74 69 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f  tive. The pager_
24f00 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f  playback().** ro
24f10 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f  utine will disco
24f20 76 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ver that the jou
24f30 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
24f40 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20   really hot and 
24f50 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c  .** will not rol
24f60 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a  l it back. .**.*
24f70 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  * If a hot-journ
24f80 61 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64  al file is found
24f90 20 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69   to exist, *pExi
24fa0 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 31 20  sts is set to 1 
24fb0 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  and .** SQLITE_O
24fc0 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e  K returned. If n
24fd0 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  o hot-journal fi
24fe0 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a  le is present, *
24ff0 70 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65  pExists is.** se
25000 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
25010 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
25020 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
25030 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
25040 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e  g.** to determin
25050 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
25060 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
25070 69 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65 20  ile exists, the 
25080 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  IO error.** code
25090 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
250a0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70   the value of *p
250b0 45 78 69 73 74 73 20 69 73 20 75 6e 64 65 66 69  Exists is undefi
250c0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
250d0 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c  nt hasHotJournal
250e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
250f0 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20  int *pExists){. 
25100 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
25110 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
25120 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
25130 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
25140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
25150 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
25160 74 20 65 78 69 73 74 73 3b 20 20 20 20 20 20 20  t exists;       
25170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25180 72 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c  rue if a journal
25190 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74   file is present
251a0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
251b0 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
251c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
251d0 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
251e0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
251f0 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73  ger->fd) );.  as
25200 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
25210 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
25220 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
25230 73 74 61 74 65 20 3c 3d 20 50 41 47 45 52 5f 53  state <= PAGER_S
25240 48 41 52 45 44 20 29 3b 0a 0a 20 20 2a 70 45 78  HARED );..  *pEx
25250 69 73 74 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d  ists = 0;.  rc =
25260 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
25270 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
25280 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
25290 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
252a0 65 78 69 73 74 73 29 3b 0a 20 20 69 66 28 20 72  exists);.  if( r
252b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
252c0 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e  exists ){.    in
252d0 74 20 6c 6f 63 6b 65 64 3b 20 20 20 20 20 20 20  t locked;       
252e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
252f0 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73  e if some proces
25300 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
25310 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20  ED lock */..    
25320 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f  /* Race conditio
25330 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72  n here:  Another
25340 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68   process might h
25350 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67  ave been holding
25360 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   the.    ** the 
25370 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e  RESERVED lock an
25380 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c  d have a journal
25390 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c   open at the sql
253a0 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a  ite3OsAccess() .
253b0 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76      ** call abov
253c0 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65  e, but then dele
253d0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  te the journal a
253e0 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b  nd drop the lock
253f0 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77   before.    ** w
25400 65 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c  e get to the fol
25410 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73  lowing sqlite3Os
25420 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
25430 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68  k() call.  If th
25440 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65  at.    ** is the
25450 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74   case, this rout
25460 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20  ine might think 
25470 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
25480 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20  ournal when.    
25490 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72 65  ** in fact there
254a0 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20   is none.  This 
254b0 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c  results in a fal
254c0 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63  se-positive whic
254d0 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  h will.    ** be
254e0 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74   dealt with by t
254f0 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74  he playback rout
25500 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38  ine.  Ticket #38
25510 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  83..    */.    r
25520 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65  c = sqlite3OsChe
25530 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70  ckReservedLock(p
25540 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b  Pager->fd, &lock
25550 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
25560 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c  =SQLITE_OK && !l
25570 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 69  ocked ){.      i
25580 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 20 20 20  nt nPage;..     
25590 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 73 69   /* Check the si
255a0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
255b0 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20 63  se file. If it c
255c0 6f 6e 73 69 73 74 73 20 6f 66 20 30 20 70 61 67  onsists of 0 pag
255d0 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  es,.      ** the
255e0 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  n delete the jou
255f0 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65 20 74  rnal file. See t
25600 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  he header commen
25610 74 20 61 62 6f 76 65 20 66 6f 72 20 0a 20 20 20  t above for .   
25620 20 20 20 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e     ** the reason
25630 69 6e 67 20 68 65 72 65 2e 20 20 44 65 6c 65 74  ing here.  Delet
25640 65 20 74 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a  e the obsolete j
25650 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65  ournal file unde
25660 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 52 45 53  r.      ** a RES
25670 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76  ERVED lock to av
25680 6f 69 64 20 72 61 63 65 20 63 6f 6e 64 69 74 69  oid race conditi
25690 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f 69 64  ons and to avoid
256a0 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20   violating.     
256b0 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20   ** [H33020]..  
256c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
256d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
256e0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
256f0 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  &nPage);.      i
25700 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25710 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
25720 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
25730 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
25740 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
25750 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
25760 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
25770 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56  ager->fd, RESERV
25780 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45  ED_LOCK)==SQLITE
25790 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
257a0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
257b0 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  te(pVfs, pPager-
257c0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
257d0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
257e0 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
257f0 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
25800 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  CK);.          }
25810 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
25820 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
25830 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  c();.        }el
25840 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
25850 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
25860 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20  e exists and no 
25870 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
25880 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a   has a reserved.
25890 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
258a0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
258b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
258c0 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61  e. Now check tha
258d0 74 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20  t there is.     
258e0 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74       ** at least
258f0 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79   one non-zero by
25900 74 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74  tes at the start
25910 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
25920 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20  file..          
25930 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20  ** If there is, 
25940 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72  then we consider
25950 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f   this journal to
25960 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c   be hot. If not,
25970 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
25980 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  t can be ignored
25990 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
259a0 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d           int f =
259b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
259c0 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
259d0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
259e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
259f0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
25a00 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
25a10 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
25a20 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20  , f, &f);.      
25a30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25a40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
25a50 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20       u8 first = 
25a60 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
25a70 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
25a80 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28  d(pPager->jfd, (
25a90 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31  void *)&first, 1
25aa0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
25ab0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25ac0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
25ad0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  D ){.           
25ae0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
25af0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  K;.            }
25b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
25b10 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
25b20 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
25b30 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d        *pExists =
25b40 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20   (first!=0);.   
25b50 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
25b60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
25b70 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  OPEN ){.        
25b80 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e      /* If we can
25b90 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c  not open the rol
25ba0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69  lback journal fi
25bb0 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  le in order to s
25bc0 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20 20  ee if.          
25bd0 20 20 2a 2a 20 69 74 73 20 68 61 73 20 61 20 7a    ** its has a z
25be0 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74  ero header, that
25bf0 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
25c00 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f   an I/O error, o
25c10 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
25c20 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65   it might be due
25c30 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e   to the race con
25c40 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  dition described
25c50 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20   above and in.  
25c60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63            ** tic
25c70 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68  ket #3883.  Eith
25c80 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74  er way, assume t
25c90 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
25ca0 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20  is hot..        
25cb0 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
25cc0 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73  t be a false pos
25cd0 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69  itive.  But if i
25ce0 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20  t is, then the. 
25cf0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75             ** au
25d00 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20  tomatic journal 
25d10 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63  playback and rec
25d20 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20  overy mechanism 
25d30 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20  will deal.      
25d40 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74        ** with it
25d50 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53   under an EXCLUS
25d60 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77  IVE lock where w
25d70 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  e do not need to
25d80 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
25d90 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69  worry so much wi
25da0 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  th race conditio
25db0 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ns..            
25dc0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  */.            *
25dd0 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20  pExists = 1;.   
25de0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
25df0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
25e00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
25e10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
25e20 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
25e30 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
25e40 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
25e50 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72  to obtain a shar
25e60 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ed lock on the d
25e70 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
25e80 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
25e90 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  o call sqlite3Pa
25ea0 67 65 72 41 63 71 75 69 72 65 28 29 20 75 6e 74  gerAcquire() unt
25eb0 69 6c 20 61 66 74 65 72 20 74 68 69 73 20 66 75  il after this fu
25ec0 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65  nction.** has be
25ed0 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
25ee0 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61  called. If a sha
25ef0 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65  red-lock is alre
25f00 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a  ady held when.**
25f10 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
25f20 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
25f30 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
25f40 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65  he following ope
25f50 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f  rations are also
25f60 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68   performed by th
25f70 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
25f80 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65 20 70  **   1) If the p
25f90 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  ager is currentl
25fa0 79 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43  y in PAGER_UNLOC
25fb0 4b 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b  K state (no lock
25fc0 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e   held.**      on
25fd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25fe0 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74  le), then an att
25ff0 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
26000 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20  obtain a.**     
26010 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20   SHARED lock on 
26020 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26030 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61  e. Immediately a
26040 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a  fter obtaining.*
26050 2a 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45  *      the SHARE
26060 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65  D lock, the file
26070 2d 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b  -system is check
26080 65 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ed for a hot-jou
26090 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68  rnal,.**      wh
260a0 69 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61  ich is played ba
260b0 63 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46  ck if present. F
260c0 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74  ollowing any hot
260d0 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20  -journal .**    
260e0 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20    rollback, the 
260f0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
26100 63 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61  cache are valida
26110 74 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a  ted by checking.
26120 2a 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61  **      the 'cha
26130 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65  nge-counter' fie
26140 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ld of the databa
26150 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61  se file header a
26160 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61  nd.**      disca
26170 72 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65  rded if they are
26180 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76   found to be inv
26190 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  alid..**.**   2)
261a0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
261b0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
261c0 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20  usive-mode, and 
261d0 74 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e  there are curren
261e0 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f  tly.**      no o
261f0 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
26200 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67  ences to any pag
26210 65 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68  es, and is in th
26220 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a  e error state,.*
26230 2a 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61  *      then an a
26240 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
26250 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f  o clear the erro
26260 72 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61  r state by disca
26270 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  rding.**      th
26280 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
26290 65 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64  e page cache and
262a0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e   rolling back an
262b0 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a  y open journal.*
262c0 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a  *      file..**.
262d0 2a 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  ** If the operat
262e0 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79  ion described by
262f0 20 28 32 29 20 61 62 6f 76 65 20 69 73 20 6e 6f   (2) above is no
26300 74 20 61 74 74 65 6d 70 74 65 64 2c 20 61 6e 64  t attempted, and
26310 20 69 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 72   if the.** pager
26320 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 20   is in an error 
26330 73 74 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e  state other than
26340 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 77 68 65   SQLITE_FULL whe
26350 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
26360 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 73  ,.** the error s
26370 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  tate error code 
26380 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 74 20  is returned. It 
26390 69 73 20 70 65 72 6d 69 74 74 65 64 20 74 6f 20  is permitted to 
263a0 72 65 61 64 20 74 68 65 0a 2a 2a 20 64 61 74 61  read the.** data
263b0 62 61 73 65 20 77 68 65 6e 20 69 6e 20 53 51 4c  base when in SQL
263c0 49 54 45 5f 46 55 4c 4c 20 65 72 72 6f 72 20 73  ITE_FULL error s
263d0 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  tate..**.** Othe
263e0 72 77 69 73 65 2c 20 69 66 20 65 76 65 72 79 74  rwise, if everyt
263f0 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
26400 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
26410 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
26420 0a 2a 2a 20 49 4f 20 65 72 72 6f 72 20 6f 63 63  .** IO error occ
26430 75 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e  urs while lockin
26440 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  g the database, 
26450 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68  checking for a h
26460 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  ot-journal.** fi
26470 6c 65 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  le or rolling ba
26480 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ck a journal fil
26490 65 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  e, the IO error 
264a0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
264b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
264c0 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  PagerSharedLock(
264d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
264e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
264f0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
26500 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
26510 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45  ode */.  int isE
26520 72 72 6f 72 52 65 73 65 74 20 3d 20 30 3b 20 20  rrorReset = 0;  
26530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26540 72 75 65 20 69 66 20 72 65 63 6f 76 65 72 69 6e  rue if recoverin
26550 67 20 66 72 6f 6d 20 65 72 72 6f 72 20 73 74 61  g from error sta
26560 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  te */..  /* This
26570 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
26580 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74   called from b-t
26590 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65  ree and only whe
265a0 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20  n there are no. 
265b0 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   ** outstanding 
265c0 70 61 67 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  pages */.  asser
265d0 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  t( sqlite3Pcache
265e0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
265f0 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a  >pPCache)==0 );.
26600 20 20 69 66 28 20 4e 45 56 45 52 28 4d 45 4d 44    if( NEVER(MEMD
26610 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  B && pPager->err
26620 43 6f 64 65 29 20 29 7b 20 72 65 74 75 72 6e 20  Code) ){ return 
26630 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
26640 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
26650 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
26660 61 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20  an error-state, 
26670 6e 6f 77 20 69 73 20 61 20 63 68 61 6e 63 65 20  now is a chance 
26680 74 6f 20 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68  to clear.  ** th
26690 65 20 65 72 72 6f 72 2e 20 44 69 73 63 61 72 64  e error. Discard
266a0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
266b0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
266c0 20 61 6e 64 20 72 6f 6c 6c 62 61 63 6b 0a 20 20   and rollback.  
266d0 2a 2a 20 61 6e 79 20 68 6f 74 20 6a 6f 75 72 6e  ** any hot journ
266e0 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  al in the file-s
266f0 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66  ystem..  */.  if
26700 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
26710 65 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 4f  e ){.    if( isO
26720 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
26730 20 7c 7c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75   || pPager->zJou
26740 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 73  rnal ){.      is
26750 45 72 72 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a  ErrorReset = 1;.
26760 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
26770 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49  ->errCode = SQLI
26780 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72  TE_OK;.    pager
26790 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
267a0 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72    }..  if( pager
267b0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
267c0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
267d0 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 70 50 61  OpenSnapshot(pPa
267e0 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ger);.  }else if
267f0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
26800 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c  =PAGER_UNLOCK ||
26810 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b   isErrorReset ){
26820 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
26830 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
26840 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
26850 20 20 69 6e 74 20 69 73 48 6f 74 4a 6f 75 72 6e    int isHotJourn
26860 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  al = 0;.    asse
26870 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
26880 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
26890 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
268a0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
268b0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
268c0 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
268d0 6b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  k ){.      asser
268e0 74 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  t( pPager->readO
268f0 6e 6c 79 20 29 3b 0a 20 20 20 20 20 20 70 50 61  nly );.      pPa
26900 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
26910 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d  ER_SHARED;.    }
26920 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
26930 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
26940 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52  ock(pPager, SHAR
26950 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
26960 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26970 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
26980 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
26990 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
269a0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
269b0 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
269c0 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
269d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
269e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
269f0 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ate>=SHARED_LOCK
26a00 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61   );..    /* If a
26a10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
26a20 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20  ists, and there 
26a30 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c  is no RESERVED l
26a40 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
26a50 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
26a60 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20   then it either 
26a70 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
26a80 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74  ed back or delet
26a90 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
26aa0 66 28 20 21 69 73 45 72 72 6f 72 52 65 73 65 74  f( !isErrorReset
26ab0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
26ac0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  ( pPager->state 
26ad0 3c 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  <= PAGER_SHARED 
26ae0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61  );.      rc = ha
26af0 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sHotJournal(pPag
26b00 65 72 2c 20 26 69 73 48 6f 74 4a 6f 75 72 6e 61  er, &isHotJourna
26b10 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  l);.      if( rc
26b20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26b30 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
26b40 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ed;.      }.    
26b50 7d 0a 20 20 20 20 69 66 28 20 69 73 45 72 72 6f  }.    if( isErro
26b60 72 52 65 73 65 74 20 7c 7c 20 69 73 48 6f 74 4a  rReset || isHotJ
26b70 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
26b80 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
26b90 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
26ba0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
26bb0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
26bc0 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  is.      ** impo
26bd0 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
26be0 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
26bf0 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
26c00 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
26c10 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
26c20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65  lock. If it were
26c30 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  , another proces
26c40 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65  s might open the
26c50 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
26c60 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
26c70 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
26c80 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
26c90 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
26ca0 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61  * database is sa
26cb0 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65  fe to read while
26cc0 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
26cd0 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74   still rolling t
26ce0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74  he .      ** hot
26cf0 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20  -journal back.. 
26d00 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
26d10 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
26d20 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
26d30 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
26d40 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20  requested, any. 
26d50 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72       ** other pr
26d60 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67  ocess attempting
26d70 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
26d80 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
26d90 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20  l get to .      
26da0 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  ** this point in
26db0 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
26dc0 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73  il to obtain its
26dd0 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c   own EXCLUSIVE l
26de0 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  ock .      ** on
26df0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26e00 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  le..      */.   
26e10 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
26e20 74 61 74 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c  tate<EXCLUSIVE_L
26e30 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  OCK ){.        r
26e40 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
26e50 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58  k(pPager->fd, EX
26e60 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
26e70 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
26e80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26e90 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
26ea0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
26eb0 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  c);.          go
26ec0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
26ed0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
26ee0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
26ef0 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
26f00 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a      }. .      /*
26f10 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
26f20 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  l for read/write
26f30 20 61 63 63 65 73 73 2e 20 54 68 69 73 20 69 73   access. This is
26f40 20 62 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20   because in .   
26f50 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d     ** exclusive-
26f60 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20  access mode the 
26f70 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
26f80 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65  will be kept ope
26f90 6e 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70  n and.      ** p
26fa0 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72  ossibly used for
26fb0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c   a transaction l
26fc0 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65  ater on. On some
26fd0 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20   systems, the.  
26fe0 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74      ** OsTruncat
26ff0 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69 6e  e() call used in
27000 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
27010 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71 75  s mode also requ
27020 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  ires.      ** a 
27030 72 65 61 64 2f 77 72 69 74 65 20 66 69 6c 65 20  read/write file 
27040 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20 2a 2f  handle..      */
27050 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4f 70  .      if( !isOp
27060 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
27070 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
27080 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  es;.        rc =
27090 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
270a0 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a  (pVfs,pPager->zJ
270b0 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43  ournal,SQLITE_AC
270c0 43 45 53 53 5f 45 58 49 53 54 53 2c 26 72 65 73  CESS_EXISTS,&res
270d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
270e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
270f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65            if( re
27100 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
27110 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20   int fout = 0;. 
27120 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66             int f
27130 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
27140 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
27150 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
27160 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  L;.            a
27170 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
27180 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
27190 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
271a0 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
271b0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
271c0 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
271d0 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20  f, &fout);.     
271e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
271f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
27200 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
27210 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  fd) );.         
27220 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
27230 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c  E_OK && fout&SQL
27240 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
27250 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  Y ){.           
27260 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
27270 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
27280 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
27290 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
272a0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
272b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
272c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
272d0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f      /* If the jo
272e0 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65  urnal does not e
272f0 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79  xist, it usually
27300 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65   means that some
27310 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
27320 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
27330 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74  n managed to get
27340 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20   in and roll it 
27350 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20  back before .   
27360 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
27370 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61   connection obta
27380 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73 69  ined the exclusi
27390 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f  ve lock above. O
273a0 72 2c 20 69 74 20 0a 20 20 20 20 20 20 20 20 20  r, it .         
273b0 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74     ** may mean t
273c0 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61  hat the pager wa
273d0 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  s in the error-s
273e0 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20  tate when this. 
273f0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75             ** fu
27400 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
27410 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  d and the journa
27420 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  l file does not 
27430 65 78 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20  exist.  */.     
27440 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
27450 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
27460 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  n(pPager, 0);.  
27470 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27480 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
27490 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
274a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
274b0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
274c0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65    }..      /* Re
274d0 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  set the journal 
274e0 73 74 61 74 75 73 20 66 69 65 6c 64 73 20 74 6f  status fields to
274f0 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
27500 77 65 20 68 61 76 65 20 6e 6f 0a 20 20 20 20 20  we have no.     
27510 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75   ** rollback jou
27520 72 6e 61 6c 20 61 74 20 74 68 69 73 20 74 69 6d  rnal at this tim
27530 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67  e. */.      pPag
27540 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
27550 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ed = 0;.      pP
27560 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
27570 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
27580 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
27590 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
275a0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
275b0 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  . .      /* Make
275c0 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61   sure the journa
275d0 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  l file has been 
275e0 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20  synced to disk. 
275f0 2a 2f 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c  */. .      /* Pl
27600 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
27610 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
27620 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
27630 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  e write.      **
27640 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75   lock and reacqu
27650 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
27660 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63 61 63  k. Purge the cac
27670 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20  he before.      
27680 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  ** playing back 
27690 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  the hot-journal 
276a0 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74  so that we don't
276b0 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20   end up with.   
276c0 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69     ** an inconsi
276d0 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79  stent cache.  Sy
276e0 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e  nc the hot journ
276f0 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e  al before playin
27700 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61  g.      ** it ba
27710 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f  ck since the pro
27720 63 65 73 73 20 74 68 61 74 20 63 72 61 73 68 65  cess that crashe
27730 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68  d and left the h
27740 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  ot journal.     
27750 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64   ** probably did
27760 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64   not sync it and
27770 20 77 65 20 61 72 65 20 72 65 71 75 69 72 65 64   we are required
27780 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a   to always sync.
27790 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75        ** the jou
277a0 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79  rnal before play
277b0 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20  ing it back..   
277c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
277d0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
277e0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  fd) ){.        r
277f0 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74  c = pagerSyncHot
27800 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
27810 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
27820 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27830 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
27840 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
27850 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  er, 1);.        
27860 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
27870 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
27880 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
27890 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
278a0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20  , rc);.         
278b0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
278c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
278d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
278e0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
278f0 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20  GER_SHARED).    
27900 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
27910 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
27920 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74   && pPager->stat
27930 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a  e>PAGER_SHARED).
27940 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
27950 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
27960 70 42 61 63 6b 75 70 20 7c 7c 20 73 71 6c 69 74  pBackup || sqlit
27970 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e  e3PcachePagecoun
27980 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
27990 65 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  e)>0 ){.      /*
279a0 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b   The shared-lock
279b0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
279c0 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64  cquired on the d
279d0 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20  atabase file.   
279e0 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20     ** and there 
279f0 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65  are already page
27a00 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28  s in the cache (
27a10 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a  from a previous.
27a20 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72        ** read or
27a30 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
27a40 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  on).  Check to s
27a50 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ee if the databa
27a60 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  se.      ** has 
27a70 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20  been modified.  
27a80 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
27a90 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75  has changed, flu
27aa0 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  sh the.      ** 
27ab0 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  cache..      **.
27ac0 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73        ** Databas
27ad0 65 20 63 68 61 6e 67 65 73 20 69 73 20 64 65 74  e changes is det
27ae0 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67  ected by looking
27af0 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67   at 15 bytes beg
27b00 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  inning.      ** 
27b10 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74  at offset 24 int
27b20 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65  o the file.  The
27b30 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73   first 4 of thes
27b40 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20  e 16 bytes are. 
27b50 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74       ** a 32-bit
27b60 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73   counter that is
27b70 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74   incremented wit
27b80 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20  h each change.  
27b90 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  The.      ** oth
27ba0 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20  er bytes change 
27bb0 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61  randomly with ea
27bc0 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77  ch file change w
27bd0 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63  hen.      ** a c
27be0 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a  odec is in use..
27bf0 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
27c00 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61  ** There is a va
27c10 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
27c20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68  chance that a ch
27c30 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ange will not be
27c40 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63   .      ** detec
27c50 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65  ted.  The chance
27c60 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65   of an undetecte
27c70 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73  d change is so s
27c80 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20  mall that.      
27c90 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67  ** it can be neg
27ca0 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f  lected..      */
27cb0 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65  .      int nPage
27cc0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46  ;.      char dbF
27cd0 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70  ileVers[sizeof(p
27ce0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
27cf0 73 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  s)];.      sqlit
27d00 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
27d10 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
27d20 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ;..      if( pPa
27d30 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
27d40 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 50 61          rc = pPa
27d50 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
27d60 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
27d70 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
27d80 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b    if( nPage>0 ){
27d90 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
27da0 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c  (("CKVERS %p %d\
27db0 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65  n", pPager, size
27dc0 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29  of(dbFileVers)))
27dd0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
27de0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
27df0 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65  ger->fd, &dbFile
27e00 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
27e10 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20  ileVers), 24);. 
27e20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
27e30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27e40 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
27e50 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
27e60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27e70 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56    memset(dbFileV
27e80 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ers, 0, sizeof(d
27e90 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
27ea0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
27eb0 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64  memcmp(pPager->d
27ec0 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
27ed0 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
27ee0 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b  FileVers))!=0 ){
27ef0 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
27f00 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
27f10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
27f20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27f30 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
27f40 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
27f50 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
27f60 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
27f70 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20 69   is a WAL file i
27f80 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
27f90 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61 74  m, open this dat
27fa0 61 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20 20  abase in WAL.   
27fb0 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77   ** mode. Otherw
27fc0 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ise, the followi
27fd0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ng function call
27fe0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20   is a no-op..   
27ff0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
28000 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65  erOpenWalIfPrese
28010 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  nt(pPager);.  }.
28020 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  . failed:.  if( 
28030 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
28040 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 75 6e  .    /* pager_un
28050 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f  lock() is a no-o
28060 70 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20  p for exclusive 
28070 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f  mode and in-memo
28080 72 79 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f  ry databases. */
28090 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63  .    pager_unloc
280a0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
280b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
280c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65  *.** If the refe
280d0 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20  rence count has 
280e0 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f  reached zero, ro
280f0 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
28100 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
28110 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
28120 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63  pager..**.** Exc
28130 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  ept, in locking_
28140 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77  mode=EXCLUSIVE w
28150 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74  hen there is not
28160 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68  hing to in.** th
28170 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
28180 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69  al, the unlock i
28190 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20  s not performed 
281a0 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  and there is.** 
281b0 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62  nothing to rollb
281c0 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75  ack, so this rou
281d0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
281e0 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
281f0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
28200 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67  used(Pager *pPag
28210 65 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c 69  er){.  if( (sqli
28220 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
28230 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
28240 65 29 3d 3d 30 29 0a 20 20 20 26 26 20 28 21 70  e)==0).   && (!p
28250 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
28260 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mode || pPager->
28270 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 0a 20  journalOff>0) . 
28280 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c   ){.    pagerUnl
28290 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
282a0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Pager);.  }.}../
282b0 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72  *.** Acquire a r
282c0 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
282d0 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20   number pgno in 
282e0 70 61 67 65 72 20 70 50 61 67 65 72 20 28 61 20  pager pPager (a 
282f0 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  page.** referenc
28300 65 20 68 61 73 20 74 79 70 65 20 44 62 50 61 67  e has type DbPag
28310 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71 75  e*). If the requ
28320 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65 20  ested reference 
28330 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  is .** successfu
28340 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74  lly obtained, it
28350 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70   is copied to *p
28360 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45  pPage and SQLITE
28370 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
28380 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
28390 73 74 65 64 20 70 61 67 65 20 69 73 20 61 6c 72  sted page is alr
283a0 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68  eady in the cach
283b0 65 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e 65  e, it is returne
283c0 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  d. .** Otherwise
283d0 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a  , a new page obj
283e0 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ect is allocated
283f0 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
28400 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64  ith data.** read
28410 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
28420 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65  se file. In some
28430 20 63 61 73 65 73 2c 20 74 68 65 20 70 63 61 63   cases, the pcac
28440 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a  he module may.**
28450 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61   choose not to a
28460 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
28470 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61  ge object and ma
28480 79 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74  y reuse an exist
28490 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69  ing.** object wi
284a0 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  th no outstandin
284b0 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a  g references..**
284c0 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64 61  .** The extra da
284d0 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61  ta appended to a
284e0 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20   page is always 
284f0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a  initialized to z
28500 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72  eros the .** fir
28510 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  st time a page i
28520 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65  s loaded into me
28530 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61 67  mory. If the pag
28540 65 20 72 65 71 75 65 73 74 65 64 20 69 73 20 0a  e requested is .
28550 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
28560 65 20 63 61 63 68 65 20 77 68 65 6e 20 74 68 69  e cache when thi
28570 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
28580 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65  lled, then the e
28590 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20  xtra.** data is 
285a0 6c 65 66 74 20 61 73 20 69 74 20 77 61 73 20 77  left as it was w
285b0 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a  hen the page obj
285c0 65 63 74 20 77 61 73 20 6c 61 73 74 20 75 73 65  ect was last use
285d0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
285e0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 69  database image i
285f0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  s smaller than t
28600 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
28610 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f  e or if a .** no
28620 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20  n-zero value is 
28630 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f  passed as the no
28640 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65  Content paramete
28650 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65  r and the .** re
28660 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
28670 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72  not already stor
28680 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  ed in the cache,
28690 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74   then no .** act
286a0 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63  ual disk read oc
286b0 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  curs. In this ca
286c0 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d  se the memory im
286d0 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  age of the .** p
286e0 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
286f0 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e  ed to all zeros.
28700 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e   .**.** If noCon
28710 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74  tent is true, it
28720 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
28730 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
28740 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   the contents.**
28750 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54 68   of the page. Th
28760 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f  is occurs in two
28770 20 73 65 70 65 72 61 74 65 20 73 63 65 6e 61 72   seperate scenar
28780 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  ios:.**.**   a) 
28790 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66  When reading a f
287a0 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
287b0 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
287c0 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  base, and.**.** 
287d0 20 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65    b) When a save
287e0 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72  point is being r
287f0 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77  olled back and w
28800 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a  e need to load.*
28810 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67  *      a new pag
28820 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  e into the cache
28830 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69   to be filled wi
28840 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64  th the data read
28850 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68  .**      from th
28860 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72  e savepoint jour
28870 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  nal..**.** If no
28880 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c  Content is true,
28890 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 72   then the data r
288a0 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65  eturned is zeroe
288b0 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
288c0 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20  being read from 
288d0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64  the database. Ad
288e0 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20  ditionally, the 
288f0 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  bits correspondi
28900 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e  ng.** to pgno in
28910 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
28920 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70 61 67  l (bitvec of pag
28930 65 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 74  es already writt
28940 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75  en to the.** jou
28950 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74  rnal file) and t
28960 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
28970 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62  t.pInSavepoint b
28980 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70  itvecs of any op
28990 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73  en.** savepoints
289a0 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d   are set. This m
289b0 65 61 6e 73 20 69 66 20 74 68 65 20 70 61 67 65  eans if the page
289c0 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c   is made writabl
289d0 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e  e at any.** poin
289e0 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c  t in the future,
289f0 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f   using a call to
28a00 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
28a10 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e  te(), its conten
28a20 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  ts.** will not b
28a30 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69  e journaled. Thi
28a40 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a  s saves IO..**.*
28a50 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
28a60 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
28a70 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
28a80 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
28a90 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
28aa0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
28ab0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
28ac0 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
28ad0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
28ae0 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
28af0 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68  rLookup().  Both
28b00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
28b10 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d  d Lookup() attem
28b20 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20  pt.** to find a 
28b30 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d  page in the in-m
28b40 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73  emory cache firs
28b50 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  t.  If the page 
28b60 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
28b70 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69  * in memory, thi
28b80 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  s routine goes t
28b90 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69  o disk to read i
28ba0 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f  t in whereas Loo
28bb0 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65  kup().** just re
28bc0 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72  turns 0.  This r
28bd0 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20  outine acquires 
28be0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20  a read-lock the 
28bf0 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a  first time it.**
28c00 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69   has to go to di
28c10 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c  sk, and could al
28c20 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f  so playback an o
28c30 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ld journal if ne
28c40 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63  cessary..** Sinc
28c50 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72  e Lookup() never
28c60 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
28c70 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
28c80 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
28c90 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
28ca0 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
28cb0 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 0a  e3PagerAcquire(.
28cc0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
28cd0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
28ce0 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64  er open on the d
28cf0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
28d00 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
28d10 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
28d20 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f  mber to fetch */
28d30 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61  .  DbPage **ppPa
28d40 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ge,    /* Write 
28d50 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
28d60 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
28d70 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20  int noContent   
28d80 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f      /* Do not bo
28d90 74 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e  ther reading con
28da0 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69  tent from disk i
28db0 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69  f true */.){.  i
28dc0 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
28dd0 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pPg;..  assert( 
28de0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
28df0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
28e00 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
28e10 73 74 61 74 65 3e 50 41 47 45 52 5f 55 4e 4c 4f  state>PAGER_UNLO
28e20 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e  CK );..  if( pgn
28e30 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  o==0 ){.    retu
28e40 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
28e50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
28e60 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
28e70 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
28e80 74 61 74 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  tate, return an 
28e90 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c  error immediatel
28ea0 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  y. .  ** Otherwi
28eb0 73 65 2c 20 72 65 71 75 65 73 74 20 74 68 65 20  se, request the 
28ec0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 50 43  page from the PC
28ed0 61 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20  ache layer. */. 
28ee0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
28ef0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code!=SQLITE_OK 
28f00 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
28f10 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
28f20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
28f30 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
28f40 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
28f50 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
28f60 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
28f70 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 70 70 50 61  e, pgno, 1, ppPa
28f80 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ge);.  }..  if( 
28f90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
28fa0 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74  .    /* Either t
28fb0 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
28fc0 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20  e3PcacheFetch() 
28fd0 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f  returned an erro
28fe0 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  r or the.    ** 
28ff0 70 61 67 65 72 20 77 61 73 20 61 6c 72 65 61 64  pager was alread
29000 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  y in the error-s
29010 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
29020 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
29030 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 70  ed..    ** Set p
29040 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70  Pg to 0 and jump
29050 20 74 6f 20 74 68 65 20 65 78 63 65 70 74 69 6f   to the exceptio
29060 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20  n handler.  */. 
29070 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20     pPg = 0;.    
29080 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
29090 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73  re_err;.  }.  as
290a0 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d  sert( (*ppPage)-
290b0 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20  >pgno==pgno );. 
290c0 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
290d0 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  e)->pPager==pPag
290e0 65 72 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d  er || (*ppPage)-
290f0 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20  >pPager==0 );.. 
29100 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e   if( (*ppPage)->
29110 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e  pPager && !noCon
29120 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  tent ){.    /* I
29130 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
29140 70 63 61 63 68 65 20 61 6c 72 65 61 64 79 20 63  pcache already c
29150 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69  ontains an initi
29160 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20  alized copy of. 
29170 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20     ** the page. 
29180 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66  Return without f
29190 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a  urther ado.  */.
291a0 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
291b0 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  <=PAGER_MAX_PGNO
291c0 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f   && pgno!=PAGER_
291d0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
291e0 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43  );.    PAGER_INC
291f0 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b  R(pPager->nHit);
29200 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
29210 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b  TE_OK;..  }else{
29220 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
29230 72 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61  r cache has crea
29240 74 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20  ted a new page. 
29250 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64  Its content need
29260 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20  s to .    ** be 
29270 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f  initialized.  */
29280 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 0a  .    int nMax;..
29290 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
292a0 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20  Pager->nMiss);. 
292b0 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65     pPg = *ppPage
292c0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  ;.    pPg->pPage
292d0 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20  r = pPager;..   
292e0 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
292f0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32  page number is 2
29300 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ^31. Return SQLI
29310 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20  TE_CORRUPT if a 
29320 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62  page.    ** numb
29330 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
29340 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75  this, or the unu
29350 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65  sed locking-page
29360 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 20  , is requested. 
29370 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  */.    if( pgno>
29380 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c  PAGER_MAX_PGNO |
29390 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
293a0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
293b0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
293c0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
293d0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
293e0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
293f0 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 73     }..    rc = s
29400 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
29410 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 4d  ount(pPager, &nM
29420 61 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ax);.    if( rc!
29430 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29440 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
29450 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
29460 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  }..    if( MEMDB
29470 20 7c 7c 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67   || nMax<(int)pg
29480 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20  no || noContent 
29490 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  || !isOpen(pPage
294a0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20  r->fd) ){.      
294b0 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
294c0 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  >mxPgno ){.     
294d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
294e0 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ULL;.        got
294f0 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
29500 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
29510 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74     if( noContent
29520 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
29530 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68  ailure to set th
29540 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e  e bits in the In
29550 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74  Journal bit-vect
29560 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20  ors is benign.. 
29570 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72         ** It mer
29580 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77  ely means that w
29590 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20  e might do some 
295a0 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f  extra work to jo
295b0 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20  urnal a .       
295c0 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f   ** page that do
295d0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
295e0 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65  e journaled.  Ne
295f0 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73  vertheless, be s
29600 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
29610 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73 65  to test the case
29620 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20   where a malloc 
29630 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
29640 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74  le trying to set
29650 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62   .        ** a b
29660 69 74 20 69 6e 20 61 20 62 69 74 20 76 65 63 74  it in a bit vect
29670 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  or..        */. 
29680 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
29690 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
296a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
296b0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
296c0 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  rigSize ){.     
296d0 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
296e0 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74  c = ) sqlite3Bit
296f0 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
29700 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29  InJournal, pgno)
29710 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
29720 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
29730 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
29740 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54    }.        TEST
29750 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64  ONLY( rc = ) add
29760 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
29770 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  cs(pPager, pgno)
29780 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
29790 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
297a0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
297b0 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
297c0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
297d0 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
297e0 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50  Pg->pData, 0, pP
297f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
29800 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
29810 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20  "ZERO %p %d\n", 
29820 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
29830 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29840 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
29850 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
29860 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
29870 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  bPage(pPg);.    
29880 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29890 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
298a0 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
298b0 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
298c0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
298d0 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
298e0 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
298f0 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
29900 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
29910 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
29920 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61  ITE_OK;..pager_a
29930 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73  cquire_err:.  as
29940 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
29950 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67  _OK );.  if( pPg
29960 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
29970 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a  cacheDrop(pPg);.
29980 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63    }.  pagerUnloc
29990 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
299a0 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  );..  *ppPage = 
299b0 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
299c0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
299d0 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73   a page if it is
299e0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
299f0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
29a00 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64    Do.** not read
29a10 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64   the page from d
29a20 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70  isk.  Return a p
29a30 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
29a40 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74  ge,.** or 0 if t
29a50 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
29a60 6e 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 20 72  n cache. Also, r
29a70 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 0a  eturn 0 if the .
29a80 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20 50  ** pager is in P
29a90 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74  AGER_UNLOCK stat
29aa0 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
29ab0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a  tion is called,.
29ac0 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 70 61 67  ** or if the pag
29ad0 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f  er is in an erro
29ae0 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68  r state other th
29af0 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 0a  an SQLITE_FULL..
29b00 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
29b10 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
29b20 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
29b30 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
29b40 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
29b50 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
29b60 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77  is that _get() w
29b70 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69  ill go to the di
29b80 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69  sk and read.** i
29b90 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68  n the page if th
29ba0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
29bb0 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20  ready in cache. 
29bc0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
29bd0 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
29be0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
29bf0 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20   in cache or if 
29c00 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72  a disk I/O error
29c10 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61   .** has ever ha
29c20 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67  ppened..*/.DbPag
29c30 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c  e *sqlite3PagerL
29c40 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
29c50 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
29c60 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
29c70 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  0;.  assert( pPa
29c80 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
29c90 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
29ca0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
29cb0 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20  >pPCache!=0 );. 
29cc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
29cd0 3e 73 74 61 74 65 20 3e 20 50 41 47 45 52 5f 55  >state > PAGER_U
29ce0 4e 4c 4f 43 4b 20 29 3b 0a 20 20 73 71 6c 69 74  NLOCK );.  sqlit
29cf0 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
29d00 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
29d10 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20  gno, 0, &pPg);. 
29d20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a   return pPg;.}..
29d30 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
29d40 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a  page reference..
29d50 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
29d60 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
29d70 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
29d80 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
29d90 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
29da0 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
29db0 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
29dc0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
29dd0 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
29de0 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
29df0 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
29e00 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
29e10 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
29e20 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  emoved..*/.void 
29e30 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
29e40 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
29e50 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
29e60 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
29e70 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
29e80 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
29e90 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 20  elease(pPg);.   
29ea0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
29eb0 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20  used(pPager);.  
29ec0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  }.}../*.** If th
29ed0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
29ee0 69 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ile has already 
29ef0 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 65 6e 73  been opened, ens
29f00 75 72 65 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ure that the.** 
29f10 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
29f20 20 69 73 20 6f 70 65 6e 20 74 6f 6f 2e 20 49 66   is open too. If
29f30 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
29f40 6c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 0a 2a  l is not open,.*
29f50 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
29f60 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
29f70 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
29f80 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79  eturned if every
29f90 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72  thing goes accor
29fa0 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 0a 2a  ding to plan. .*
29fb0 2a 20 41 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  * An SQLITE_IOER
29fc0 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65  R_XXX error code
29fd0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
29fe0 61 20 63 61 6c 6c 20 74 6f 20 0a 2a 2a 20 73 71  a call to .** sq
29ff0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 66 61  lite3OsOpen() fa
2a000 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
2a010 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61  nt openSubJourna
2a020 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
2a030 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2a040 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 28 70  ITE_OK;.  if( (p
2a050 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2a060 72 29 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  r) || isOpen(pPa
2a070 67 65 72 2d 3e 6a 66 64 29 29 20 26 26 20 21 69  ger->jfd)) && !i
2a080 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
2a090 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70  fd) ){.    if( p
2a0a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2a0b0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
2a0c0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20  LMODE_MEMORY || 
2a0d0 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65  pPager->subjInMe
2a0e0 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71  mory ){.      sq
2a0f0 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f  lite3MemJournalO
2a100 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
2a110 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2a120 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
2a130 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
2a140 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c  Pager->sjfd, SQL
2a150 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
2a160 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  NAL);.    }.  }.
2a170 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2a180 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2a190 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74  ion is called at
2a1a0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 76   the start of ev
2a1b0 65 72 79 20 77 72 69 74 65 20 74 72 61 6e 73 61  ery write transa
2a1c0 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20  ction..** There 
2a1d0 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62 65 20  must already be 
2a1e0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
2a1f0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
2a200 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
2a210 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
2a220 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2a230 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  d..**.** Open th
2a240 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
2a250 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
2a260 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72  and write a jour
2a270 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f  nal header.** to
2a280 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74   the start of it
2a290 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  . If there are a
2a2a0 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
2a2b0 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  , open the sub-j
2a2c0 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c  ournal.** as wel
2a2d0 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  l. This function
2a2e0 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68   is only used wh
2a2f0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
2a300 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a  ile is being .**
2a310 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65   opened to write
2a320 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20   a rollback log 
2a330 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
2a340 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65  n. It is not use
2a350 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69  d .** when openi
2a360 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ng a hot journal
2a370 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74   file to roll it
2a380 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
2a390 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2a3a0 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
2a3b0 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69   (as it may be i
2a3c0 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
2a3d0 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  ),.** then this 
2a3e0 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72  function just wr
2a3f0 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68  ites a journal h
2a400 65 61 64 65 72 20 74 6f 20 74 68 65 20 73 74 61  eader to the sta
2a410 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72  rt of the.** alr
2a420 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20  eady open file. 
2a430 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
2a440 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
2a450 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
2a460 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
2a470 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e  n, the.** Pager.
2a480 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65  pInJournal bitve
2a490 63 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  c structure is a
2a4a0 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  llocated..**.** 
2a4b0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
2a4c0 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
2a4d0 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74  s successful. Ot
2a4e0 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
2a4f0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
2a500 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
2a510 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65  to allocate Page
2a520 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69  r.pInJournal fai
2a530 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f  ls, or .** an IO
2a540 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f   error code if o
2a550 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  pening or writin
2a560 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
2a570 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  le fails..*/.sta
2a580 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
2a590 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
2a5a0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2a5b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2a5e0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2a5f0 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
2a600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a610 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2a620 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
2a630 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
2a640 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
2a650 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20  pPager->pVfs;   
2a660 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
2a670 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f  f vfs pointer */
2a680 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
2a690 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
2a6a0 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61  _RESERVED );.  a
2a6b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
2a6c0 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  seJournal );.  a
2a6d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
2a6e0 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
2a6f0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
2a700 46 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  F );.  assert( p
2a710 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
2a720 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  l==0 );.  .  /* 
2a730 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  If already in th
2a740 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74  e error state, t
2a750 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2a760 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e  a no-op.  But on
2a770 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20  .  ** the other 
2a780 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69  hand, this routi
2a790 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
2a7a0 65 64 20 69 66 20 77 65 20 61 72 65 20 61 6c 72  ed if we are alr
2a7b0 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20  eady in.  ** an 
2a7c0 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a  error state. */.
2a7d0 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
2a7e0 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72  er->errCode) ) r
2a7f0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
2a800 72 43 6f 64 65 3b 0a 0a 20 20 74 65 73 74 63 61  rCode;..  testca
2a810 73 65 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  se( pPager->dbSi
2a820 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20  zeValid==0 );.  
2a830 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2a840 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
2a850 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66  r, &nPage);.  if
2a860 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2a870 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ;.  pPager->pInJ
2a880 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
2a890 42 69 74 76 65 63 43 72 65 61 74 65 28 6e 50 61  BitvecCreate(nPa
2a8a0 67 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ge);.  if( pPage
2a8b0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
2a8c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2a8d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
2a8e0 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
2a8f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
2a900 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
2a910 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 69 66 28  y open. */.  if(
2a920 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
2a930 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28  >jfd) ){.    if(
2a940 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2a950 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
2a960 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
2a970 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d  {.      sqlite3M
2a980 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50  emJournalOpen(pP
2a990 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
2a9a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e  }else{.      con
2a9b0 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20  st int flags =  
2a9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a9d0 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f   /* VFS flags to
2a9e0 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
2a9f0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  le */.        SQ
2aa00 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
2aa10 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
2aa20 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20  CREATE|.        
2aa30 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  (pPager->tempFil
2aa40 65 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 28  e ? .          (
2aa50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
2aa60 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45  TEONCLOSE|SQLITE
2aa70 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
2aa80 41 4c 29 3a 0a 20 20 20 20 20 20 20 20 20 20 28  AL):.          (
2aa90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2aaa0 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20 20  _JOURNAL).      
2aab0 20 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49    );.#ifdef SQLI
2aac0 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
2aad0 5f 57 52 49 54 45 0a 20 20 20 20 20 20 72 63 20  _WRITE.      rc 
2aae0 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
2aaf0 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20  Open(.          
2ab00 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
2ab10 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
2ab20 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c  jfd, flags, jrnl
2ab30 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65  BufferSize(pPage
2ab40 72 29 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 73  r).      );.#els
2ab50 65 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  e.      rc = sql
2ab60 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
2ab70 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2ab80 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
2ab90 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69  flags, 0);.#endi
2aba0 66 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  f.    }.    asse
2abb0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
2abc0 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
2abd0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 7d 0a  er->jfd) );.  }.
2abe0 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  ..  /* Write the
2abf0 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
2ac00 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75  eader to the jou
2ac10 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70  rnal file and op
2ac20 65 6e 20 0a 20 20 2a 2a 20 74 68 65 20 73 75 62  en .  ** the sub
2ac30 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65  -journal if nece
2ac40 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ssary..  */.  if
2ac50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ac60 29 7b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  ){.    /* TODO: 
2ac70 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20  Check if all of 
2ac80 74 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79  these are really
2ac90 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
2aca0 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67    pPager->dbOrig
2acb0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
2acc0 62 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65  bSize;.    pPage
2acd0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
2ace0 64 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  d = 0;.    pPage
2acf0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
2ad00 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
2ad10 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  c = 0;.    pPage
2ad20 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
2ad30 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
2ad40 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
2ad50 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2ad60 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 72 63  lHdr = 0;.    rc
2ad70 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
2ad80 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  dr(pPager);.  }.
2ad90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ada0 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6e  _OK && pPager->n
2adb0 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
2adc0 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75   rc = openSubJou
2add0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
2ade0 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
2adf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
2ae00 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
2ae10 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
2ae20 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  urnal);.    pPag
2ae30 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
2ae40 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
2ae50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65   rc;.}../*.** Be
2ae60 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  gin a write-tran
2ae70 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73  saction on the s
2ae80 70 65 63 69 66 69 65 64 20 70 61 67 65 72 20 6f  pecified pager o
2ae90 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20  bject. If a .** 
2aea0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
2aeb0 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
2aec0 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20  en opened, this 
2aed0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
2aee0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  -op..**.** If th
2aef0 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e  e exFlag argumen
2af00 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  t is false, then
2af10 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73   acquire at leas
2af20 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  t a RESERVED.** 
2af30 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
2af40 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78  base file. If ex
2af50 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  Flag is true, th
2af60 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65  en acquire at le
2af70 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53  ast.** an EXCLUS
2af80 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63  IVE lock. If suc
2af90 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  h a lock is alre
2afa0 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63  ady held, no loc
2afb0 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  king .** functio
2afc0 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65  ns need be calle
2afd0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  d..**.** If this
2afe0 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72   is not a tempor
2aff0 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79  ary or in-memory
2b000 20 66 69 6c 65 20 61 6e 64 2c 20 74 68 65 20 6a   file and, the j
2b010 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a  ournal file is .
2b020 2a 2a 20 6f 70 65 6e 65 64 20 69 66 20 69 74 20  ** opened if it 
2b030 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 72  has not been alr
2b040 65 61 64 79 2e 20 46 6f 72 20 61 20 74 65 6d 70  eady. For a temp
2b050 6f 72 61 72 79 20 66 69 6c 65 2c 20 74 68 65 20  orary file, the 
2b060 6f 70 65 6e 69 6e 67 20 0a 2a 2a 20 6f 66 20 74  opening .** of t
2b070 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2b080 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
2b090 6c 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 63  l there is an ac
2b0a0 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 0a 2a 2a  tual need to .**
2b0b0 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
2b0c0 75 72 6e 61 6c 2e 20 54 4f 44 4f 3a 20 57 68 79  urnal. TODO: Why
2b0d0 20 68 61 6e 64 6c 65 20 74 65 6d 70 6f 72 61 72   handle temporar
2b0e0 79 20 66 69 6c 65 73 20 64 69 66 66 65 72 65 6e  y files differen
2b0f0 74 6c 79 3f 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  tly?.**.** If th
2b100 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2b110 73 20 6f 70 65 6e 65 64 20 28 6f 72 20 69 66 20  s opened (or if 
2b120 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  it is already op
2b130 65 6e 29 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 6a  en), then a.** j
2b140 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73  ournal-header is
2b150 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2b160 73 74 61 72 74 20 6f 66 20 69 74 2e 0a 2a 2a 0a  start of it..**.
2b170 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e  ** If the subjIn
2b180 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20  Memory argument 
2b190 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
2b1a0 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61  n any sub-journa
2b1b0 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68  l opened.** with
2b1c0 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
2b1d0 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e  ion will be open
2b1e0 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ed as an in-memo
2b1f0 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a  ry file. This.**
2b200 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69   has no effect i
2b210 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  f the sub-journa
2b220 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  l is already ope
2b230 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79 20 62  ned (as it may b
2b240 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e  e when.** runnin
2b250 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
2b260 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65 20 74  ode) or if the t
2b270 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20  ransaction does 
2b280 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a  not require a.**
2b290 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66   sub-journal. If
2b2a0 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   the subjInMemor
2b2b0 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65  y argument is ze
2b2c0 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ro, then any req
2b2d0 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75  uired.** sub-jou
2b2e0 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e  rnal is implemen
2b2f0 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66  ted in-memory if
2b300 20 70 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e   pPager is an in
2b310 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
2b320 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61  , .** or using a
2b330 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2b340 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
2b350 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  t sqlite3PagerBe
2b360 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
2b370 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69  r, int exFlag, i
2b380 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29  nt subjInMemory)
2b390 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2b3a0 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
2b3b0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
2b3c0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
2b3d0 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  .  pPager->subjI
2b3e0 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75  nMemory = (u8)su
2b3f0 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69  bjInMemory;..  i
2b400 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
2b410 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  ==PAGER_SHARED )
2b420 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2b430 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
2b440 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
2b450 74 28 20 21 4d 45 4d 44 42 20 26 26 20 21 70 50  t( !MEMDB && !pP
2b460 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
2b470 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  ;..    if( pager
2b480 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
2b490 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
2b4a0 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69  e pager is confi
2b4b0 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63  gured to use loc
2b4c0 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
2b4d0 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20  ive, and an.    
2b4e0 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c    ** exclusive l
2b4f0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
2b500 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ase is not alrea
2b510 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20  dy held, obtain 
2b520 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f  it now..      */
2b530 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
2b540 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
2b550 20 26 26 20 21 73 71 6c 69 74 65 33 57 61 6c 45   && !sqlite3WalE
2b560 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
2b570 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29  ger->pWal, -1) )
2b580 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
2b590 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
2b5a0 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49  ger->fd, EXCLUSI
2b5b0 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
2b5c0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
2b5d0 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
2b5e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2b5f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b600 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2b610 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2b620 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45 78      sqlite3WalEx
2b630 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
2b640 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20  er->pWal, 1);.  
2b650 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
2b660 47 72 61 62 20 74 68 65 20 77 72 69 74 65 20 6c  Grab the write l
2b670 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66  ock on the log f
2b680 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66  ile. If successf
2b690 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0a 20  ul, upgrade to. 
2b6a0 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 52 45       ** PAGER_RE
2b6b0 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 4f 74  SERVED state. Ot
2b6c0 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
2b6d0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  an error code to
2b6e0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20   the caller..   
2b6f0 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79 2d 68     ** The busy-h
2b700 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e  andler is not in
2b710 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68 65 72  voked if another
2b720 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65   connection alre
2b730 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c  ady.      ** hol
2b740 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63  ds the write-loc
2b750 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  k. If possible, 
2b760 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
2b770 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20  will call it..  
2b780 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2b790 57 41 4c 20 6d 6f 64 65 20 73 65 74 73 20 50 61  WAL mode sets Pa
2b7a0 67 65 72 2e 73 74 61 74 65 20 74 6f 20 50 41 47  ger.state to PAG
2b7b0 45 52 5f 52 45 53 45 52 56 45 44 20 77 68 65 6e  ER_RESERVED when
2b7c0 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 0a   it has an open.
2b7d0 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
2b7e0 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65 72 20  tion, but never 
2b7f0 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  to PAGER_EXCLUSI
2b800 56 45 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  VE. This is beca
2b810 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a  use in .      **
2b820 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
2b830 20 73 74 61 74 65 20 74 68 65 20 63 6f 64 65 20   state the code 
2b840 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76  to roll back sav
2b850 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69  epoint transacti
2b860 6f 6e 73 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79  ons.      ** may
2b870 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   copy data from 
2b880 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
2b890 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
2b8a0 65 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 0a 20  e file as well. 
2b8b0 20 20 20 20 20 2a 2a 20 61 73 20 69 6e 74 6f 20       ** as into 
2b8c0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
2b8d0 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69  Which would be i
2b8e0 6e 63 6f 72 72 65 63 74 20 69 6e 20 57 41 4c 20  ncorrect in WAL 
2b8f0 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  mode..      */. 
2b900 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2b910 33 57 61 6c 57 72 69 74 65 4c 6f 63 6b 28 70 50  3WalWriteLock(pP
2b920 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a  ager->pWal, 1);.
2b930 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2b940 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b950 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69     pPager->dbOri
2b960 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  gSize = pPager->
2b970 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  dbSize;.        
2b980 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
2b990 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a  PAGER_RESERVED;.
2b9a0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2b9b0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
2b9c0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
2b9d0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
2b9e0 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
2b9f0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
2ba00 45 52 56 45 44 20 29 3b 0a 20 20 20 20 20 20 61  ERVED );.      a
2ba10 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
2ba20 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
2ba30 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
2ba40 52 45 44 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  RED );.    }else
2ba50 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69  {.      /* Obtai
2ba60 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
2ba70 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2ba80 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65  e file. If the e
2ba90 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a  xFlag parameter.
2baa0 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65        ** is true
2bab0 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65  , then immediate
2bac0 6c 79 20 75 70 67 72 61 64 65 20 74 68 69 73 20  ly upgrade this 
2bad0 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
2bae0 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20  lock. The.      
2baf0 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  ** busy-handler 
2bb00 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20  callback can be 
2bb10 75 73 65 64 20 77 68 65 6e 20 75 70 67 72 61 64  used when upgrad
2bb20 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55  ing to the EXCLU
2bb30 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  SIVE.      ** lo
2bb40 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e  ck, but not when
2bb50 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52   obtaining the R
2bb60 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20  ESERVED lock..  
2bb70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2bb80 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
2bb90 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45  pPager->fd, RESE
2bba0 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  RVED_LOCK);.    
2bbb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2bbc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
2bbd0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
2bbe0 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20  AGER_RESERVED;. 
2bbf0 20 20 20 20 20 20 20 69 66 28 20 65 78 46 6c 61         if( exFla
2bc00 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  g ){.          r
2bc10 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
2bc20 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
2bc30 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
2bc40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bc50 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2bc60 4e 6f 20 6e 65 65 64 20 74 6f 20 6f 70 65 6e 20  No need to open 
2bc70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2bc80 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20   at this time.  
2bc90 49 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a  It will be.    *
2bca0 2a 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  * opened before 
2bcb0 69 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  it is written to
2bcc0 2e 20 20 49 66 20 77 65 20 64 65 66 65 72 20 6f  .  If we defer o
2bcd0 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  pening the journ
2bce0 61 6c 2c 0a 20 20 20 20 2a 2a 20 77 65 20 6d 69  al,.    ** we mi
2bcf0 67 68 74 20 73 61 76 65 20 74 68 65 20 77 6f 72  ght save the wor
2bd00 6b 20 6f 66 20 63 72 65 61 74 69 6e 67 20 61 20  k of creating a 
2bd10 66 69 6c 65 20 69 66 20 74 68 65 20 74 72 61 6e  file if the tran
2bd20 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 65  saction.    ** e
2bd30 6e 64 73 20 75 70 20 62 65 69 6e 67 20 61 20 6e  nds up being a n
2bd40 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 7d  o-op..    */.  }
2bd50 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e 28  else if( isOpen(
2bd60 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
2bd70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2bd80 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ff==0 ){.    /* 
2bd90 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
2bda0 6e 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  n the pager was 
2bdb0 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
2bdc0 65 73 73 20 6d 6f 64 65 20 74 68 65 20 6c 61 73  ess mode the las
2bdd0 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20 61 20  t.    ** time a 
2bde0 28 72 65 61 64 20 6f 72 20 77 72 69 74 65 29 20  (read or write) 
2bdf0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
2be00 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e  successfully con
2be10 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20 62 79  cluded.    ** by
2be20 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
2be30 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64 65 6c  . Instead of del
2be40 65 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  eting the journa
2be50 6c 20 66 69 6c 65 20 69 74 20 77 61 73 20 0a 20  l file it was . 
2be60 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20     ** kept open 
2be70 61 6e 64 20 65 69 74 68 65 72 20 77 61 73 20 74  and either was t
2be80 72 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79  runcated to 0 by
2be90 74 65 73 20 6f 72 20 69 74 73 20 68 65 61 64 65  tes or its heade
2bea0 72 20 77 61 73 0a 20 20 20 20 2a 2a 20 6f 76 65  r was.    ** ove
2beb0 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 7a 65  rwritten with ze
2bec0 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ros..    */.    
2bed0 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
2bee0 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29  Wal(pPager)==0 )
2bef0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2bf00 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b  ager->nRec==0 );
2bf10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2bf20 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
2bf30 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2bf40 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
2bf50 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72  rnal==0 );.    r
2bf60 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
2bf70 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
2bf80 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43    }..  PAGERTRAC
2bf90 45 28 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20  E(("TRANSACTION 
2bfa0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
2bfb0 50 61 67 65 72 29 29 29 3b 0a 20 20 69 66 28 20  Pager)));.  if( 
2bfc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2bfd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
2bfe0 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
2bff0 20 29 3b 0a 20 20 20 20 2f 2a 20 49 67 6e 6f 72   );.    /* Ignor
2c000 65 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 74  e any IO error t
2c010 68 61 74 20 6f 63 63 75 72 73 20 77 69 74 68 69  hat occurs withi
2c020 6e 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  n pager_end_tran
2c030 73 61 63 74 69 6f 6e 28 29 2e 20 54 68 65 0a 20  saction(). The. 
2c040 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 20 6f 66     ** purpose of
2c050 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f   this call is to
2c060 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65 72   reset the inter
2c070 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
2c080 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 73 75   pager.    ** su
2c090 62 2d 73 79 73 74 65 6d 2e 20 49 74 20 64 6f 65  b-system. It doe
2c0a0 73 6e 27 74 20 6d 61 74 74 65 72 20 69 66 20 74  sn't matter if t
2c0b0 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
2c0c0 69 73 20 6e 6f 74 20 70 72 6f 70 65 72 6c 79 0a  is not properly.
2c0d0 20 20 20 20 2a 2a 20 66 69 6e 61 6c 69 7a 65 64      ** finalized
2c0e0 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 28   at this point (
2c0f0 73 69 6e 63 65 20 69 74 20 69 73 20 6e 6f 74 20  since it is not 
2c100 61 20 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20  a valid journal 
2c110 66 69 6c 65 20 61 6e 79 77 61 79 29 2e 0a 20 20  file anyway)..  
2c120 20 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 65    */.    pager_e
2c130 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
2c140 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20  Pager, 0);.  }. 
2c150 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2c160 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67  *.** Mark a sing
2c170 6c 65 20 64 61 74 61 20 70 61 67 65 20 61 73 20  le data page as 
2c180 77 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70  writeable. The p
2c190 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
2c1a0 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e  nto the .** main
2c1b0 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d   journal or sub-
2c1c0 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69  journal as requi
2c1d0 72 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65  red. If the page
2c1e0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
2c1f0 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a  .** one of the j
2c200 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72  ournals, the cor
2c210 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69  responding bit i
2c220 73 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a  s set in the .**
2c230 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
2c240 6c 20 62 69 74 76 65 63 20 61 6e 64 20 74 68 65  l bitvec and the
2c250 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
2c260 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74  pInSavepoint bit
2c270 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f  vecs.** of any o
2c280 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61  pen savepoints a
2c290 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a  s appropriate..*
2c2a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
2c2b0 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a  er_write(PgHdr *
2c2c0 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44  pPg){.  void *pD
2c2d0 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
2c2e0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
2c2f0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
2c300 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2c310 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69  TE_OK;..  /* Thi
2c320 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  s routine is not
2c330 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61   called unless a
2c340 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
2c350 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20   already been.  
2c360 2a 2a 20 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f  ** started..  */
2c370 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2c380 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
2c390 52 45 53 45 52 56 45 44 20 29 3b 0a 0a 20 20 2f  RESERVED );..  /
2c3a0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  * If an error ha
2c3b0 73 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c  s been previousl
2c3c0 79 20 64 65 74 65 63 74 65 64 2c 20 72 65 70 6f  y detected, repo
2c3d0 72 74 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f  rt the same erro
2c3e0 72 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 0a 20 20  r.  ** again..  
2c3f0 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
2c400 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
2c410 29 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  )  return pPager
2c420 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a  ->errCode;..  /*
2c430 20 48 69 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f   Higher-level ro
2c440 75 74 69 6e 65 73 20 6e 65 76 65 72 20 63 61 6c  utines never cal
2c450 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  l this function 
2c460 69 66 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  if database is n
2c470 6f 74 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c 65  ot.  ** writable
2c480 2e 20 20 42 75 74 20 63 68 65 63 6b 20 61 6e 79  .  But check any
2c490 77 61 79 2c 20 6a 75 73 74 20 66 6f 72 20 72 6f  way, just for ro
2c4a0 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69  bustness. */.  i
2c4b0 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
2c4c0 3e 72 65 61 64 4f 6e 6c 79 29 20 29 20 72 65 74  >readOnly) ) ret
2c4d0 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
2c4e0 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
2c4f0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
2c500 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28  ;..  CHECK_PAGE(
2c510 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b  pPg);..  /* Mark
2c520 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
2c530 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ty.  If the page
2c540 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
2c550 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  n written.  ** t
2c560 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  o the journal th
2c570 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e  en we can return
2c580 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a   right away..  *
2c590 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  /.  sqlite3Pcach
2c5a0 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b  eMakeDirty(pPg);
2c5b0 0a 20 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75  .  if( pageInJou
2c5c0 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21 73 75  rnal(pPg) && !su
2c5d0 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
2c5e0 50 67 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Pg) ){.    asser
2c5f0 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
2c600 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 70  pPager) );.    p
2c610 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
2c620 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 1;.  }else{.
2c630 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65  .    /* If we ge
2c640 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
2c650 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
2c660 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  ge needs to be. 
2c670 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f     ** written to
2c680 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2c690 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20   journal or the 
2c6a0 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  ckeckpoint journ
2c6b0 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74  al.    ** or bot
2c6c0 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  h..    **.    **
2c6d0 20 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72 6f   Higher level ro
2c6e0 75 74 69 6e 65 73 20 73 68 6f 75 6c 64 20 68 61  utines should ha
2c6f0 76 65 20 61 6c 72 65 61 64 79 20 73 74 61 72 74  ve already start
2c700 65 64 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ed a transaction
2c710 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 6d  ,.    ** which m
2c720 65 61 6e 73 20 74 68 65 79 20 68 61 76 65 20 61  eans they have a
2c730 63 71 75 69 72 65 64 20 74 68 65 20 6e 65 63 65  cquired the nece
2c740 73 73 61 72 79 20 6c 6f 63 6b 73 20 62 75 74 20  ssary locks but 
2c750 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 20  the rollback.   
2c760 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68   ** journal migh
2c770 74 20 6e 6f 74 20 79 65 74 20 62 65 20 6f 70 65  t not yet be ope
2c780 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  n..    */.    rc
2c790 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
2c7a0 65 67 69 6e 28 70 50 61 67 65 72 2c 20 30 2c 20  egin(pPager, 0, 
2c7b0 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65  pPager->subjInMe
2c7c0 6d 6f 72 79 29 3b 0a 20 20 20 20 69 66 28 20 72  mory);.    if( r
2c7d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2c7e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2c7f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
2c800 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2c810 66 64 29 20 0a 20 20 20 20 20 26 26 20 70 50 61  fd) .     && pPa
2c820 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2c830 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
2c840 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 26 26  ODE_OFF .     &&
2c850 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
2c860 61 67 65 72 29 0a 20 20 20 20 29 7b 0a 20 20 20  ager).    ){.   
2c870 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2c880 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
2c890 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2c8a0 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
2c8b0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
2c8c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c8d0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2c8e0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64   }.    pPager->d
2c8f0 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20  bModified = 1;. 
2c900 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61   .    /* The tra
2c910 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
2c920 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20   now exists and 
2c930 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56  we have a RESERV
2c940 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20  ED or an.    ** 
2c950 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2c960 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
2c970 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65  ase file.  Write
2c980 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
2c990 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  e to.    ** the 
2c9a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
2c9b0 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  nal if it is not
2c9c0 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
2c9d0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
2c9e0 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
2c9f0 67 29 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  g) && isOpen(pPa
2ca00 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
2ca10 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
2ca20 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2ca30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  );.      if( pPg
2ca40 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
2ca50 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20  dbOrigSize ){.  
2ca60 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b        u32 cksum;
2ca70 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
2ca80 44 61 74 61 32 3b 0a 0a 20 20 20 20 20 20 20 20  Data2;..        
2ca90 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76  /* We should nev
2caa0 65 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  er write to the 
2cab0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
2cac0 20 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20   page that.     
2cad0 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74     ** contains t
2cae0 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
2caf0 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
2cb00 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65  g assert verifie
2cb10 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  s.        ** tha
2cb20 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a  t we do not. */.
2cb30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2cb40 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52  pPg->pgno!=PAGER
2cb50 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
2cb60 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73   );..        ass
2cb70 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
2cb80 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65  rnalHdr <= pPage
2cb90 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b  r->journalOff );
2cba0 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 32 28  .        CODEC2(
2cbb0 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
2cbc0 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74  Pg->pgno, 7, ret
2cbd0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2cbe0 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  , pData2);.     
2cbf0 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72     cksum = pager
2cc00 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28  _cksum(pPager, (
2cc10 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20  u8*)pData2);.   
2cc20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
2cc30 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
2cc40 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
2cc50 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f  alOff, pPg->pgno
2cc60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2cc70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2cc80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2cc90 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
2cca0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61  ager->jfd, pData
2ccb0 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
2ccc0 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
2ccd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cce0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2ccf0 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20 20  alOff + 4);.    
2cd00 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
2cd10 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67  urnalOff += pPag
2cd20 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b 0a  er->pageSize+4;.
2cd30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cd40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2cd50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2cd60 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
2cd70 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  s(pPager->jfd, p
2cd80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2cd90 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20  f, cksum);.     
2cda0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
2cdb0 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20  rnalOff += 4;.  
2cdc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2cdd0 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25  IOTRACE(("JOUT %
2cde0 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  p %d %lld %d\n",
2cdf0 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
2ce00 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  no, .           
2ce10 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
2ce20 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72  urnalOff, pPager
2ce30 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20  ->pageSize));.  
2ce40 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
2ce50 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
2ce60 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20  ritej_count);.  
2ce70 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
2ce80 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  (("JOURNAL %d pa
2ce90 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
2cea0 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
2ceb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41  .             PA
2cec0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
2ced0 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20  Pg->pgno, .     
2cee0 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66          ((pPg->f
2cef0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
2cf00 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65  SYNC)?1:0), page
2cf10 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
2cf20 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  );..        /* E
2cf30 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20  ven if an IO or 
2cf40 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f  diskfull error o
2cf50 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 6a 6f  ccurred while jo
2cf60 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20  urnalling the.  
2cf70 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
2cf80 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65   the block above
2cf90 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73  , set the need-s
2cfa0 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65  ync flag for the
2cfb0 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a   page..        *
2cfc0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65  * Otherwise, whe
2cfd0 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
2cfe0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
2cff0 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20  , the logic in. 
2d000 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62 61         ** playba
2d010 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69  ck_one_page() wi
2d020 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68  ll think that th
2d030 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
2d040 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20 20  be restored.    
2d050 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61      ** in the da
2d060 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64  tabase file. And
2d070 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   if an IO error 
2d080 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69  occurs while doi
2d090 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a  ng so,.        *
2d0a0 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f  * then corruptio
2d0b0 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20  n may follow..  
2d0c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2d0d0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
2d0e0 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
2d0f0 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
2d100 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
2d110 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
2d120 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
2d130 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
2d140 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20      /* An error 
2d150 68 61 73 20 6f 63 63 75 72 72 65 64 20 77 72 69  has occurred wri
2d160 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72  ting to the jour
2d170 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20  nal file. The . 
2d180 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61         ** transa
2d190 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f  ction will be ro
2d1a0 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68 65  lled back by the
2d1b0 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20   layer above..  
2d1c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2d1d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2d1e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2d1f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2d200 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 50     }..        pP
2d210 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20  ager->nRec++;.  
2d220 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2d230 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
2d240 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  !=0 );.        r
2d250 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
2d260 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
2d270 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
2d280 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  no);.        tes
2d290 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
2d2a0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
2d2b0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
2d2c0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  QLITE_OK || rc==
2d2d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
2d2e0 20 20 20 20 20 20 20 20 72 63 20 7c 3d 20 61 64          rc |= ad
2d2f0 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
2d300 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
2d310 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
2d320 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2d330 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  K ){.          a
2d340 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
2d350 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
2d360 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2d370 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d380 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
2d390 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
2d3a0 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21 70  nalStarted && !p
2d3b0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
2d3c0 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
2d3d0 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
2d3e0 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
2d3f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
2d400 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
2d410 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45    }.        PAGE
2d420 52 54 52 41 43 45 28 28 22 41 50 50 45 4e 44 20  RTRACE(("APPEND 
2d430 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
2d440 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
2d450 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
2d460 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
2d470 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  >pgno,.         
2d480 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
2d490 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
2d4a0 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20  NC)?1:0)));.    
2d4b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
2d4c0 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
2d4d0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ment journal is 
2d4e0 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
2d4f0 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a  e is not in it,.
2d500 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74      ** then writ
2d510 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
2d520 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  ge to the statem
2d530 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f  ent journal.  No
2d540 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  te that.    ** t
2d550 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
2d560 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66  rnal format diff
2d570 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ers from the sta
2d580 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f  ndard journal fo
2d590 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74  rmat.    ** in t
2d5a0 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65  hat it omits the
2d5b0 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74   checksums and t
2d5c0 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a  he header..    *
2d5d0 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52 65  /.    if( subjRe
2d5e0 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
2d5f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75  ){.      rc = su
2d600 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
2d610 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
2d620 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61  /* Update the da
2d630 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20  tabase size and 
2d640 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61  return..  */.  a
2d650 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2d660 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
2d670 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ED );.  if( pPag
2d680 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e  er->dbSize<pPg->
2d690 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  pgno ){.    pPag
2d6a0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67  er->dbSize = pPg
2d6b0 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65  ->pgno;.  }.  re
2d6c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2d6d0 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61  * Mark a data pa
2d6e0 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e  ge as writeable.
2d6f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   This routine mu
2d700 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  st be called bef
2d710 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63  ore .** making c
2d720 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65  hanges to a page
2d730 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  . The caller mus
2d740 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75  t check the retu
2d750 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20  rn value .** of 
2d760 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
2d770 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74  d be careful not
2d780 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 79 20 70   to change any p
2d790 61 67 65 20 64 61 74 61 20 75 6e 6c 65 73 73 20  age data unless 
2d7a0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
2d7b0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
2d7c0 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  OK..**.** The di
2d7d0 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
2d7e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
2d7f0 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65 28 29  nd pager_write()
2d800 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a   is that this.**
2d810 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64   function also d
2d820 65 61 6c 73 20 77 69 74 68 20 74 68 65 20 73 70  eals with the sp
2d830 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65  ecial case where
2d840 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73   2 or more pages
2d850 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e  .** fit on a sin
2d860 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  gle disk sector.
2d870 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c   In this case al
2d880 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61  l co-resident pa
2d890 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65  ges.** must have
2d8a0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
2d8b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2d8c0 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
2d8d0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
2d8e0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51  error occurs, SQ
2d8f0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e  LITE_NOMEM or an
2d900 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
2d910 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 73  s returned.** as
2d920 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 4f 74   appropriate. Ot
2d930 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
2d940 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
2d950 65 33 50 61 67 65 72 57 72 69 74 65 28 44 62 50  e3PagerWrite(DbP
2d960 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20  age *pDbPage){. 
2d970 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2d980 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70  _OK;..  PgHdr *p
2d990 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  Pg = pDbPage;.  
2d9a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2d9b0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50  pPg->pPager;.  P
2d9c0 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74  gno nPagePerSect
2d9d0 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65  or = (pPager->se
2d9e0 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d  ctorSize/pPager-
2d9f0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69  >pageSize);..  i
2da00 66 28 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f  f( nPagePerSecto
2da10 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  r>1 ){.    Pgno 
2da20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20  nPageCount;     
2da30 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
2da40 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
2da50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2da60 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20  /.    Pgno pg1; 
2da70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da80 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66  /* First page of
2da90 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
2daa0 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a  is located on. *
2dab0 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b  /.    int nPage;
2dac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dad0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
2dae0 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  es starting at p
2daf0 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f  g1 to journal */
2db00 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20  .    int ii;    
2db10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2db20 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
2db30 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  /.    int needSy
2db40 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nc = 0;         
2db50 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 70  /* True if any p
2db60 61 67 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45  age has PGHDR_NE
2db70 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20  ED_SYNC */..    
2db80 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74  /* Set the doNot
2db90 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e 20  Sync flag to 1. 
2dba0 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
2dbb0 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  we cannot allow 
2dbc0 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  a journal.    **
2dbd0 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72   header to be wr
2dbe0 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68  itten between th
2dbf0 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65  e pages journale
2dc00 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
2dc10 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  on..    */.    a
2dc20 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
2dc30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2dc40 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d  ger->doNotSync==
2dc50 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
2dc60 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a  >doNotSync = 1;.
2dc70 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69  .    /* This tri
2dc80 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  ck assumes that 
2dc90 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69  both the page-si
2dca0 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69  ze and sector-si
2dcb0 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e  ze are.    ** an
2dcc0 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f   integer power o
2dcd0 66 20 32 2e 20 49 74 20 73 65 74 73 20 76 61 72  f 2. It sets var
2dce0 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65  iable pg1 to the
2dcf0 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20   identifier.    
2dd00 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
2dd10 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74  page of the sect
2dd20 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65  or pPg is locate
2dd30 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  d on..    */.   
2dd40 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67   pg1 = ((pPg->pg
2dd50 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50  no-1) & ~(nPageP
2dd60 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31  erSector-1)) + 1
2dd70 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
2dd80 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
2dd90 74 28 70 50 61 67 65 72 2c 20 28 69 6e 74 20 2a  t(pPager, (int *
2dda0 29 26 6e 50 61 67 65 43 6f 75 6e 74 29 3b 0a 20  )&nPageCount);. 
2ddb0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2ddc0 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70  rn rc;.    if( p
2ddd0 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f  Pg->pgno>nPageCo
2dde0 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
2ddf0 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20  ge = (pPg->pgno 
2de00 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65  - pg1)+1;.    }e
2de10 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61  lse if( (pg1+nPa
2de20 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e  gePerSector-1)>n
2de30 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
2de40 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
2de50 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20  Count+1-pg1;.   
2de60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50   }else{.      nP
2de70 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65  age = nPagePerSe
2de80 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ctor;.    }.    
2de90 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b  assert(nPage>0);
2dea0 0a 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c  .    assert(pg1<
2deb0 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  =pPg->pgno);.   
2dec0 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61   assert((pg1+nPa
2ded0 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ge)>pPg->pgno);.
2dee0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
2def0 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53  i<nPage && rc==S
2df00 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b  QLITE_OK; ii++){
2df10 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d  .      Pgno pg =
2df20 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50   pg1+ii;.      P
2df30 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20  gHdr *pPage;.   
2df40 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e     if( pg==pPg->
2df50 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33  pgno || !sqlite3
2df60 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
2df70 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
2df80 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  g) ){.        if
2df90 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  ( pg!=PAGER_MJ_P
2dfa0 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
2dfb0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2dfc0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
2dfd0 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65  ager, pg, &pPage
2dfe0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2dff0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2e000 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
2e010 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70   = pager_write(p
2e020 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2e030 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c     if( pPage->fl
2e040 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
2e050 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20  YNC ){.         
2e060 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
2e070 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
2e080 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
2e090 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20  needSync);.     
2e0a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e0b0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
2e0c0 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
2e0d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e0e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
2e0f0 20 69 66 28 20 28 70 50 61 67 65 20 3d 20 70 61   if( (pPage = pa
2e100 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
2e110 72 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a 20 20  r, pg))!=0 ){.  
2e120 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
2e130 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
2e140 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20  D_SYNC ){.      
2e150 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
2e160 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2e170 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
2e180 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
2e190 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2e1a0 20 2f 2a 20 49 66 20 74 68 65 20 50 47 48 44 52   /* If the PGHDR
2e1b0 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
2e1c0 69 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f  is set for any o
2e1d0 66 20 74 68 65 20 6e 50 61 67 65 20 70 61 67 65  f the nPage page
2e1e0 73 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69  s .    ** starti
2e1f0 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20  ng at pg1, then 
2e200 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  it needs to be s
2e210 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68  et for all of th
2e220 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20  em. Because.    
2e230 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  ** writing to an
2e240 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65  y of these nPage
2e250 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67   pages may damag
2e260 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68  e the others, th
2e270 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  e.    ** journal
2e280 20 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61   file must conta
2e290 69 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69  in sync()ed copi
2e2a0 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65  es of all of the
2e2b0 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  m.    ** before 
2e2c0 61 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20  any of them can 
2e2d0 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  be written out t
2e2e0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2e2f0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
2e300 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2e310 4b 20 26 26 20 6e 65 65 64 53 79 6e 63 20 29 7b  K && needSync ){
2e320 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
2e330 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
2e340 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  >noSync==0 );.  
2e350 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
2e360 3c 6e 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20  <nPage; ii++){. 
2e370 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50         PgHdr *pP
2e380 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  age = pager_look
2e390 75 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69  up(pPager, pg1+i
2e3a0 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i);.        if( 
2e3b0 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  pPage ){.       
2e3c0 20 20 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 20     pPage->flags 
2e3d0 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
2e3e0 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  NC;.          sq
2e3f0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2e400 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
2e410 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2e420 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
2e430 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a  eedSync);.    }.
2e440 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2e450 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d  ger->doNotSync==
2e460 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 );.    pPager-
2e470 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a  >doNotSync = 0;.
2e480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
2e490 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 44  = pager_write(pD
2e4a0 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  bPage);.  }.  re
2e4b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2e4c0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
2e4d0 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20   the page given 
2e4e0 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
2e4f0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70  was previously p
2e500 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69  assed.** to sqli
2e510 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2e  te3PagerWrite().
2e520 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
2e530 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
2e540 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20   it is ok.** to 
2e550 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65  change the conte
2e560 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nt of the page..
2e570 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
2e580 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  G.int sqlite3Pag
2e590 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44 62  erIswriteable(Db
2e5a0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
2e5b0 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26  turn pPg->flags&
2e5c0 50 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23  PGHDR_DIRTY;.}.#
2e5d0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  endif../*.** A c
2e5e0 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
2e5f0 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
2e600 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e  ger that it is n
2e610 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a  ot necessary to.
2e620 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66  ** write the inf
2e630 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65  ormation on page
2e640 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65   pPg back to the
2e650 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75   disk, even thou
2e660 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  gh.** that page 
2e670 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20  might be marked 
2e680 61 73 20 64 69 72 74 79 2e 20 20 54 68 69 73 20  as dirty.  This 
2e690 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61  happens, for exa
2e6a0 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68  mple, when.** th
2e6b0 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
2e6c0 61 64 64 65 64 20 61 73 20 61 20 6c 65 61 66 20  added as a leaf 
2e6d0 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
2e6e0 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f  and so its.** co
2e6f0 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20  ntent no longer 
2e700 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54  matters..**.** T
2e710 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66  he overlying sof
2e720 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c  tware layer call
2e730 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
2e740 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64  hen all of the d
2e750 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69  ata.** on the gi
2e760 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73  ven page is unus
2e770 65 64 2e 20 54 68 65 20 70 61 67 65 72 20 6d 61  ed. The pager ma
2e780 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20  rks the page as 
2e790 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74  clean so.** that
2e7a0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74   it does not get
2e7b0 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
2e7c0 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68  ..**.** Tests sh
2e7d0 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74  ow that this opt
2e7e0 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75  imization can qu
2e7f0 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65  adruple the spee
2e800 64 20 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44  d of large .** D
2e810 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73  ELETE operations
2e820 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2e830 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
2e840 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
2e850 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
2e860 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
2e870 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  ( (pPg->flags&PG
2e880 48 44 52 5f 44 49 52 54 59 29 20 26 26 20 70 50  HDR_DIRTY) && pP
2e890 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
2e8a0 3d 3d 30 20 29 7b 0a 20 20 20 20 50 41 47 45 52  ==0 ){.    PAGER
2e8b0 54 52 41 43 45 28 28 22 44 4f 4e 54 5f 57 52 49  TRACE(("DONT_WRI
2e8c0 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  TE page %d of %d
2e8d0 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  \n", pPg->pgno, 
2e8e0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
2e8f0 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  );.    IOTRACE((
2e900 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c  "CLEAN %p %d\n",
2e910 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
2e920 6e 6f 29 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c  no)).    pPg->fl
2e930 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e  ags |= PGHDR_DON
2e940 54 5f 57 52 49 54 45 3b 0a 23 69 66 64 65 66 20  T_WRITE;.#ifdef 
2e950 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
2e960 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
2e970 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
2e980 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
2e990 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  if.  }.}../*.** 
2e9a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2e9b0 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d  called to increm
2e9c0 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ent the value of
2e9d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e9e0 6c 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f  le .** change-co
2e9f0 75 6e 74 65 72 2c 20 73 74 6f 72 65 64 20 61 73  unter, stored as
2ea00 20 61 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 4-byte big-en
2ea10 64 69 61 6e 20 69 6e 74 65 67 65 72 20 73 74 61  dian integer sta
2ea20 72 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74  rting at .** byt
2ea30 65 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74  e offset 24 of t
2ea40 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a  he pager file..*
2ea50 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73 44 69  *.** If the isDi
2ea60 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 69 73  rectMode flag is
2ea70 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73   zero, then this
2ea80 20 69 73 20 64 6f 6e 65 20 62 79 20 63 61 6c 6c   is done by call
2ea90 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ing .** sqlite3P
2eaa0 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 70  agerWrite() on p
2eab0 61 67 65 20 31 2c 20 74 68 65 6e 20 6d 6f 64 69  age 1, then modi
2eac0 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  fying the conten
2ead0 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  ts of the.** pag
2eae0 65 20 64 61 74 61 2e 20 49 6e 20 74 68 69 73 20  e data. In this 
2eaf0 63 61 73 65 20 74 68 65 20 66 69 6c 65 20 77 69  case the file wi
2eb00 6c 6c 20 62 65 20 75 70 64 61 74 65 64 20 77 68  ll be updated wh
2eb10 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  en the current.*
2eb20 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
2eb30 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
2eb40 2a 20 54 68 65 20 69 73 44 69 72 65 63 74 4d 6f  * The isDirectMo
2eb50 64 65 20 66 6c 61 67 20 6d 61 79 20 6f 6e 6c 79  de flag may only
2eb60 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20   be non-zero if 
2eb70 74 68 65 20 6c 69 62 72 61 72 79 20 77 61 73 20  the library was 
2eb80 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77 69 74 68  compiled.** with
2eb90 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42   the SQLITE_ENAB
2eba0 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20  LE_ATOMIC_WRITE 
2ebb0 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 49  macro defined. I
2ebc0 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20  n this case,.** 
2ebd0 69 66 20 69 73 44 69 72 65 63 74 20 69 73 20 6e  if isDirect is n
2ebe0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
2ebf0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2ec00 69 73 20 75 70 64 61 74 65 64 20 64 69 72 65 63  is updated direc
2ec10 74 6c 79 0a 2a 2a 20 62 79 20 77 72 69 74 69 6e  tly.** by writin
2ec20 67 20 61 6e 20 75 70 64 61 74 65 64 20 76 65 72  g an updated ver
2ec30 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 75  sion of page 1 u
2ec40 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 74  sing a call to t
2ec50 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73  he .** sqlite3Os
2ec60 57 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f 6e  Write() function
2ec70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2ec80 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
2ec90 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a  ecounter(Pager *
2eca0 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44 69  pPager, int isDi
2ecb0 72 65 63 74 4d 6f 64 65 29 7b 0a 20 20 69 6e 74  rectMode){.  int
2ecc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2ecd0 0a 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65 20 61  ..  /* Declare a
2ece0 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f  nd initialize co
2ecf0 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 27  nstant integer '
2ed00 69 73 44 69 72 65 63 74 27 2e 20 49 66 20 74 68  isDirect'. If th
2ed10 65 0a 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 77 72  e.  ** atomic-wr
2ed20 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
2ed30 20 69 73 20 65 6e 61 62 6c 65 64 20 69 6e 20 74   is enabled in t
2ed40 68 69 73 20 62 75 69 6c 64 2c 20 74 68 65 6e 20  his build, then 
2ed50 69 73 44 69 72 65 63 74 0a 20 20 2a 2a 20 69 73  isDirect.  ** is
2ed60 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
2ed70 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  the value passed
2ed80 20 61 73 20 74 68 65 20 69 73 44 69 72 65 63 74   as the isDirect
2ed90 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 0a 20  Mode parameter. 
2eda0 20 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63   ** to this func
2edb0 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c  tion. Otherwise,
2edc0 20 69 74 20 69 73 20 61 6c 77 61 79 73 20 73 65   it is always se
2edd0 74 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a  t to zero..  **.
2ede0 20 20 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73    ** The idea is
2edf0 20 74 68 61 74 20 69 66 20 74 68 65 20 61 74 6f   that if the ato
2ee00 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
2ee10 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20  zation is not.  
2ee20 2a 2a 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  ** enabled at co
2ee30 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 20  mpile time, the 
2ee40 63 6f 6d 70 69 6c 65 72 20 63 61 6e 20 6f 6d 69  compiler can omi
2ee50 74 20 74 68 65 20 74 65 73 74 73 20 6f 66 0a 20  t the tests of. 
2ee60 20 2a 2a 20 27 69 73 44 69 72 65 63 74 27 20 62   ** 'isDirect' b
2ee70 65 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20 61 73  elow, as well as
2ee80 20 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f   the block enclo
2ee90 73 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  sed in the.  ** 
2eea0 22 69 66 28 20 69 73 44 69 72 65 63 74 20 29 22  "if( isDirect )"
2eeb0 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f   condition..  */
2eec0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2eed0 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
2eee0 49 54 45 0a 23 20 64 65 66 69 6e 65 20 44 49 52  ITE.# define DIR
2eef0 45 43 54 5f 4d 4f 44 45 20 30 0a 20 20 61 73 73  ECT_MODE 0.  ass
2ef00 65 72 74 28 20 69 73 44 69 72 65 63 74 4d 6f 64  ert( isDirectMod
2ef10 65 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44  e==0 );.  UNUSED
2ef20 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44 69 72  _PARAMETER(isDir
2ef30 65 63 74 4d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a  ectMode);.#else.
2ef40 23 20 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f  # define DIRECT_
2ef50 4d 4f 44 45 20 69 73 44 69 72 65 63 74 4d 6f 64  MODE isDirectMod
2ef60 65 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  e.#endif..  asse
2ef70 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
2ef80 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
2ef90 44 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  D );.  if( !pPag
2efa0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
2efb0 6f 6e 65 20 26 26 20 70 50 61 67 65 72 2d 3e 64  one && pPager->d
2efc0 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 50  bSize>0 ){.    P
2efd0 67 48 64 72 20 2a 70 50 67 48 64 72 3b 20 20 20  gHdr *pPgHdr;   
2efe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2eff0 52 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  Reference to pag
2f000 65 20 31 20 2a 2f 0a 20 20 20 20 75 33 32 20 63  e 1 */.    u32 c
2f010 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 20 20  hange_counter;  
2f020 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
2f030 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 63 68 61  ial value of cha
2f040 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c  nge-counter fiel
2f050 64 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  d */..    assert
2f060 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
2f070 69 6c 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50  ile && isOpen(pP
2f080 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20  ager->fd) );..  
2f090 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31    /* Open page 1
2f0a0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   of the file for
2f0b0 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20   writing. */.   
2f0c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2f0d0 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c  erGet(pPager, 1,
2f0e0 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 61   &pPgHdr);.    a
2f0f0 73 73 65 72 74 28 20 70 50 67 48 64 72 3d 3d 30  ssert( pPgHdr==0
2f100 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
2f110 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  K );..    /* If 
2f120 70 61 67 65 20 6f 6e 65 20 77 61 73 20 66 65 74  page one was fet
2f130 63 68 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ched successfull
2f140 79 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  y, and this func
2f150 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 20 20  tion is not.    
2f160 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  ** operating in 
2f170 64 69 72 65 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b  direct-mode, mak
2f180 65 20 70 61 67 65 20 31 20 77 72 69 74 61 62 6c  e page 1 writabl
2f190 65 2e 20 20 57 68 65 6e 20 6e 6f 74 20 69 6e 20  e.  When not in 
2f1a0 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 20 6d  .    ** direct m
2f1b0 6f 64 65 2c 20 70 61 67 65 20 31 20 69 73 20 61  ode, page 1 is a
2f1c0 6c 77 61 79 73 20 68 65 6c 64 20 69 6e 20 63 61  lways held in ca
2f1d0 63 68 65 20 61 6e 64 20 68 65 6e 63 65 20 74 68  che and hence th
2f1e0 65 20 50 61 67 65 72 47 65 74 28 29 0a 20 20 20  e PagerGet().   
2f1f0 20 2a 2a 20 61 62 6f 76 65 20 69 73 20 61 6c 77   ** above is alw
2f200 61 79 73 20 73 75 63 63 65 73 73 66 75 6c 20 2d  ays successful -
2f210 20 68 65 6e 63 65 20 74 68 65 20 41 4c 57 41 59   hence the ALWAY
2f220 53 20 6f 6e 20 72 63 3d 3d 53 51 4c 49 54 45 5f  S on rc==SQLITE_
2f230 4f 4b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  OK..    */.    i
2f240 66 28 20 21 44 49 52 45 43 54 5f 4d 4f 44 45 20  f( !DIRECT_MODE 
2f250 26 26 20 41 4c 57 41 59 53 28 72 63 3d 3d 53 51  && ALWAYS(rc==SQ
2f260 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20  LITE_OK) ){.    
2f270 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2f280 67 65 72 57 72 69 74 65 28 70 50 67 48 64 72 29  gerWrite(pPgHdr)
2f290 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
2f2a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2f2b0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65  {.      /* Incre
2f2c0 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
2f2d0 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
2f2e0 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
2f2f0 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 20 20  te 24. */.      
2f300 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d  change_counter =
2f310 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
2f320 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62  ((u8*)pPager->db
2f330 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 20  FileVers);.     
2f340 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b   change_counter+
2f350 2b 3b 0a 20 20 20 20 20 20 70 75 74 33 32 62 69  +;.      put32bi
2f360 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 48 64  ts(((char*)pPgHd
2f370 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68  r->pData)+24, ch
2f380 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a  ange_counter);..
2f390 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 73 74        /* Also st
2f3a0 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65 20 76  ore the SQLite v
2f3b0 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e  ersion number in
2f3c0 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20 2a 2f   bytes 96..99 */
2f3d0 0a 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73  .      put32bits
2f3e0 28 28 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d  (((char*)pPgHdr-
2f3f0 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49  >pData)+96, SQLI
2f400 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
2f410 52 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  R);..      /* If
2f420 20 72 75 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65   running in dire
2f430 63 74 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 74  ct mode, write t
2f440 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70  he contents of p
2f450 61 67 65 20 31 20 74 6f 20 74 68 65 20 66 69 6c  age 1 to the fil
2f460 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
2f470 44 49 52 45 43 54 5f 4d 4f 44 45 20 29 7b 0a 20  DIRECT_MODE ){. 
2f480 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69         const voi
2f490 64 20 2a 7a 42 75 66 20 3d 20 70 50 67 48 64 72  d *zBuf = pPgHdr
2f4a0 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 20  ->pData;.       
2f4b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2f4c0 3e 64 62 46 69 6c 65 53 69 7a 65 3e 30 20 29 3b  >dbFileSize>0 );
2f4d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2f4e0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
2f4f0 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70  ger->fd, zBuf, p
2f500 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
2f510 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
2f520 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2f530 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  {.          pPag
2f540 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
2f550 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  one = 1;.       
2f560 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
2f570 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2f580 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
2f590 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
2f5a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61   }..    /* Relea
2f5b0 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65  se the page refe
2f5c0 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71  rence. */.    sq
2f5d0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2f5e0 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72  pPgHdr);.  }.  r
2f5f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2f600 2a 2a 20 53 79 6e 63 20 74 68 65 20 70 61 67 65  ** Sync the page
2f610 72 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 20  r file to disk. 
2f620 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
2f630 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69  for in-memory fi
2f640 6c 65 73 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20  les.** or pages 
2f650 77 69 74 68 20 74 68 65 20 50 61 67 65 72 2e 6e  with the Pager.n
2f660 6f 53 79 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a  oSync flag set..
2f670 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
2f680 66 75 6c 2c 20 6f 72 20 63 61 6c 6c 65 64 20 6f  ful, or called o
2f690 6e 20 61 20 70 61 67 65 72 20 66 6f 72 20 77 68  n a pager for wh
2f6a0 69 63 68 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ich it is a no-o
2f6b0 70 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  p, this.** funct
2f6c0 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
2f6d0 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65  TE_OK. Otherwise
2f6e0 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  , an IO error co
2f6f0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
2f700 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2f710 67 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70  gerSync(Pager *p
2f720 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
2f730 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f750 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2f760 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
2f770 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  B );.  if( pPage
2f780 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
2f790 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2f7a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
2f7b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
2f7c0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
2f7d0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
2f7e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2f7f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  c;.}../*.** Sync
2f800 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2f810 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  le for the pager
2f820 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72   pPager. zMaster
2f830 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e   points to the n
2f840 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74  ame.** of a mast
2f850 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
2f860 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
2f870 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
2f880 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f  individual.** jo
2f890 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73  urnal file. zMas
2f8a0 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c  ter may be NULL,
2f8b0 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70   which is interp
2f8c0 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74  reted as no mast
2f8d0 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61  er.** journal (a
2f8e0 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
2f8f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
2f900 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2f910 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 3a 0a  e ensures that:.
2f920 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61  **.**   * The da
2f930 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
2f940 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 75 70  ge-counter is up
2f950 64 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68  dated,.**   * th
2f960 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
2f970 63 65 64 20 28 75 6e 6c 65 73 73 20 74 68 65 20  ced (unless the 
2f980 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
2f990 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65  imization is use
2f9a0 64 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64  d),.**   * all d
2f9b0 69 72 74 79 20 70 61 67 65 73 20 61 72 65 20 77  irty pages are w
2f9c0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
2f9d0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a  tabase file, .**
2f9e0 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
2f9f0 65 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61  e file is trunca
2fa00 74 65 64 20 28 69 66 20 72 65 71 75 69 72 65 64  ted (if required
2fa10 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68  ), and.**   * th
2fa20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2fa30 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  synced. .**.** T
2fa40 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68  he only thing th
2fa50 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f  at remains to co
2fa60 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
2fa70 74 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c  tion is to final
2fa80 69 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c  ize .** (delete,
2fa90 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72   truncate or zer
2faa0 6f 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74  o the first part
2fab0 20 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c   of) the journal
2fac0 20 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65   file (or .** de
2fad0 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
2fae0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
2faf0 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a  specified)..**.*
2fb00 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a  * Note that if z
2fb10 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68  Master==NULL, th
2fb20 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72  is does not over
2fb30 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73  write a previous
2fb40 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64   value.** passed
2fb50 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61   to an sqlite3Pa
2fb60 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
2fb70 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  e() call..**.** 
2fb80 49 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72  If the final par
2fb90 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20  ameter - noSync 
2fba0 2d 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  - is true, then 
2fbb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2fbc0 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e  e itself.** is n
2fbd0 6f 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63  ot synced. The c
2fbe0 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20  aller must call 
2fbf0 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
2fc00 28 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a  () directly to.*
2fc10 2a 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  * sync the datab
2fc20 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  ase file before 
2fc30 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68  calling CommitPh
2fc40 61 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65  aseTwo() to dele
2fc50 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  te the.** journa
2fc60 6c 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63  l file in this c
2fc70 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
2fc80 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
2fc90 61 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20  aseOne(.  Pager 
2fca0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
2fcb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2fcc0 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  er object */.  c
2fcd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
2fce0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
2fcf0 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  * If not NULL, t
2fd00 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
2fd10 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  l name */.  int 
2fd20 6e 6f 53 79 6e 63 20 20 20 20 20 20 20 20 20 20  noSync          
2fd30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2fd40 72 75 65 20 74 6f 20 6f 6d 69 74 20 74 68 65 20  rue to omit the 
2fd50 78 53 79 6e 63 20 6f 6e 20 74 68 65 20 64 62 20  xSync on the db 
2fd60 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  file */.){.  int
2fd70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2fd80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fd90 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
2fda0 20 20 2f 2a 20 54 68 65 20 64 62 4f 72 69 67 53    /* The dbOrigS
2fdb0 69 7a 65 20 69 73 20 6e 65 76 65 72 20 73 65 74  ize is never set
2fdc0 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   if journal_mode
2fdd0 3d 4f 46 46 20 2a 2f 0a 20 20 61 73 73 65 72 74  =OFF */.  assert
2fde0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
2fdf0 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
2fe00 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20  RNALMODE_OFF || 
2fe10 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
2fe20 7a 65 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ze==0 );..  /* I
2fe30 66 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20  f a prior error 
2fe40 6f 63 63 75 72 72 65 64 2c 20 72 65 70 6f 72 74  occurred, report
2fe50 20 74 68 61 74 20 65 72 72 6f 72 20 61 67 61 69   that error agai
2fe60 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  n. */.  if( NEVE
2fe70 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
2fe80 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67  e) ) return pPag
2fe90 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
2fea0 50 41 47 45 52 54 52 41 43 45 28 28 22 44 41 54  PAGERTRACE(("DAT
2feb0 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65  ABASE SYNC: File
2fec0 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e  =%s zMaster=%s n
2fed0 53 69 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20 20 20  Size=%d\n", .   
2fee0 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65     pPager->zFile
2fef0 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70  name, zMaster, p
2ff00 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 29 3b  Pager->dbSize));
2ff10 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 26 26  ..  if( MEMDB &&
2ff20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
2ff30 69 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ied ){.    /* If
2ff40 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
2ff50 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20  emory db, or no 
2ff60 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
2ff70 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74  written to, or t
2ff80 68 69 73 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74  his.    ** funct
2ff90 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
2ffa0 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20  been called, it 
2ffb0 69 73 20 6d 6f 73 74 6c 79 20 61 20 6e 6f 2d 6f  is mostly a no-o
2ffc0 70 2e 20 20 48 6f 77 65 76 65 72 2c 20 61 6e 79  p.  However, any
2ffd0 0a 20 20 20 20 2a 2a 20 62 61 63 6b 75 70 20 69  .    ** backup i
2ffe0 6e 20 70 72 6f 67 72 65 73 73 20 6e 65 65 64 73  n progress needs
2fff0 20 74 6f 20 62 65 20 72 65 73 74 61 72 74 65 64   to be restarted
30000 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
30010 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72  ite3BackupRestar
30020 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  t(pPager->pBacku
30030 70 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  p);.  }else if( 
30040 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
30050 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 70  AGER_SYNCED && p
30060 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
30070 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70 61 67  d ){.    if( pag
30080 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
30090 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20   ){.      PgHdr 
300a0 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  *pList = sqlite3
300b0 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28  PcacheDirtyList(
300c0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
300d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
300e0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
300f0 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73  = pagerWalFrames
30100 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2c 20  (pPager, pList, 
30110 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2c 20  pPager->dbSize, 
30120 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  1, .            
30130 28 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e  (pPager->fullSyn
30140 63 20 3f 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  c ? pPager->sync
30150 5f 66 6c 61 67 73 20 3a 20 30 29 0a 20 20 20 20  _flags : 0).    
30160 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
30170 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
30180 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65  heCleanAll(pPage
30190 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20  r->pPCache);.   
301a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
301b0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
301c0 6c 6f 63 6b 20 75 70 64 61 74 65 73 20 74 68 65  lock updates the
301d0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e   change-counter.
301e0 20 45 78 61 63 74 6c 79 20 68 6f 77 20 69 74 0a   Exactly how it.
301f0 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 74 68        ** does th
30200 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68  is depends on wh
30210 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
30220 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f   atomic-update o
30230 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20  ptimization.    
30240 20 20 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65 64    ** was enabled
30250 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
30260 2c 20 61 6e 64 20 69 66 20 74 68 69 73 20 74 72  , and if this tr
30270 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65 74 73 20  ansaction meets 
30280 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 72 75  the .      ** ru
30290 6e 74 69 6d 65 20 63 72 69 74 65 72 69 61 20 74  ntime criteria t
302a0 6f 20 75 73 65 20 74 68 65 20 6f 70 65 72 61 74  o use the operat
302b0 69 6f 6e 3a 20 0a 20 20 20 20 20 20 2a 2a 0a 20  ion: .      **. 
302c0 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 65       **    * The
302d0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70   file-system sup
302e0 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63  ports the atomic
302f0 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74 79 20  -write property 
30300 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  for.      **    
30310 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65    blocks of size
30320 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 20   page-size, and 
30330 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 54  .      **    * T
30340 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f  his commit is no
30350 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74  t part of a mult
30360 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69  i-file transacti
30370 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  on, and.      **
30380 20 20 20 20 2a 20 45 78 61 63 74 6c 79 20 6f 6e      * Exactly on
30390 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
303a0 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f  modified and sto
303b0 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
303c0 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  l file..      **
303d0 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
303e0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61   optimization wa
303f0 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61 74  s not enabled at
30400 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74   compile time, t
30410 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hen the.      **
30420 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
30430 67 65 63 6f 75 6e 74 65 72 28 29 20 66 75 6e 63  gecounter() func
30440 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
30450 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
30460 6e 67 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 75  nge.      ** cou
30470 6e 74 65 72 20 69 6e 20 27 69 6e 64 69 72 65 63  nter in 'indirec
30480 74 2d 6d 6f 64 65 27 2e 20 49 66 20 74 68 65 20  t-mode'. If the 
30490 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
304a0 63 6f 6d 70 69 6c 65 64 20 69 6e 20 62 75 74 0a  compiled in but.
304b0 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
304c0 61 70 70 6c 69 63 61 62 6c 65 20 74 6f 20 74 68  applicable to th
304d0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
304e0 63 61 6c 6c 20 73 71 6c 69 74 65 33 4a 6f 75 72  call sqlite3Jour
304f0 6e 61 6c 43 72 65 61 74 65 28 29 0a 20 20 20 20  nalCreate().    
30500 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72    ** to make sur
30510 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
30520 6c 65 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20  le has actually 
30530 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 74 68  been created, th
30540 65 6e 20 63 61 6c 6c 0a 20 20 20 20 20 20 2a 2a  en call.      **
30550 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
30560 67 65 63 6f 75 6e 74 65 72 28 29 20 74 6f 20 75  gecounter() to u
30570 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
30580 2d 63 6f 75 6e 74 65 72 20 69 6e 20 69 6e 64 69  -counter in indi
30590 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 6d 6f  rect.      ** mo
305a0 64 65 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  de. .      **.  
305b0 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
305c0 2c 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  , if the optimiz
305d0 61 74 69 6f 6e 20 69 73 20 62 6f 74 68 20 65 6e  ation is both en
305e0 61 62 6c 65 64 20 61 6e 64 20 61 70 70 6c 69 63  abled and applic
305f0 61 62 6c 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74  able,.      ** t
30600 68 65 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f 69  hen call pager_i
30610 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
30620 72 28 29 20 74 6f 20 75 70 64 61 74 65 20 74 68  r() to update th
30630 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
30640 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 27 64 69  .      ** in 'di
30650 72 65 63 74 27 20 6d 6f 64 65 2e 20 49 6e 20 74  rect' mode. In t
30660 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75  his case the jou
30670 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e  rnal file will n
30680 65 76 65 72 20 62 65 0a 20 20 20 20 20 20 2a 2a  ever be.      **
30690 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 69   created for thi
306a0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  s transaction.. 
306b0 20 20 20 20 20 2a 2f 0a 20 20 23 69 66 64 65 66       */.  #ifdef
306c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
306d0 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
306e0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
306f0 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
30700 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
30710 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
30720 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
30730 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b  URNALMODE_OFF );
30740 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73  .      if( !zMas
30750 74 65 72 20 26 26 20 69 73 4f 70 65 6e 28 70 50  ter && isOpen(pP
30760 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20  ager->jfd) .    
30770 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
30780 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75  urnalOff==jrnlBu
30790 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
307a0 20 0a 20 20 20 20 20 20 20 26 26 20 70 50 61 67   .       && pPag
307b0 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61 67  er->dbSize>=pPag
307c0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20  er->dbFileSize. 
307d0 20 20 20 20 20 20 26 26 20 28 30 3d 3d 28 70 50        && (0==(pP
307e0 67 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  g = sqlite3Pcach
307f0 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
30800 72 2d 3e 70 50 43 61 63 68 65 29 29 20 7c 7c 20  r->pPCache)) || 
30810 30 3d 3d 70 50 67 2d 3e 70 44 69 72 74 79 29 0a  0==pPg->pDirty).
30820 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
30830 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
30840 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f  b file change co
30850 75 6e 74 65 72 20 76 69 61 20 74 68 65 20 64 69  unter via the di
30860 72 65 63 74 2d 77 72 69 74 65 20 6d 65 74 68 6f  rect-write metho
30870 64 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20  d. The .        
30880 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  ** following cal
30890 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 20 74 68  l will modify th
308a0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
308b0 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61  esentation of pa
308c0 67 65 20 31 20 0a 20 20 20 20 20 20 20 20 2a 2a  ge 1 .        **
308d0 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20   to include the 
308e0 75 70 64 61 74 65 64 20 63 68 61 6e 67 65 20 63  updated change c
308f0 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20  ounter and then 
30900 77 72 69 74 65 20 70 61 67 65 20 31 20 0a 20 20  write page 1 .  
30910 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c        ** directl
30920 79 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  y to the databas
30930 65 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20  e file. Because 
30940 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  of the atomic-wr
30950 69 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ite .        ** 
30960 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
30970 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d  host file-system
30980 2c 20 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a  , this is safe..
30990 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
309a0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
309b0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
309c0 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
309d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
309e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
309f0 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67  urnalCreate(pPag
30a00 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
30a10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30a20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
30a30 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
30a40 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
30a50 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
30a60 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 23     }.      }.  #
30a70 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20  else.      rc = 
30a80 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
30a90 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c  ecounter(pPager,
30aa0 20 30 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20   0);.  #endif.  
30ab0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30ac0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
30ad0 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
30ae0 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20  it;.  .      /* 
30af0 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  If this transact
30b00 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65  ion has made the
30b10 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65   database smalle
30b20 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  r, then all page
30b30 73 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67  s.      ** being
30b40 20 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68   discarded by th
30b50 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73  e truncation mus
30b60 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  t be written to 
30b70 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
30b80 20 20 2a 2a 20 66 69 6c 65 2e 20 54 68 69 73 20    ** file. This 
30b90 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
30ba0 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  in auto-vacuum m
30bb0 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ode..      **.  
30bc0 20 20 20 20 2a 2a 20 42 65 66 6f 72 65 20 72 65      ** Before re
30bd0 61 64 69 6e 67 20 74 68 65 20 70 61 67 65 73 20  ading the pages 
30be0 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
30bf0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
30c00 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72  e .      ** curr
30c10 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67  ent value of Pag
30c20 65 72 2e 64 62 53 69 7a 65 2c 20 73 65 74 20 64  er.dbSize, set d
30c30 62 53 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68  bSize back to th
30c40 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a  e value.      **
30c50 20 74 68 61 74 20 69 74 20 74 6f 6f 6b 20 61 74   that it took at
30c60 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
30c70 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4f  e transaction. O
30c80 74 68 65 72 77 69 73 65 2c 20 74 68 65 0a 20 20  therwise, the.  
30c90 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20      ** calls to 
30ca0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
30cb0 29 20 72 65 74 75 72 6e 20 7a 65 72 6f 65 64 20  ) return zeroed 
30cc0 70 61 67 65 73 20 69 6e 73 74 65 61 64 20 6f 66  pages instead of
30cd0 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 69   .      ** readi
30ce0 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ng data from the
30cf0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
30d00 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
30d10 2a 20 57 68 65 6e 20 6a 6f 75 72 6e 61 6c 5f 6d  * When journal_m
30d20 6f 64 65 3d 3d 4f 46 46 20 74 68 65 20 64 62 4f  ode==OFF the dbO
30d30 72 69 67 53 69 7a 65 20 69 73 20 61 6c 77 61 79  rigSize is alway
30d40 73 20 7a 65 72 6f 2c 20 73 6f 20 74 68 69 73 0a  s zero, so this.
30d50 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6e        ** block n
30d60 65 76 65 72 20 72 75 6e 73 20 69 66 20 6a 6f 75  ever runs if jou
30d70 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 2e 0a 20  rnal_mode=OFF.. 
30d80 20 20 20 20 20 2a 2f 0a 20 20 23 69 66 6e 64 65       */.  #ifnde
30d90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
30da0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
30db0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
30dc0 65 3c 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  e<pPager->dbOrig
30dd0 53 69 7a 65 20 0a 20 20 20 20 20 20 20 26 26 20  Size .       && 
30de0 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e 6a  ALWAYS(pPager->j
30df0 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
30e00 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
30e10 46 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  F).      ){.    
30e20 20 20 20 20 50 67 6e 6f 20 69 3b 20 20 20 20 20      Pgno i;     
30e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30e50 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
30e60 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f  le */.        co
30e70 6e 73 74 20 50 67 6e 6f 20 69 53 6b 69 70 20 3d  nst Pgno iSkip =
30e80 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
30e90 50 61 67 65 72 29 3b 20 2f 2a 20 50 65 6e 64 69  Pager); /* Pendi
30ea0 6e 67 20 6c 6f 63 6b 20 70 61 67 65 20 2a 2f 0a  ng lock page */.
30eb0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67          const Pg
30ec0 6e 6f 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67  no dbSize = pPag
30ed0 65 72 2d 3e 64 62 53 69 7a 65 3b 20 20 20 20 20  er->dbSize;     
30ee0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6d    /* Database im
30ef0 61 67 65 20 73 69 7a 65 20 2a 2f 20 0a 20 20 20  age size */ .   
30f00 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
30f10 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
30f20 4f 72 69 67 53 69 7a 65 3b 0a 20 20 20 20 20 20  OrigSize;.      
30f30 20 20 66 6f 72 28 20 69 3d 64 62 53 69 7a 65 2b    for( i=dbSize+
30f40 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 64 62  1; i<=pPager->db
30f50 4f 72 69 67 53 69 7a 65 3b 20 69 2b 2b 20 29 7b  OrigSize; i++ ){
30f60 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
30f70 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
30f80 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
30f90 72 6e 61 6c 2c 20 69 29 20 26 26 20 69 21 3d 69  rnal, i) && i!=i
30fa0 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Skip ){.        
30fb0 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
30fc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
30fd0 20 50 61 67 65 20 74 6f 20 6a 6f 75 72 6e 61 6c   Page to journal
30fe0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
30ff0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
31000 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20  rGet(pPager, i, 
31010 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  &pPage);.       
31020 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
31030 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f  ITE_OK ) goto co
31040 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
31050 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xit;.           
31060 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
31070 65 72 57 72 69 74 65 28 70 50 61 67 65 29 3b 0a  erWrite(pPage);.
31080 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
31090 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
310a0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
310b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
310c0 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
310d0 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
310e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
310f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31100 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
31110 20 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d   dbSize;.      }
31120 20 0a 20 20 23 65 6e 64 69 66 0a 20 20 0a 20 20   .  #endif.  .  
31130 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
31140 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
31150 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
31160 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61  urnal file. If a
31170 20 6d 61 73 74 65 72 20 0a 20 20 20 20 20 20 2a   master .      *
31180 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
31190 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ame has already 
311a0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
311b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
311c0 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 69  , .      ** or i
311d0 66 20 7a 4d 61 73 74 65 72 20 69 73 20 4e 55 4c  f zMaster is NUL
311e0 4c 20 28 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  L (no master jou
311f0 72 6e 61 6c 29 2c 20 74 68 65 6e 20 74 68 69 73  rnal), then this
31200 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
31210 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
31220 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65   rc = writeMaste
31230 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  rJournal(pPager,
31240 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
31250 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31260 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
31270 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
31280 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 53 79 6e  .  .      /* Syn
31290 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
312a0 6c 65 2e 20 49 66 20 74 68 65 20 61 74 6f 6d 69  le. If the atomi
312b0 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a  c-update optimiz
312c0 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 0a 20  ation is being. 
312d0 20 20 20 20 20 2a 2a 20 75 73 65 64 2c 20 74 68       ** used, th
312e0 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74  is call will not
312f0 20 63 72 65 61 74 65 20 74 68 65 20 6a 6f 75 72   create the jour
31300 6e 61 6c 20 66 69 6c 65 20 6f 72 20 70 65 72 66  nal file or perf
31310 6f 72 6d 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a  orm any.      **
31320 20 72 65 61 6c 20 49 4f 2e 0a 20 20 20 20 20 20   real IO..      
31330 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79  */.      rc = sy
31340 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
31350 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
31360 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
31370 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
31380 6e 65 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20 20  ne_exit;.  .    
31390 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64    /* Write all d
313a0 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68  irty pages to th
313b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
313c0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70   */.      rc = p
313d0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
313e0 69 73 74 28 73 71 6c 69 74 65 33 50 63 61 63 68  ist(sqlite3Pcach
313f0 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
31400 72 2d 3e 70 50 43 61 63 68 65 29 29 3b 0a 20 20  r->pPCache));.  
31410 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31420 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31430 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
31440 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
31450 44 20 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  D );.        got
31460 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
31470 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  ne_exit;.      }
31480 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
31490 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
314a0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
314b0 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68   .      /* If th
314c0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
314d0 73 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 73  s not the same s
314e0 69 7a 65 20 61 73 20 74 68 65 20 64 61 74 61 62  ize as the datab
314f0 61 73 65 20 69 6d 61 67 65 2c 0a 20 20 20 20 20  ase image,.     
31500 20 2a 2a 20 74 68 65 6e 20 75 73 65 20 70 61 67   ** then use pag
31510 65 72 5f 74 72 75 6e 63 61 74 65 20 74 6f 20 67  er_truncate to g
31520 72 6f 77 20 6f 72 20 73 68 72 69 6e 6b 20 74 68  row or shrink th
31530 65 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20  e file here..   
31540 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
31550 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 21 3d  pPager->dbSize!=
31560 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
31570 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  ze ){.        Pg
31580 6e 6f 20 6e 4e 65 77 20 3d 20 70 50 61 67 65 72  no nNew = pPager
31590 2d 3e 64 62 53 69 7a 65 20 2d 20 28 70 50 61 67  ->dbSize - (pPag
315a0 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 41 47 45  er->dbSize==PAGE
315b0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
315c0 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ));.        asse
315d0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
315e0 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
315f0 56 45 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  VE );.        rc
31600 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
31610 65 28 70 50 61 67 65 72 2c 20 6e 4e 65 77 29 3b  e(pPager, nNew);
31620 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
31630 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
31640 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
31650 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  ne_exit;.      }
31660 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e  .  .      /* Fin
31670 61 6c 6c 79 2c 20 73 79 6e 63 20 74 68 65 20 64  ally, sync the d
31680 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
31690 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
316a0 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e  er->noSync && !n
316b0 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  oSync ){.       
316c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
316d0 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ync(pPager->fd, 
316e0 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
316f0 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gs);.      }.   
31700 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 53     IOTRACE(("DBS
31710 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
31720 72 29 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  r)).    }..    p
31730 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
31740 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d  AGER_SYNCED;.  }
31750 0a 0a 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  ..commit_phase_o
31760 6e 65 5f 65 78 69 74 3a 0a 20 20 72 65 74 75 72  ne_exit:.  retur
31770 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
31780 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
31790 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
317a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
317b0 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74  has been complet
317c0 65 6c 79 0a 2a 2a 20 75 70 64 61 74 65 64 20 74  ely.** updated t
317d0 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20 63 68  o reflect the ch
317e0 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
317f0 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
31800 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 73 79 6e  ction and.** syn
31810 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 54 68 65  ced to disk. The
31820 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 74   journal file st
31830 69 6c 6c 20 65 78 69 73 74 73 20 69 6e 20 74 68  ill exists in th
31840 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a  e file-system .*
31850 2a 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 69 66  * though, and if
31860 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
31870 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
31880 69 74 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c  it will eventual
31890 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 61 73  ly.** be used as
318a0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61   a hot-journal a
318b0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
318c0 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 65  ransaction rolle
318d0 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  d back..**.** Th
318e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 61  is function fina
318f0 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e 61  lizes the journa
31900 6c 20 66 69 6c 65 2c 20 65 69 74 68 65 72 20 62  l file, either b
31910 79 20 64 65 6c 65 74 69 6e 67 2c 20 0a 2a 2a 20  y deleting, .** 
31920 74 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 70 61  truncating or pa
31930 72 74 69 61 6c 6c 79 20 7a 65 72 6f 69 6e 67 20  rtially zeroing 
31940 69 74 2c 20 73 6f 20 74 68 61 74 20 69 74 20 63  it, so that it c
31950 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 0a 2a  annot be used .*
31960 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f 75 72 6e 61  * for hot-journa
31970 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 6e 63 65  l rollback. Once
31980 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 74 68   this is done th
31990 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
319a0 0a 2a 2a 20 69 72 72 65 76 6f 63 61 62 6c 79 20  .** irrevocably 
319b0 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
319c0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
319d0 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72  urs, an IO error
319e0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
319f0 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 0a  d and the pager.
31a00 2a 2a 20 6d 6f 76 65 73 20 69 6e 74 6f 20 74 68  ** moves into th
31a10 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 4f  e error state. O
31a20 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
31a30 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
31a40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
31a50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
31a60 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  wo(Pager *pPager
31a70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
31a80 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
31a90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
31aa0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
31ab0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
31ac0 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c  hould not be cal
31ad0 6c 65 64 20 69 66 20 61 20 70 72 69 6f 72 20 65  led if a prior e
31ae0 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
31af0 64 2e 0a 20 20 2a 2a 20 42 75 74 20 69 66 20 28  d..  ** But if (
31b00 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20  due to a coding 
31b10 65 72 72 6f 72 20 65 6c 73 65 77 68 65 72 65 20  error elsewhere 
31b20 69 6e 20 74 68 65 20 73 79 73 74 65 6d 29 20 69  in the system) i
31b30 74 20 64 6f 65 73 20 67 65 74 0a 20 20 2a 2a 20  t does get.  ** 
31b40 63 61 6c 6c 65 64 2c 20 6a 75 73 74 20 72 65 74  called, just ret
31b50 75 72 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72  urn the same err
31b60 6f 72 20 63 6f 64 65 20 77 69 74 68 6f 75 74 20  or code without 
31b70 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
31b80 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
31b90 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
31ba0 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
31bb0 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20  >errCode;..  /* 
31bc0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
31bd0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c  ould not be call
31be0 65 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ed if the pager 
31bf0 69 73 20 6e 6f 74 20 69 6e 20 61 74 20 6c 65 61  is not in at lea
31c00 73 74 0a 20 20 2a 2a 20 50 41 47 45 52 5f 52 45  st.  ** PAGER_RE
31c10 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 41 6e  SERVED state. An
31c20 64 20 69 6e 64 65 65 64 20 53 51 4c 69 74 65 20  d indeed SQLite 
31c30 6e 65 76 65 72 20 64 6f 65 73 20 74 68 69 73 2e  never does this.
31c40 20 42 75 74 20 69 74 20 69 73 0a 20 20 2a 2a 20   But it is.  ** 
31c50 6e 69 63 65 20 74 6f 20 68 61 76 65 20 74 68 69  nice to have thi
31c60 73 20 64 65 66 65 6e 73 69 76 65 20 74 65 73 74  s defensive test
31c70 20 68 65 72 65 20 61 6e 79 77 61 79 2e 0a 20 20   here anyway..  
31c80 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
31c90 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
31ca0 45 52 5f 52 45 53 45 52 56 45 44 29 20 29 20 72  ER_RESERVED) ) r
31cb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
31cc0 4f 52 3b 0a 0a 20 20 2f 2a 20 41 6e 20 6f 70 74  OR;..  /* An opt
31cd0 69 6d 69 7a 61 74 69 6f 6e 2e 20 49 66 20 74 68  imization. If th
31ce0 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6e  e database was n
31cf0 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69  ot actually modi
31d00 66 69 65 64 20 64 75 72 69 6e 67 0a 20 20 2a 2a  fied during.  **
31d10 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
31d20 6e 2c 20 74 68 65 20 70 61 67 65 72 20 69 73 20  n, the pager is 
31d30 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
31d40 73 69 76 65 2d 6d 6f 64 65 20 61 6e 64 20 69 73  sive-mode and is
31d50 0a 20 20 2a 2a 20 75 73 69 6e 67 20 70 65 72 73  .  ** using pers
31d60 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2c  istent journals,
31d70 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
31d80 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
31d90 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 74    **.  ** The st
31da0 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
31db0 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  al file currentl
31dc0 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e  y contains a sin
31dd0 67 6c 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  gle journal .  *
31de0 2a 20 68 65 61 64 65 72 20 77 69 74 68 20 74 68  * header with th
31df0 65 20 6e 52 65 63 20 66 69 65 6c 64 20 73 65 74  e nRec field set
31e00 20 74 6f 20 30 2e 20 49 66 20 73 75 63 68 20 61   to 0. If such a
31e10 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75 73 65 64   journal is used
31e20 20 61 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a   as.  ** a hot-j
31e30 6f 75 72 6e 61 6c 20 64 75 72 69 6e 67 20 68 6f  ournal during ho
31e40 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
31e50 63 6b 2c 20 30 20 63 68 61 6e 67 65 73 20 77 69  ck, 0 changes wi
31e60 6c 6c 20 62 65 20 6d 61 64 65 0a 20 20 2a 2a 20  ll be made.  ** 
31e70 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
31e80 66 69 6c 65 2e 20 53 6f 20 74 68 65 72 65 20 69  file. So there i
31e90 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 7a 65 72  s no need to zer
31ea0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  o the journal . 
31eb0 20 2a 2a 20 68 65 61 64 65 72 2e 20 53 69 6e 63   ** header. Sinc
31ec0 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  e the pager is i
31ed0 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
31ee0 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  , there is no ne
31ef0 65 64 0a 20 20 2a 2a 20 74 6f 20 64 72 6f 70 20  ed.  ** to drop 
31f00 61 6e 79 20 6c 6f 63 6b 73 20 65 69 74 68 65 72  any locks either
31f10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
31f20 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d  ger->dbModified=
31f30 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 78  =0 && pPager->ex
31f40 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
31f50 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
31f60 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
31f70 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
31f80 54 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72  T.  ){.    asser
31f90 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
31fa0 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
31fb0 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
31fc0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
31fd0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50 41  TE_OK;.  }..  PA
31fe0 47 45 52 54 52 41 43 45 28 28 22 43 4f 4d 4d 49  GERTRACE(("COMMI
31ff0 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  T %d\n", PAGERID
32000 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 61 73  (pPager)));.  as
32010 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
32020 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate==PAGER_SYNCE
32030 44 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 21 70  D || MEMDB || !p
32040 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
32050 64 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65  d );.  rc = page
32060 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
32070 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  n(pPager, pPager
32080 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20  ->setMaster);.  
32090 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
320a0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
320b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
320c0 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 54  k all changes. T
320d0 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c  he database fall
320e0 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  s back to PAGER_
320f0 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 0a  SHARED mode..**.
32100 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
32110 20 70 65 72 66 6f 72 6d 73 20 74 77 6f 20 74 61   performs two ta
32120 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  sks:.**.**   1) 
32130 49 74 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68  It rolls back th
32140 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
32150 72 65 73 74 6f 72 69 6e 67 20 61 6c 6c 20 64 61  restoring all da
32160 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
32170 0a 2a 2a 20 20 20 20 20 20 69 6e 2d 6d 65 6d 6f  .**      in-memo
32180 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20 74  ry cache pages t
32190 6f 20 74 68 65 20 73 74 61 74 65 20 74 68 65 79  o the state they
321a0 20 77 65 72 65 20 69 6e 20 77 68 65 6e 20 74 68   were in when th
321b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e transaction.**
321c0 20 20 20 20 20 20 77 61 73 20 6f 70 65 6e 65 64        was opened
321d0 2c 20 61 6e 64 0a 2a 2a 20 20 20 32 29 20 49 74  , and.**   2) It
321e0 20 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a   finalizes the j
321f0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 6f 20  ournal file, so 
32200 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 75  that it is not u
32210 73 65 64 20 66 6f 72 20 68 6f 74 0a 2a 2a 20 20  sed for hot.**  
32220 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20      rollback at 
32230 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  any point in the
32240 20 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 73   future..**.** s
32250 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 66 6f  ubject to the fo
32260 6c 6c 6f 77 69 6e 67 20 71 75 61 6c 69 66 69 63  llowing qualific
32270 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20  ations:.**.** * 
32280 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
32290 69 6c 65 20 69 73 20 6e 6f 74 20 79 65 74 20 6f  ile is not yet o
322a0 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75  pen when this fu
322b0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
322c0 2c 0a 2a 2a 20 20 20 74 68 65 6e 20 6f 6e 6c 79  ,.**   then only
322d0 20 28 32 29 20 69 73 20 70 65 72 66 6f 72 6d 65   (2) is performe
322e0 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
322f0 74 68 65 72 65 20 69 73 20 6e 6f 20 6a 6f 75 72  there is no jour
32300 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 74 6f  nal file.**   to
32310 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a 2a 0a 2a   roll back..**.*
32320 2a 20 2a 20 49 66 20 69 6e 20 61 6e 20 65 72 72  * * If in an err
32330 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74  or state other t
32340 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c  han SQLITE_FULL,
32350 20 74 68 65 6e 20 74 61 73 6b 20 28 31 29 20 69   then task (1) i
32360 73 20 0a 2a 2a 20 20 20 70 65 72 66 6f 72 6d 65  s .**   performe
32370 64 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  d. If successful
32380 2c 20 74 61 73 6b 20 28 32 29 2e 20 52 65 67 61  , task (2). Rega
32390 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75  rdless of the ou
323a0 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66 20 65 69  tcome.**   of ei
323b0 74 68 65 72 2c 20 74 68 65 20 65 72 72 6f 72 20  ther, the error 
323c0 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  state error code
323d0 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
323e0 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20  the caller.**   
323f0 28 69 2e 65 2e 20 65 69 74 68 65 72 20 53 51 4c  (i.e. either SQL
32400 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c  ITE_IOERR or SQL
32410 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a  ITE_CORRUPT)..**
32420 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20 70 61 67  .** * If the pag
32430 65 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f 52  er is in PAGER_R
32440 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
32450 68 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29 2e  hen attempt (1).
32460 20 57 68 65 74 68 65 72 0a 2a 2a 20 20 20 6f 72   Whether.**   or
32470 20 6e 6f 74 20 28 31 29 20 69 73 20 73 75 63 63   not (1) is succ
32480 75 73 73 66 75 6c 2c 20 61 6c 73 6f 20 61 74 74  ussful, also att
32490 65 6d 70 74 20 28 32 29 2e 20 49 66 20 73 75 63  empt (2). If suc
324a0 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a  cessful, return.
324b0 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  **   SQLITE_OK. 
324c0 4f 74 68 65 72 77 69 73 65 2c 20 65 6e 74 65 72  Otherwise, enter
324d0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
324e0 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
324f0 66 69 72 73 74 20 0a 2a 2a 20 20 20 65 72 72 6f  first .**   erro
32500 72 20 63 6f 64 65 20 65 6e 63 6f 75 6e 74 65 72  r code encounter
32510 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20  ed. .**.**   In 
32520 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
32530 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61  is no chance tha
32540 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  t the database w
32550 61 73 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 0a  as written to. .
32560 2a 2a 20 20 20 53 6f 20 69 73 20 73 61 66 65 20  **   So is safe 
32570 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
32580 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 76 65  journal file eve
32590 6e 20 69 66 20 74 68 65 20 70 6c 61 79 62 61 63  n if the playbac
325a0 6b 20 0a 2a 2a 20 20 20 28 6f 70 65 72 61 74 69  k .**   (operati
325b0 6f 6e 20 31 29 20 66 61 69 6c 65 64 2e 20 48 6f  on 1) failed. Ho
325c0 77 65 76 65 72 20 74 68 65 20 70 61 67 65 72 20  wever the pager 
325d0 6d 75 73 74 20 65 6e 74 65 72 20 74 68 65 20 65  must enter the e
325e0 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20 20  rror state.**   
325f0 61 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  as the contents 
32600 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  of the in-memory
32610 20 63 61 63 68 65 20 61 72 65 20 6e 6f 77 20 73   cache are now s
32620 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 2a 20  uspect..**.** * 
32630 46 69 6e 61 6c 6c 79 2c 20 69 66 20 69 6e 20 50  Finally, if in P
32640 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 73  AGER_EXCLUSIVE s
32650 74 61 74 65 2c 20 74 68 65 6e 20 61 74 74 65 6d  tate, then attem
32660 70 74 20 28 31 29 2e 20 4f 6e 6c 79 0a 2a 2a 20  pt (1). Only.** 
32670 20 20 61 74 74 65 6d 70 74 20 28 32 29 20 69 66    attempt (2) if
32680 20 28 31 29 20 69 73 20 73 75 63 63 65 73 73 66   (1) is successf
32690 75 6c 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  ul. Return SQLIT
326a0 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
326b0 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65 72 77 69  ul,.**   otherwi
326c0 73 65 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  se enter the err
326d0 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72 65 74  or state and ret
326e0 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
326f0 64 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20  de from the .** 
32700 20 20 66 61 69 6c 69 6e 67 20 6f 70 65 72 61 74    failing operat
32710 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20  ion..**.**   In 
32720 74 68 69 73 20 63 61 73 65 20 74 68 65 20 64 61  this case the da
32730 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61 79 20  tabase file may 
32740 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
32750 6e 20 74 6f 2e 20 53 6f 20 69 66 20 74 68 65 0a  n to. So if the.
32760 2a 2a 20 20 20 70 6c 61 79 62 61 63 6b 20 6f 70  **   playback op
32770 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20  eration did not 
32780 73 75 63 63 65 65 64 20 69 74 20 77 6f 75 6c 64  succeed it would
32790 20 6e 6f 74 20 62 65 20 73 61 66 65 20 74 6f 20   not be safe to 
327a0 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20 74 68  finalize.**   th
327b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
327c0 49 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c  It needs to be l
327d0 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  eft in the file-
327e0 73 79 73 74 65 6d 20 73 6f 20 74 68 61 74 0a 2a  system so that.*
327f0 2a 20 20 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  *   some other p
32800 72 6f 63 65 73 73 20 63 61 6e 20 75 73 65 20 69  rocess can use i
32810 74 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  t to restore the
32820 20 64 61 74 61 62 61 73 65 20 73 74 61 74 65 20   database state 
32830 28 62 79 0a 2a 2a 20 20 20 68 6f 74 2d 6a 6f 75  (by.**   hot-jou
32840 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a  rnal rollback)..
32850 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
32860 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  gerRollback(Page
32870 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
32880 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
32890 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
328a0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
328b0 65 20 2a 2f 0a 20 20 50 41 47 45 52 54 52 41 43  e */.  PAGERTRAC
328c0 45 28 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c  E(("ROLLBACK %d\
328d0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
328e0 65 72 29 29 29 3b 0a 20 20 69 66 28 20 70 61 67  er)));.  if( pag
328f0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
32900 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
32910 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
32920 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e3PagerSavepoint
32930 28 70 50 61 67 65 72 2c 20 53 41 56 45 50 4f 49  (pPager, SAVEPOI
32940 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 2d 31 29  NT_ROLLBACK, -1)
32950 3b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65  ;.    rc2 = page
32960 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
32970 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  n(pPager, pPager
32980 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20  ->setMaster);.  
32990 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
329a0 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  _OK ) rc = rc2;.
329b0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
329c0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
329d0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  ;.  }else if( !p
329e0 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
329f0 64 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61  d || !isOpen(pPa
32a00 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
32a10 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
32a20 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
32a30 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  er, pPager->setM
32a40 61 73 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20  aster);.  }else 
32a50 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
32a60 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
32a70 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
32a80 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ULL ){.    if( p
32a90 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
32aa0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
32ab0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61  .      pager_pla
32ac0 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29  yback(pPager, 0)
32ad0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
32ae0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
32af0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
32b00 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
32b10 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
32b20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
32b30 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  2;.      rc = pa
32b40 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
32b50 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ger, 0);.      r
32b60 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  c2 = pager_end_t
32b70 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
32b80 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  r, pPager->setMa
32b90 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ster);.      if(
32ba0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
32bb0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  {.        rc = r
32bc0 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c2;.      }.    
32bd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
32be0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
32bf0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
32c00 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d 45 4d   }..    if( !MEM
32c10 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  DB ){.      pPag
32c20 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
32c30 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
32c40 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
32c50 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52  ccurs during a R
32c60 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20  OLLBACK, we can 
32c70 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20  no longer trust 
32c80 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
32c90 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20   cache. So call 
32ca0 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e  pager_error() on
32cb0 20 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20   the way out to 
32cc0 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a  make any error .
32cd0 20 20 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e      ** persisten
32ce0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  t..    */.    rc
32cf0 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70   = pager_error(p
32d00 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a  Pager, rc);.  }.
32d10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
32d20 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
32d30 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  E if the databas
32d40 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  e file is opened
32d50 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74   read-only.  Ret
32d60 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
32d70 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
32d80 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74  (in theory) writ
32d90 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69  able..*/.u8 sqli
32da0 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
32db0 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ly(Pager *pPager
32dc0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
32dd0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a  er->readOnly;.}.
32de0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
32df0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
32e00 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
32e10 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
32e20 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
32e30 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
32e40 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
32e50 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
32e60 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
32e70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
32e80 6e 20 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74  n the approximat
32e90 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
32ea0 73 20 6f 66 20 6d 65 6d 6f 72 79 20 63 75 72 72  s of memory curr
32eb0 65 6e 74 6c 79 0a 2a 2a 20 75 73 65 64 20 62 79  ently.** used by
32ec0 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69   the pager and i
32ed0 74 73 20 61 73 73 6f 63 69 61 74 65 64 20 63 61  ts associated ca
32ee0 63 68 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  che..*/.int sqli
32ef0 74 65 33 50 61 67 65 72 4d 65 6d 55 73 65 64 28  te3PagerMemUsed(
32f00 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
32f10 20 20 69 6e 74 20 70 65 72 50 61 67 65 53 69 7a    int perPageSiz
32f20 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
32f30 53 69 7a 65 20 2b 20 70 50 61 67 65 72 2d 3e 6e  Size + pPager->n
32f40 45 78 74 72 61 20 2b 20 32 30 3b 0a 20 20 72 65  Extra + 20;.  re
32f50 74 75 72 6e 20 70 65 72 50 61 67 65 53 69 7a 65  turn perPageSize
32f60 2a 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61  *sqlite3PcachePa
32f70 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
32f80 70 50 43 61 63 68 65 29 0a 20 20 20 20 20 20 20  pPCache).       
32f90 20 20 20 20 2b 20 73 71 6c 69 74 65 33 4d 61 6c      + sqlite3Mal
32fa0 6c 6f 63 53 69 7a 65 28 70 50 61 67 65 72 29 3b  locSize(pPager);
32fb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
32fc0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
32fd0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
32fe0 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e   specified page.
32ff0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
33000 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
33010 28 44 62 50 61 67 65 20 2a 70 50 61 67 65 29 7b  (DbPage *pPage){
33020 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
33030 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f  3PcachePageRefco
33040 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 23  unt(pPage);.}..#
33050 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
33060 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  T./*.** This rou
33070 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
33080 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
33090 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69  lysis only..*/.i
330a0 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  nt *sqlite3Pager
330b0 53 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61  Stats(Pager *pPa
330c0 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69  ger){.  static i
330d0 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d  nt a[11];.  a[0]
330e0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
330f0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
33100 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 31  >pPCache);.  a[1
33110 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  ] = sqlite3Pcach
33120 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  ePagecount(pPage
33130 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61  r->pPCache);.  a
33140 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61  [2] = sqlite3Pca
33150 63 68 65 47 65 74 43 61 63 68 65 73 69 7a 65 28  cheGetCachesize(
33160 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
33170 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65  ;.  a[3] = pPage
33180 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3f  r->dbSizeValid ?
33190 20 28 69 6e 74 29 20 70 50 61 67 65 72 2d 3e 64   (int) pPager->d
331a0 62 53 69 7a 65 20 3a 20 2d 31 3b 0a 20 20 61 5b  bSize : -1;.  a[
331b0 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61  4] = pPager->sta
331c0 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61  te;.  a[5] = pPa
331d0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
331e0 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[6] = pPager->n
331f0 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50  Hit;.  a[7] = pP
33200 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61  ager->nMiss;.  a
33210 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65  [8] = 0;  /* Use
33220 64 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d 3e  d to be pPager->
33230 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20  nOvfl */.  a[9] 
33240 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b  = pPager->nRead;
33250 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65  .  a[10] = pPage
33260 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74  r->nWrite;.  ret
33270 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn a;.}.#endif.
33280 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
33290 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  ue if this is an
332a0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
332b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
332c0 50 61 67 65 72 49 73 4d 65 6d 64 62 28 50 61 67  PagerIsMemdb(Pag
332d0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
332e0 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 0a  eturn MEMDB;.}..
332f0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74  /*.** Check that
33300 20 74 68 65 72 65 20 61 72 65 20 61 74 20 6c 65   there are at le
33310 61 73 74 20 6e 53 61 76 65 70 6f 69 6e 74 20 73  ast nSavepoint s
33320 61 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2e 20  avepoints open. 
33330 49 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20  If there are.** 
33340 63 75 72 72 65 6e 74 6c 79 20 6c 65 73 73 20 74  currently less t
33350 68 61 6e 20 6e 53 61 76 65 70 6f 69 6e 74 73 20  han nSavepoints 
33360 6f 70 65 6e 2c 20 74 68 65 6e 20 6f 70 65 6e 20  open, then open 
33370 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65  one or more save
33380 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 6d 61 6b  points.** to mak
33390 65 20 75 70 20 74 68 65 20 64 69 66 66 65 72 65  e up the differe
333a0 6e 63 65 2e 20 49 66 20 74 68 65 20 6e 75 6d 62  nce. If the numb
333b0 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73  er of savepoints
333c0 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 65   is already.** e
333d0 71 75 61 6c 20 74 6f 20 6e 53 61 76 65 70 6f 69  qual to nSavepoi
333e0 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  nt, then this fu
333f0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
33400 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  p..**.** If a me
33410 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
33420 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  fails, SQLITE_NO
33430 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e  MEM is returned.
33440 20 49 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a   If an error .**
33450 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70   occurs while op
33460 65 6e 69 6e 67 20 74 68 65 20 73 75 62 2d 6a 6f  ening the sub-jo
33470 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
33480 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
33490 65 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  e is.** returned
334a0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
334b0 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
334c0 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
334d0 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a  avepoint(Pager *
334e0 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 53 61 76  pPager, int nSav
334f0 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72  epoint){.  int r
33500 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
33510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33520 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
33530 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75  ode */.  int nCu
33540 72 72 65 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e  rrent = pPager->
33550 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20  nSavepoint;     
33560 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75     /* Current nu
33570 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e  mber of savepoin
33580 74 73 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 53 61  ts */..  if( nSa
33590 76 65 70 6f 69 6e 74 3e 6e 43 75 72 72 65 6e 74  vepoint>nCurrent
335a0 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a   && pPager->useJ
335b0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e  ournal ){.    in
335c0 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
335d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
335e0 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
335f0 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
33600 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
33610 20 2a 61 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *aNew;         
33620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
33630 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
33640 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69  t array */.    i
33650 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
33660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33670 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
33680 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
33690 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  */..    rc = sql
336a0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
336b0 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67  nt(pPager, &nPag
336c0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
336d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
336e0 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 50 61 67   /* Grow the Pag
336f0 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72  er.aSavepoint ar
33700 72 61 79 20 75 73 69 6e 67 20 72 65 61 6c 6c 6f  ray using reallo
33710 63 28 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  c(). Return SQLI
33720 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20 20 2a 2a 20  TE_NOMEM.    ** 
33730 69 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  if the allocatio
33740 6e 20 66 61 69 6c 73 2e 20 4f 74 68 65 72 77 69  n fails. Otherwi
33750 73 65 2c 20 7a 65 72 6f 20 74 68 65 20 6e 65 77  se, zero the new
33760 20 70 6f 72 74 69 6f 6e 20 69 6e 20 63 61 73 65   portion in case
33770 20 61 20 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f   a .    ** mallo
33780 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  c failure occurs
33790 20 77 68 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e   while populatin
337a0 67 20 69 74 20 69 6e 20 74 68 65 20 66 6f 72 28  g it in the for(
337b0 2e 2e 2e 29 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e  ...) loop below.
337c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 4e 65 77  .    */.    aNew
337d0 20 3d 20 28 50 61 67 65 72 53 61 76 65 70 6f 69   = (PagerSavepoi
337e0 6e 74 20 2a 29 73 71 6c 69 74 65 33 52 65 61 6c  nt *)sqlite3Real
337f0 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70 50 61  loc(.        pPa
33800 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 2c  ger->aSavepoint,
33810 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76   sizeof(PagerSav
33820 65 70 6f 69 6e 74 29 2a 6e 53 61 76 65 70 6f 69  epoint)*nSavepoi
33830 6e 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  nt.    );.    if
33840 28 20 21 61 4e 65 77 20 29 7b 0a 20 20 20 20 20  ( !aNew ){.     
33850 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
33860 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
33870 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b 6e 43 75  memset(&aNew[nCu
33880 72 72 65 6e 74 5d 2c 20 30 2c 20 28 6e 53 61 76  rrent], 0, (nSav
33890 65 70 6f 69 6e 74 2d 6e 43 75 72 72 65 6e 74 29  epoint-nCurrent)
338a0 20 2a 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53   * sizeof(PagerS
338b0 61 76 65 70 6f 69 6e 74 29 29 3b 0a 20 20 20 20  avepoint));.    
338c0 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
338d0 6e 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 70  nt = aNew;.    p
338e0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
338f0 74 20 3d 20 6e 53 61 76 65 70 6f 69 6e 74 3b 0a  t = nSavepoint;.
33900 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65  .    /* Populate
33910 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
33920 69 6e 74 20 73 74 72 75 63 74 75 72 65 73 20 6a  int structures j
33930 75 73 74 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a  ust allocated. *
33940 2f 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e 43 75  /.    for(ii=nCu
33950 72 72 65 6e 74 3b 20 69 69 3c 6e 53 61 76 65 70  rrent; ii<nSavep
33960 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
33970 20 20 20 61 4e 65 77 5b 69 69 5d 2e 6e 4f 72 69     aNew[ii].nOri
33980 67 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  g = nPage;.     
33990 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
339a0 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67  er->jfd) && pPag
339b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30  er->journalOff>0
339c0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77   ){.        aNew
339d0 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 70  [ii].iOffset = p
339e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
339f0 66 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  f;.      }else{.
33a00 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d          aNew[ii]
33a10 2e 69 4f 66 66 73 65 74 20 3d 20 4a 4f 55 52 4e  .iOffset = JOURN
33a20 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
33a30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
33a40 20 61 4e 65 77 5b 69 69 5d 2e 69 53 75 62 52 65   aNew[ii].iSubRe
33a50 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75 62  c = pPager->nSub
33a60 52 65 63 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b  Rec;.      aNew[
33a70 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  ii].pInSavepoint
33a80 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
33a90 43 72 65 61 74 65 28 6e 50 61 67 65 29 3b 0a 20  Create(nPage);. 
33aa0 20 20 20 20 20 69 66 28 20 21 61 4e 65 77 5b 69       if( !aNew[i
33ab0 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  i].pInSavepoint 
33ac0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
33ad0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
33ae0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
33af0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
33b00 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
33b10 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70   sqlite3WalSavep
33b20 6f 69 6e 74 28 70 50 61 67 65 72 2d 3e 70 57 61  oint(pPager->pWa
33b30 6c 2c 20 61 4e 65 77 5b 69 69 5d 2e 61 57 61 6c  l, aNew[ii].aWal
33b40 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Data);.      }. 
33b50 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70 65     }..    /* Ope
33b60 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  n the sub-journa
33b70 6c 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  l, if it is not 
33b80 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 2e 20  already opened. 
33b90 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e  */.    rc = open
33ba0 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  SubJournal(pPage
33bb0 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 54 72  r);.    assertTr
33bc0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
33bd0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
33be0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
33bf0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
33c00 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
33c10 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65  rollback or rele
33c20 61 73 65 20 28 63 6f 6d 6d 69 74 29 20 61 20 73  ase (commit) a s
33c30 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 20 54 68 65  avepoint..** The
33c40 20 73 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 65   savepoint to re
33c50 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
33c60 6b 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68  k need not be th
33c70 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
33c80 0a 2a 2a 20 63 72 65 61 74 65 64 20 73 61 76 65  .** created save
33c90 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  point..**.** Par
33ca0 61 6d 65 74 65 72 20 6f 70 20 69 73 20 61 6c 77  ameter op is alw
33cb0 61 79 73 20 65 69 74 68 65 72 20 53 41 56 45 50  ays either SAVEP
33cc0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72  OINT_ROLLBACK or
33cd0 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
33ce0 53 45 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  SE..** If it is 
33cf0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
33d00 45 2c 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20  E, then release 
33d10 61 6e 64 20 64 65 73 74 72 6f 79 20 74 68 65 20  and destroy the 
33d20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 2a  savepoint with.*
33d30 2a 20 69 6e 64 65 78 20 69 53 61 76 65 70 6f 69  * index iSavepoi
33d40 6e 74 2e 20 49 66 20 69 74 20 69 73 20 53 41 56  nt. If it is SAV
33d50 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
33d60 20 74 68 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 61   then rollback a
33d70 6c 6c 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68  ll changes.** th
33d80 61 74 20 68 61 76 65 20 6f 63 63 75 72 72 65 64  at have occurred
33d90 20 73 69 6e 63 65 20 74 68 65 20 73 70 65 63 69   since the speci
33da0 66 69 65 64 20 73 61 76 65 70 6f 69 6e 74 20 77  fied savepoint w
33db0 61 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a  as created..**.*
33dc0 2a 20 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20  * The savepoint 
33dd0 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72  to rollback or r
33de0 65 6c 65 61 73 65 20 69 73 20 69 64 65 6e 74 69  elease is identi
33df0 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
33e00 72 20 0a 2a 2a 20 69 53 61 76 65 70 6f 69 6e 74  r .** iSavepoint
33e10 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 6d  . A value of 0 m
33e20 65 61 6e 73 20 74 6f 20 6f 70 65 72 61 74 65 20  eans to operate 
33e30 6f 6e 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74  on the outermost
33e40 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 28 74   savepoint.** (t
33e50 68 65 20 66 69 72 73 74 20 63 72 65 61 74 65 64  he first created
33e60 29 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 28 50  ). A value of (P
33e70 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d  ager.nSavepoint-
33e80 31 29 20 6d 65 61 6e 73 20 6f 70 65 72 61 74 65  1) means operate
33e90 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20  .** on the most 
33ea0 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64  recently created
33eb0 20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69   savepoint. If i
33ec0 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65  Savepoint is gre
33ed0 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 28 50 61  ater than.** (Pa
33ee0 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31  ger.nSavepoint-1
33ef0 29 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  ), then this fun
33f00 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
33f10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 65 67  ..**.** If a neg
33f20 61 74 69 76 65 20 76 61 6c 75 65 20 69 73 20 70  ative value is p
33f30 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
33f40 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65  nction, then the
33f50 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e   current.** tran
33f60 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
33f70 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20  d back. This is 
33f80 64 69 66 66 65 72 65 6e 74 20 74 6f 20 63 61 6c  different to cal
33f90 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33  ling .** sqlite3
33fa0 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20  PagerRollback() 
33fb0 62 65 63 61 75 73 65 20 74 68 69 73 20 66 75 6e  because this fun
33fc0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 74  ction does not t
33fd0 65 72 6d 69 6e 61 74 65 0a 2a 2a 20 74 68 65 20  erminate.** the 
33fe0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 75  transaction or u
33ff0 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
34000 73 65 2c 20 69 74 20 6a 75 73 74 20 72 65 73 74  se, it just rest
34010 6f 72 65 73 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  ores the .** con
34020 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74  tents of the dat
34030 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
34040 67 69 6e 61 6c 20 73 74 61 74 65 2e 20 0a 2a 2a  ginal state. .**
34050 0a 2a 2a 20 49 6e 20 61 6e 79 20 63 61 73 65 2c  .** In any case,
34060 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20   all savepoints 
34070 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 67 72  with an index gr
34080 65 61 74 65 72 20 74 68 61 6e 20 69 53 61 76 65  eater than iSave
34090 70 6f 69 6e 74 20 0a 2a 2a 20 61 72 65 20 64 65  point .** are de
340a0 73 74 72 6f 79 65 64 2e 20 49 66 20 74 68 69 73  stroyed. If this
340b0 20 69 73 20 61 20 72 65 6c 65 61 73 65 20 6f 70   is a release op
340c0 65 72 61 74 69 6f 6e 20 28 6f 70 3d 3d 53 41 56  eration (op==SAV
340d0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 2c  EPOINT_RELEASE),
340e0 0a 2a 2a 20 74 68 65 6e 20 73 61 76 65 70 6f 69  .** then savepoi
340f0 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73  nt iSavepoint is
34100 20 61 6c 73 6f 20 64 65 73 74 72 6f 79 65 64 2e   also destroyed.
34110 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
34120 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20  tion may return 
34130 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
34140 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
34150 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 6f 72  ion fails,.** or
34160 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
34170 65 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  e if an IO error
34180 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 6f   occurs while ro
34190 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 0a 2a 2a  lling back a .**
341a0 20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 6e   savepoint. If n
341b0 6f 20 65 72 72 6f 72 73 20 6f 63 63 75 72 2c 20  o errors occur, 
341c0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
341d0 75 72 6e 65 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73  urned..*/ .int s
341e0 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70  qlite3PagerSavep
341f0 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  oint(Pager *pPag
34200 65 72 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  er, int op, int 
34210 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  iSavepoint){.  i
34220 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
34230 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70  K;..  assert( op
34240 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
34250 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50  ASE || op==SAVEP
34260 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b  OINT_ROLLBACK );
34270 0a 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65  .  assert( iSave
34280 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 6f 70 3d 3d  point>=0 || op==
34290 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
342a0 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 69 53 61  CK );..  if( iSa
342b0 76 65 70 6f 69 6e 74 3c 70 50 61 67 65 72 2d 3e  vepoint<pPager->
342c0 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  nSavepoint ){.  
342d0 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
342e0 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
342f0 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20   variable */.   
34300 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20   int nNew;      
34310 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
34320 20 72 65 6d 61 69 6e 69 6e 67 20 73 61 76 65 70   remaining savep
34330 6f 69 6e 74 73 20 61 66 74 65 72 20 74 68 69 73  oints after this
34340 20 6f 70 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20   op. */..    /* 
34350 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
34360 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 77  any savepoints w
34370 69 6c 6c 20 73 74 69 6c 6c 20 62 65 20 61 63 74  ill still be act
34380 69 76 65 20 61 66 74 65 72 20 74 68 69 73 0a 20  ive after this. 
34390 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e     ** operation.
343a0 20 53 74 6f 72 65 20 74 68 69 73 20 76 61 6c 75   Store this valu
343b0 65 20 69 6e 20 6e 4e 65 77 2e 20 54 68 65 6e 20  e in nNew. Then 
343c0 66 72 65 65 20 72 65 73 6f 75 72 63 65 73 20 61  free resources a
343d0 73 73 6f 63 69 61 74 65 64 20 0a 20 20 20 20 2a  ssociated .    *
343e0 2a 20 77 69 74 68 20 61 6e 79 20 73 61 76 65 70  * with any savep
343f0 6f 69 6e 74 73 20 74 68 61 74 20 61 72 65 20 64  oints that are d
34400 65 73 74 72 6f 79 65 64 20 62 79 20 74 68 69 73  estroyed by this
34410 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20   operation..    
34420 2a 2f 0a 20 20 20 20 6e 4e 65 77 20 3d 20 69 53  */.    nNew = iS
34430 61 76 65 70 6f 69 6e 74 20 2b 20 28 28 20 6f 70  avepoint + (( op
34440 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
34450 41 53 45 20 29 20 3f 20 30 20 3a 20 31 29 3b 0a  ASE ) ? 0 : 1);.
34460 20 20 20 20 66 6f 72 28 69 69 3d 6e 4e 65 77 3b      for(ii=nNew;
34470 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76   ii<pPager->nSav
34480 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20  epoint; ii++){. 
34490 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76       sqlite3Bitv
344a0 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
344b0 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
344c0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a  .pInSavepoint);.
344d0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
344e0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e  ->nSavepoint = n
344f0 4e 65 77 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  New;..    /* If 
34500 74 68 69 73 20 69 73 20 61 20 72 65 6c 65 61 73  this is a releas
34510 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 6d 6f  e of the outermo
34520 73 74 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 72  st savepoint, tr
34530 75 6e 63 61 74 65 20 0a 20 20 20 20 2a 2a 20 74  uncate .    ** t
34540 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 74  he sub-journal t
34550 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
34560 73 69 7a 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  size. */.    if(
34570 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
34580 45 4c 45 41 53 45 20 29 7b 0a 20 20 20 20 20 20  ELEASE ){.      
34590 69 66 28 20 6e 4e 65 77 3d 3d 30 20 26 26 20 69  if( nNew==0 && i
345a0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
345b0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  fd) ){.        /
345c0 2a 20 4f 6e 6c 79 20 74 72 75 6e 63 61 74 65 20  * Only truncate 
345d0 69 66 20 69 74 20 69 73 20 61 6e 20 69 6e 2d 6d  if it is an in-m
345e0 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61  emory sub-journa
345f0 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  l. */.        if
34600 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f  ( sqlite3IsMemJo
34610 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a  urnal(pPager->sj
34620 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  fd) ){.         
34630 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
34640 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
34650 73 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  sjfd, 0);.      
34660 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
34670 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
34680 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
34690 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d  Pager->nSubRec =
346a0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
346b0 7d 0a 20 20 20 20 2f 2a 20 45 6c 73 65 20 74 68  }.    /* Else th
346c0 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b  is is a rollback
346d0 20 6f 70 65 72 61 74 69 6f 6e 2c 20 70 6c 61 79   operation, play
346e0 62 61 63 6b 20 74 68 65 20 73 70 65 63 69 66 69  back the specifi
346f0 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a 20 20  ed savepoint..  
34700 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
34710 61 20 74 65 6d 70 2d 66 69 6c 65 2c 20 69 74 20  a temp-file, it 
34720 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
34730 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
34740 65 20 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 74  e has.    ** not
34750 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
34760 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
34770 68 65 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e  here have been n
34780 6f 20 63 68 61 6e 67 65 73 20 74 6f 0a 20 20 20  o changes to.   
34790 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
347a0 20 66 69 6c 65 2c 20 73 6f 20 74 68 65 20 70 6c   file, so the pl
347b0 61 79 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  ayback operation
347c0 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e   can be skipped.
347d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 65 6c 73 65  .    */.    else
347e0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
347f0 28 70 50 61 67 65 72 29 20 7c 7c 20 69 73 4f 70  (pPager) || isOp
34800 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
34810 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72 53 61  ){.      PagerSa
34820 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f  vepoint *pSavepo
34830 69 6e 74 20 3d 20 28 6e 4e 65 77 3d 3d 30 29 3f  int = (nNew==0)?
34840 30 3a 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65  0:&pPager->aSave
34850 70 6f 69 6e 74 5b 6e 4e 65 77 2d 31 5d 3b 0a 20  point[nNew-1];. 
34860 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50       rc = pagerP
34870 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74  laybackSavepoint
34880 28 70 50 61 67 65 72 2c 20 70 53 61 76 65 70 6f  (pPager, pSavepo
34890 69 6e 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  int);.      asse
348a0 72 74 28 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  rt(rc!=SQLITE_DO
348b0 4e 45 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  NE);.    }.  .  
348c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
348d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
348e0 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
348f0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
34900 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
34910 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67  char *sqlite3Pag
34920 65 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72  erFilename(Pager
34930 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
34940 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  urn pPager->zFil
34950 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
34960 52 65 74 75 72 6e 20 74 68 65 20 56 46 53 20 73  Return the VFS s
34970 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
34980 20 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74   pager..*/.const
34990 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71   sqlite3_vfs *sq
349a0 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 50 61  lite3PagerVfs(Pa
349b0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
349c0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70  return pPager->p
349d0 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Vfs;.}../*.** Re
349e0 74 75 72 6e 20 74 68 65 20 66 69 6c 65 20 68 61  turn the file ha
349f0 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 64 61 74  ndle for the dat
34a00 61 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63  abase file assoc
34a10 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
34a20 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 6d  e pager.  This m
34a30 69 67 68 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ight return NULL
34a40 20 69 66 20 74 68 65 20 66 69 6c 65 20 68 61 73   if the file has
34a50 0a 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  .** not yet been
34a60 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69   opened..*/.sqli
34a70 74 65 33 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65  te3_file *sqlite
34a80 33 50 61 67 65 72 46 69 6c 65 28 50 61 67 65 72  3PagerFile(Pager
34a90 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
34aa0 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a  urn pPager->fd;.
34ab0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
34ac0 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
34ad0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
34ae0 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
34af0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67  char *sqlite3Pag
34b00 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61  erJournalname(Pa
34b10 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
34b20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
34b30 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  Journal;.}../*.*
34b40 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
34b50 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61   fsync() calls a
34b60 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20  re disabled for 
34b70 74 68 69 73 20 70 61 67 65 72 2e 20 20 52 65 74  this pager.  Ret
34b80 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
34b90 66 73 79 6e 63 28 29 73 20 61 72 65 20 65 78 65  fsync()s are exe
34ba0 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a  cuted normally..
34bb0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
34bc0 67 65 72 4e 6f 73 79 6e 63 28 50 61 67 65 72 20  gerNosync(Pager 
34bd0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
34be0 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  rn pPager->noSyn
34bf0 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
34c00 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a  ITE_HAS_CODEC./*
34c10 0a 2a 2a 20 53 65 74 20 6f 72 20 72 65 74 72 69  .** Set or retri
34c20 65 76 65 20 74 68 65 20 63 6f 64 65 63 20 66 6f  eve the codec fo
34c30 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a  r this pager.*/.
34c40 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
34c50 74 65 33 50 61 67 65 72 53 65 74 43 6f 64 65 63  te3PagerSetCodec
34c60 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
34c70 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f  r,.  void *(*xCo
34c80 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a  dec)(void*,void*
34c90 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f  ,Pgno,int),.  vo
34ca0 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43  id (*xCodecSizeC
34cb0 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69  hng)(void*,int,i
34cc0 6e 74 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43  nt),.  void (*xC
34cd0 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a 29  odecFree)(void*)
34ce0 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63  ,.  void *pCodec
34cf0 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  .){.  if( pPager
34d00 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20 70  ->xCodecFree ) p
34d10 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65  Pager->xCodecFre
34d20 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63  e(pPager->pCodec
34d30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  );.  pPager->xCo
34d40 64 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 6d 65  dec = pPager->me
34d50 6d 44 62 20 3f 20 30 20 3a 20 78 43 6f 64 65 63  mDb ? 0 : xCodec
34d60 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  ;.  pPager->xCod
34d70 65 63 53 69 7a 65 43 68 6e 67 20 3d 20 78 43 6f  ecSizeChng = xCo
34d80 64 65 63 53 69 7a 65 43 68 6e 67 3b 0a 20 20 70  decSizeChng;.  p
34d90 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65  Pager->xCodecFre
34da0 65 20 3d 20 78 43 6f 64 65 63 46 72 65 65 3b 0a  e = xCodecFree;.
34db0 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63    pPager->pCodec
34dc0 20 3d 20 70 43 6f 64 65 63 3b 0a 20 20 70 61 67   = pCodec;.  pag
34dd0 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61  erReportSize(pPa
34de0 67 65 72 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ger);.}.static v
34df0 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
34e00 72 47 65 74 43 6f 64 65 63 28 50 61 67 65 72 20  rGetCodec(Pager 
34e10 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
34e20 72 6e 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  rn pPager->pCode
34e30 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  c;.}.#endif..#if
34e40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
34e50 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
34e60 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20  * Move the page 
34e70 70 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  pPg to location 
34e80 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65  pgno in the file
34e90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ..**.** There mu
34ea0 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e  st be no referen
34eb0 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
34ec0 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74  previously locat
34ed0 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77  ed at.** pgno (w
34ee0 68 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67  hich we call pPg
34ef0 4f 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61 74  Old) though that
34f00 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64   page is allowed
34f10 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63   to be.** in cac
34f20 68 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  he.  If the page
34f30 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61   previously loca
34f40 74 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e  ted at pgno is n
34f50 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
34f60 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
34f70 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74  urnal, it is not
34f80 20 70 75 74 20 74 68 65 72 65 20 62 79 20 62 79   put there by by
34f90 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
34fa0 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20  *.** References 
34fb0 74 6f 20 74 68 65 20 70 61 67 65 20 70 50 67 20  to the page pPg 
34fc0 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70  remain valid. Up
34fd0 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65  dating any.** me
34fe0 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74  ta-data associat
34ff0 65 64 20 77 69 74 68 20 70 50 67 20 28 69 2e 65  ed with pPg (i.e
35000 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  . data stored in
35010 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65   the nExtra byte
35020 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  s.** allocated a
35030 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61  long with the pa
35040 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f  ge) is the respo
35050 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
35060 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
35070 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
35080 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e  t be active when
35090 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
350a0 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64   called. It used
350b0 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72   to be.** requir
350c0 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d  ed that a statem
350d0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
350e0 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20  was not active, 
350f0 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63  but this restric
35100 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e  tion.** has been
35110 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45   removed (CREATE
35120 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20   INDEX needs to 
35130 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e  move a page when
35140 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
35150 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
35160 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ctive)..**.** If
35170 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75   the fourth argu
35180 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c 20  ment, isCommit, 
35190 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
351a0 6e 20 74 68 69 73 20 70 61 67 65 20 69 73 20 62  n this page is b
351b0 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61 73  eing.** moved as
351c0 20 70 61 72 74 20 6f 66 20 61 20 64 61 74 61 62   part of a datab
351d0 61 73 65 20 72 65 6f 72 67 61 6e 69 7a 61 74 69  ase reorganizati
351e0 6f 6e 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74  on just before t
351f0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  he transaction .
35200 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d  ** is being comm
35210 69 74 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  itted. In this c
35220 61 73 65 2c 20 69 74 20 69 73 20 67 75 61 72 61  ase, it is guara
35230 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20 64  nteed that the d
35240 61 74 61 62 61 73 65 20 70 61 67 65 20 0a 2a 2a  atabase page .**
35250 20 70 50 67 20 72 65 66 65 72 73 20 74 6f 20 77   pPg refers to w
35260 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74  ill not be writt
35270 65 6e 20 74 6f 20 61 67 61 69 6e 20 77 69 74 68  en to again with
35280 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
35290 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
352a0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74  function may ret
352b0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
352c0 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
352d0 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72  code if an error
352e0 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 4f 74 68 65  .** occurs. Othe
352f0 72 77 69 73 65 2c 20 69 74 20 72 65 74 75 72 6e  rwise, it return
35300 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  s SQLITE_OK..*/.
35310 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
35320 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a  Movepage(Pager *
35330 70 50 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a  pPager, DbPage *
35340 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  pPg, Pgno pgno, 
35350 69 6e 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a 20  int isCommit){. 
35360 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20   PgHdr *pPgOld; 
35370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35380 20 54 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   The page being 
35390 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a  overwritten. */.
353a0 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50    Pgno needSyncP
353b0 67 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  gno = 0;       /
353c0 2a 20 4f 6c 64 20 76 61 6c 75 65 20 6f 66 20 70  * Old value of p
353d0 50 67 2d 3e 70 67 6e 6f 2c 20 69 66 20 73 79 6e  Pg->pgno, if syn
353e0 63 20 69 73 20 72 65 71 75 69 72 65 64 20 2a 2f  c is required */
353f0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
35400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35410 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
35420 2f 0a 20 20 50 67 6e 6f 20 6f 72 69 67 50 67 6e  /.  Pgno origPgn
35430 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
35440 20 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c   /* The original
35450 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
35460 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
35470 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  nRef>0 );..  /* 
35480 49 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 61  In order to be a
35490 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c  ble to rollback,
354a0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
354b0 74 61 62 61 73 65 20 6d 75 73 74 20 6a 6f 75 72  tabase must jour
354c0 6e 61 6c 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  nal.  ** the pag
354d0 65 20 77 65 20 61 72 65 20 6d 6f 76 69 6e 67 20  e we are moving 
354e0 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  from..  */.  if(
354f0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 72 63   MEMDB ){.    rc
35500 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
35510 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20 69  rite(pPg);.    i
35520 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
35530 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  c;.  }..  /* If 
35540 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 6d  the page being m
35550 6f 76 65 64 20 69 73 20 64 69 72 74 79 20 61 6e  oved is dirty an
35560 64 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 73  d has not been s
35570 61 76 65 64 20 62 79 20 74 68 65 20 6c 61 74 65  aved by the late
35580 73 74 0a 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e  st.  ** savepoin
35590 74 2c 20 74 68 65 6e 20 73 61 76 65 20 74 68 65  t, then save the
355a0 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
355b0 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e  s of the page in
355c0 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 73 75 62  to the .  ** sub
355d0 2d 6a 6f 75 72 6e 61 6c 20 6e 6f 77 2e 20 54 68  -journal now. Th
355e0 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20 74  is is required t
355f0 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 66 6f 6c  o handle the fol
35600 6c 6f 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a  lowing scenario:
35610 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 42 45 47  .  **.  **   BEG
35620 49 4e 3b 0a 20 20 2a 2a 20 20 20 20 20 3c 6a 6f  IN;.  **     <jo
35630 75 72 6e 61 6c 20 70 61 67 65 20 58 2c 20 74 68  urnal page X, th
35640 65 6e 20 6d 6f 64 69 66 79 20 69 74 20 69 6e 20  en modify it in 
35650 6d 65 6d 6f 72 79 3e 0a 20 20 2a 2a 20 20 20 20  memory>.  **    
35660 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a   SAVEPOINT one;.
35670 20 20 2a 2a 20 20 20 20 20 20 20 3c 4d 6f 76 65    **       <Move
35680 20 70 61 67 65 20 58 20 74 6f 20 6c 6f 63 61 74   page X to locat
35690 69 6f 6e 20 59 3e 0a 20 20 2a 2a 20 20 20 20 20  ion Y>.  **     
356a0 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b  ROLLBACK TO one;
356b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 61  .  **.  ** If pa
356c0 67 65 20 58 20 77 65 72 65 20 6e 6f 74 20 77 72  ge X were not wr
356d0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62  itten to the sub
356e0 2d 6a 6f 75 72 6e 61 6c 20 68 65 72 65 2c 20 69  -journal here, i
356f0 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a  t would not.  **
35700 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
35710 72 65 73 74 6f 72 65 20 69 74 73 20 63 6f 6e 74  restore its cont
35720 65 6e 74 73 20 77 68 65 6e 20 74 68 65 20 22 52  ents when the "R
35730 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 22 0a  OLLBACK TO one".
35740 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77    ** statement w
35750 65 72 65 20 69 73 20 70 72 6f 63 65 73 73 65 64  ere is processed
35760 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73 75 62 6a  ..  **.  ** subj
35770 6f 75 72 6e 61 6c 50 61 67 65 28 29 20 6d 61 79  ournalPage() may
35780 20 6e 65 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   need to allocat
35790 65 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65  e space to store
357a0 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 74 6f 0a   pPg->pgno into.
357b0 20 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65    ** one or more
357c0 20 73 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65   savepoint bitve
357d0 63 73 2e 20 54 68 69 73 20 69 73 20 74 68 65 20  cs. This is the 
357e0 72 65 61 73 6f 6e 20 74 68 69 73 20 66 75 6e 63  reason this func
357f0 74 69 6f 6e 0a 20 20 2a 2a 20 6d 61 79 20 72 65  tion.  ** may re
35800 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
35810 4d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  M..  */.  if( pP
35820 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
35830 49 52 54 59 0a 20 20 20 26 26 20 73 75 62 6a 52  IRTY.   && subjR
35840 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
35850 0a 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  .   && SQLITE_OK
35860 21 3d 28 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e  !=(rc = subjourn
35870 61 6c 50 61 67 65 28 70 50 67 29 29 0a 20 20 29  alPage(pPg)).  )
35880 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
35890 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41  .  }..  PAGERTRA
358a0 43 45 28 28 22 4d 4f 56 45 20 25 64 20 70 61 67  CE(("MOVE %d pag
358b0 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25  e %d (needSync=%
358c0 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e  d) moves to %d\n
358d0 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52 49  ", .      PAGERI
358e0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
358f0 70 67 6e 6f 2c 20 28 70 50 67 2d 3e 66 6c 61 67  pgno, (pPg->flag
35900 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
35910 43 29 3f 31 3a 30 2c 20 70 67 6e 6f 29 29 3b 0a  C)?1:0, pgno));.
35920 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45    IOTRACE(("MOVE
35930 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50   %p %d %d\n", pP
35940 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
35950 20 70 67 6e 6f 29 29 0a 0a 20 20 2f 2a 20 49 66   pgno))..  /* If
35960 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65   the journal nee
35970 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65  ds to be sync()e
35980 64 20 62 65 66 6f 72 65 20 70 61 67 65 20 70 50  d before page pP
35990 67 2d 3e 70 67 6e 6f 20 63 61 6e 0a 20 20 2a 2a  g->pgno can.  **
359a0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2c 20   be written to, 
359b0 73 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20  store pPg->pgno 
359c0 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  in local variabl
359d0 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a  e needSyncPgno..
359e0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
359f0 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69   isCommit flag i
35a00 73 20 73 65 74 2c 20 74 68 65 72 65 20 69 73 20  s set, there is 
35a10 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  no need to remem
35a20 62 65 72 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ber that.  ** th
35a30 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20  e journal needs 
35a40 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62  to be sync()ed b
35a50 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70  efore database p
35a60 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20 0a 20  age pPg->pgno . 
35a70 20 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74   ** can be writt
35a80 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65  en to. The calle
35a90 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72  r has already pr
35aa0 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72  omised not to wr
35ab0 69 74 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a  ite to it..  */.
35ac0 20 20 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67    if( (pPg->flag
35ad0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
35ae0 43 29 20 26 26 20 21 69 73 43 6f 6d 6d 69 74 20  C) && !isCommit 
35af0 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50  ){.    needSyncP
35b00 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
35b10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67  .    assert( pag
35b20 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20  eInJournal(pPg) 
35b30 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  || pPg->pgno>pPa
35b40 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
35b50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
35b60 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
35b70 44 49 52 54 59 20 29 3b 0a 20 20 20 20 61 73 73  DIRTY );.    ass
35b80 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
35b90 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20  dSync );.  }..  
35ba0 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20  /* If the cache 
35bb0 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20  contains a page 
35bc0 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72  with page-number
35bd0 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74   pgno, remove it
35be0 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68  .  ** from its h
35bf0 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c  ash chain. Also,
35c00 20 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65   if the PgHdr.ne
35c10 65 64 53 79 6e 63 20 77 61 73 20 73 65 74 20 66  edSync was set f
35c20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67  or .  ** page pg
35c30 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d  no before the 'm
35c40 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20  ove' operation, 
35c50 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  it needs to be r
35c60 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f  etained .  ** fo
35c70 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64  r the page moved
35c80 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70   there..  */.  p
35c90 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47  Pg->flags &= ~PG
35ca0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
35cb0 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f   pPgOld = pager_
35cc0 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
35cd0 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  gno);.  assert( 
35ce0 21 70 50 67 4f 6c 64 20 7c 7c 20 70 50 67 4f 6c  !pPgOld || pPgOl
35cf0 64 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 20 20  d->nRef==1 );.  
35d00 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20  if( pPgOld ){.  
35d10 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
35d20 28 70 50 67 4f 6c 64 2d 3e 66 6c 61 67 73 26 50  (pPgOld->flags&P
35d30 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3b  GHDR_NEED_SYNC);
35d40 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29  .    if( MEMDB )
35d50 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
35d60 74 20 64 69 73 63 61 72 64 20 70 61 67 65 73 20  t discard pages 
35d70 66 72 6f 6d 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  from an in-memor
35d80 79 20 64 61 74 61 62 61 73 65 20 73 69 6e 63 65  y database since
35d90 20 77 65 20 6d 69 67 68 74 0a 20 20 20 20 20 20   we might.      
35da0 2a 2a 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62  ** need to rollb
35db0 61 63 6b 20 6c 61 74 65 72 2e 20 20 4a 75 73 74  ack later.  Just
35dc0 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 6f   move the page o
35dd0 75 74 20 6f 66 20 74 68 65 20 77 61 79 2e 20 2a  ut of the way. *
35de0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
35df0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
35e00 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  lid );.      sql
35e10 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70  ite3PcacheMove(p
35e20 50 67 4f 6c 64 2c 20 70 50 61 67 65 72 2d 3e 64  PgOld, pPager->d
35e30 62 53 69 7a 65 2b 31 29 3b 0a 20 20 20 20 7d 65  bSize+1);.    }e
35e40 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
35e50 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67  e3PcacheDrop(pPg
35e60 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Old);.    }.  }.
35e70 0a 20 20 6f 72 69 67 50 67 6e 6f 20 3d 20 70 50  .  origPgno = pP
35e80 67 2d 3e 70 67 6e 6f 3b 0a 20 20 73 71 6c 69 74  g->pgno;.  sqlit
35e90 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67  e3PcacheMove(pPg
35ea0 2c 20 70 67 6e 6f 29 3b 0a 20 20 73 71 6c 69 74  , pgno);.  sqlit
35eb0 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
35ec0 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72  y(pPg);.  pPager
35ed0 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31  ->dbModified = 1
35ee0 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e  ;..  if( needSyn
35ef0 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20  cPgno ){.    /* 
35f00 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20  If needSyncPgno 
35f10 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
35f20 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
35f30 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a  le needs to be .
35f40 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20      ** sync()ed 
35f50 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
35f60 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61  is written to da
35f70 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65  tabase file page
35f80 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20   needSyncPgno.. 
35f90 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c     ** Currently,
35fa0 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78   no such page ex
35fb0 69 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65  ists in the page
35fc0 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a  -cache and the .
35fd0 20 20 20 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e      ** "is journ
35fe0 61 6c 65 64 22 20 62 69 74 76 65 63 20 66 6c 61  aled" bitvec fla
35ff0 67 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  g has been set. 
36000 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65  This needs to be
36010 20 72 65 6d 65 64 69 65 64 20 62 79 0a 20 20 20   remedied by.   
36020 20 2a 2a 20 6c 6f 61 64 69 6e 67 20 74 68 65 20   ** loading the 
36030 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61  page into the pa
36040 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65  ger-cache and se
36050 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e  tting the PgHdr.
36060 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a  needSync .    **
36070 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20   flag..    **.  
36080 20 20 2a 2a 20 49 66 20 74 68 65 20 61 74 74 65    ** If the atte
36090 6d 70 74 20 74 6f 20 6c 6f 61 64 20 74 68 65 20  mpt to load the 
360a0 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61  page into the pa
360b0 67 65 2d 63 61 63 68 65 20 66 61 69 6c 73 2c 20  ge-cache fails, 
360c0 28 64 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61  (due.    ** to a
360d0 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
360e0 66 61 69 6c 75 72 65 29 2c 20 63 6c 65 61 72 20  failure), clear 
360f0 74 68 65 20 62 69 74 20 69 6e 20 74 68 65 20 70  the bit in the p
36100 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20  InJournal[].    
36110 2a 2a 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77  ** array. Otherw
36120 69 73 65 2c 20 69 66 20 74 68 65 20 70 61 67 65  ise, if the page
36130 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 77   is loaded and w
36140 72 69 74 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a  ritten again in.
36150 20 20 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e      ** this tran
36160 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20  saction, it may 
36170 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
36180 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
36190 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74  before.    ** it
361a0 20 69 73 20 73 79 6e 63 65 64 20 69 6e 74 6f 20   is synced into 
361b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
361c0 2e 20 54 68 69 73 20 77 61 79 2c 20 69 74 20 6d  . This way, it m
361d0 61 79 20 65 6e 64 20 75 70 20 69 6e 0a 20 20 20  ay end up in.   
361e0 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
361f0 66 69 6c 65 20 74 77 69 63 65 2c 20 62 75 74 20  file twice, but 
36200 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72  that is not a pr
36210 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20  oblem..    **.  
36220 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33    ** The sqlite3
36230 50 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20  PagerGet() call 
36240 6d 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f  may cause the jo
36250 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53  urnal to sync. S
36260 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75  o make.    ** su
36270 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65  re the Pager.nee
36280 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65  dSync flag is se
36290 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20  t too..    */.  
362a0 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
362b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
362c0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b  ger->needSync );
362d0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
362e0 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
362f0 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20  , needSyncPgno, 
36300 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66  &pPgHdr);.    if
36310 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
36320 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65  ){.      if( nee
36330 64 53 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65  dSyncPgno<=pPage
36340 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b  r->dbOrigSize ){
36350 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
36360 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
36370 63 65 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ce!=0 );.       
36380 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 6c   sqlite3BitvecCl
36390 65 61 72 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ear(pPager->pInJ
363a0 6f 75 72 6e 61 6c 2c 20 6e 65 65 64 53 79 6e 63  ournal, needSync
363b0 50 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 70 54  Pgno, pPager->pT
363c0 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20  mpSpace);.      
363d0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  }.      return r
363e0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  c;.    }.    pPa
363f0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
36400 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
36410 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30  Pager->noSync==0
36420 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   && !MEMDB );.  
36430 20 20 70 50 67 48 64 72 2d 3e 66 6c 61 67 73 20    pPgHdr->flags 
36440 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
36450 4e 43 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  NC;.    sqlite3P
36460 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
36470 50 67 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69  PgHdr);.    sqli
36480 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
36490 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  gHdr);.  }..  /*
364a0 0a 20 20 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d  .  ** For an in-
364b0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
364c0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f   make sure the o
364d0 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
364e0 74 69 6e 75 65 73 0a 20 20 2a 2a 20 74 6f 20 65  tinues.  ** to e
364f0 78 69 73 74 2c 20 69 6e 20 63 61 73 65 20 74 68  xist, in case th
36500 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65  e transaction ne
36510 65 64 73 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  eds to roll back
36520 2e 20 20 55 73 65 20 70 50 67 4f 6c 64 0a 20 20  .  Use pPgOld.  
36530 2a 2a 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e  ** as the origin
36540 61 6c 20 70 61 67 65 20 73 69 6e 63 65 20 69 74  al page since it
36550 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
36560 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 20 20 2a  n allocated..  *
36570 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  /.  if( MEMDB ){
36580 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
36590 68 65 4d 6f 76 65 28 70 50 67 4f 6c 64 2c 20 6f  heMove(pPgOld, o
365a0 72 69 67 50 67 6e 6f 29 3b 0a 20 20 20 20 73 71  rigPgno);.    sq
365b0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
365c0 70 50 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20  pPgOld);.  }..  
365d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
365e0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
365f0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
36600 65 72 20 74 6f 20 74 68 65 20 64 61 74 61 20 66  er to the data f
36610 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
36620 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a   page..*/.void *
36630 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
36640 61 74 61 28 44 62 50 61 67 65 20 2a 70 50 67 29  ata(DbPage *pPg)
36650 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  {.  assert( pPg-
36660 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 50 67 2d 3e  >nRef>0 || pPg->
36670 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 3b  pPager->memDb );
36680 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70  .  return pPg->p
36690 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Data;.}../*.** R
366a0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
366b0 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78  to the Pager.nEx
366c0 74 72 61 20 62 79 74 65 73 20 6f 66 20 22 65 78  tra bytes of "ex
366d0 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61  tra" space .** a
366e0 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77  llocated along w
366f0 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65  ith the specifie
36700 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20  d page..*/.void 
36710 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  *sqlite3PagerGet
36720 45 78 74 72 61 28 44 62 50 61 67 65 20 2a 70 50  Extra(DbPage *pP
36730 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g){.  return pPg
36740 2d 3e 70 45 78 74 72 61 3b 0a 7d 0a 0a 2f 2a 0a  ->pExtra;.}../*.
36750 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c  ** Get/set the l
36760 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20  ocking-mode for 
36770 74 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61  this pager. Para
36780 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74  meter eMode must
36790 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41   be one.** of PA
367a0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
367b0 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43  QUERY, PAGER_LOC
367c0 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
367d0 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43  or .** PAGER_LOC
367e0 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
367f0 56 45 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d  VE. If the param
36800 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45  eter is not _QUE
36810 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  RY, then.** the 
36820 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20  locking-mode is 
36830 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
36840 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
36850 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
36860 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 50  alue is either P
36870 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
36880 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41  _NORMAL or.** PA
36890 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
368a0 45 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63  EXCLUSIVE, indic
368b0 61 74 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  ating the curren
368c0 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61  t (possibly upda
368d0 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d  ted).** locking-
368e0 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mode..*/.int sql
368f0 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
36900 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67  Mode(Pager *pPag
36910 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a  er, int eMode){.
36920 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
36930 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
36940 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20  DE_QUERY.       
36950 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
36960 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
36970 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20  _NORMAL.        
36980 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
36990 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
369a0 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61  EXCLUSIVE );.  a
369b0 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
369c0 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30  KINGMODE_QUERY<0
369d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
369e0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
369f0 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47  NORMAL>=0 && PAG
36a00 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
36a10 58 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20  XCLUSIVE>=0 );. 
36a20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26   if( eMode>=0 &&
36a30 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
36a40 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  le ){.    pPager
36a50 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
36a60 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d  = (u8)eMode;.  }
36a70 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70  .  return (int)p
36a80 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
36a90 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Mode;.}../*.** G
36aa0 65 74 2f 73 65 74 20 74 68 65 20 6a 6f 75 72 6e  et/set the journ
36ab0 61 6c 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73  al-mode for this
36ac0 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65   pager. Paramete
36ad0 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20  r eMode must be 
36ae0 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  one of:.**.**   
36af0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
36b00 44 45 5f 51 55 45 52 59 0a 2a 2a 20 20 20 20 50  DE_QUERY.**    P
36b10 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
36b20 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 50 41  _DELETE.**    PA
36b30 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
36b40 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 50  TRUNCATE.**    P
36b50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
36b60 5f 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 50  _PERSIST.**    P
36b70 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
36b80 5f 4f 46 46 0a 2a 2a 20 20 20 20 50 41 47 45 52  _OFF.**    PAGER
36b90 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
36ba0 4f 52 59 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f  ORY.**    PAGER_
36bb0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 0a  JOURNALMODE_WAL.
36bc0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 72  **.** If the par
36bd0 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51  ameter is not _Q
36be0 55 45 52 59 2c 20 74 68 65 6e 20 74 68 65 20 6a  UERY, then the j
36bf0 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 69 73 20 73  ournal_mode is s
36c00 65 74 20 74 6f 20 74 68 65 0a 2a 2a 20 76 61 6c  et to the.** val
36c10 75 65 20 73 70 65 63 69 66 69 65 64 20 69 66 20  ue specified if 
36c20 74 68 65 20 63 68 61 6e 67 65 20 69 73 20 61 6c  the change is al
36c30 6c 6f 77 65 64 2e 20 54 68 65 20 63 68 61 6e 67  lowed. The chang
36c40 65 20 6d 61 79 20 62 65 20 64 69 73 61 6c 6c 6f  e may be disallo
36c50 77 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 66  wed.** for the f
36c60 6f 6c 6c 6f 77 69 6e 67 20 72 65 61 73 6f 6e 73  ollowing reasons
36c70 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20  :.**.**   *  An 
36c80 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
36c90 73 65 20 63 61 6e 20 6f 6e 6c 79 20 68 61 76 65  se can only have
36ca0 20 69 74 73 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   its journal_mod
36cb0 65 20 73 65 74 20 74 6f 20 5f 4f 46 46 0a 2a 2a  e set to _OFF.**
36cc0 20 20 20 20 20 20 6f 72 20 5f 4d 45 4d 4f 52 59        or _MEMORY
36cd0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65  ..**.**   *  The
36ce0 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 6d 61   journal mode ma
36cf0 79 20 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64  y not be changed
36d00 20 77 68 69 6c 65 20 61 20 74 72 61 6e 73 61 63   while a transac
36d10 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
36d20 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
36d30 65 64 20 69 6e 64 69 63 61 74 65 20 74 68 65 20  ed indicate the 
36d40 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c  current (possibl
36d50 79 20 75 70 64 61 74 65 64 29 20 6a 6f 75 72 6e  y updated) journ
36d60 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  al-mode..*/.int 
36d70 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72  sqlite3PagerJour
36d80 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 70  nalMode(Pager *p
36d90 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65  Pager, int eMode
36da0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f  ){.  assert( eMo
36db0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
36dc0 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20  LMODE_QUERY.    
36dd0 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
36de0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
36df0 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20  ODE_DELETE.     
36e00 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
36e10 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
36e20 44 45 5f 54 52 55 4e 43 41 54 45 0a 20 20 20 20  DE_TRUNCATE.    
36e30 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
36e40 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
36e50 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20  ODE_PERSIST.    
36e60 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
36e70 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
36e80 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
36e90 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
36ea0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
36eb0 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  _WAL .          
36ec0 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
36ed0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
36ee0 4d 4f 52 59 20 29 3b 0a 20 20 61 73 73 65 72 74  MORY );.  assert
36ef0 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ( PAGER_JOURNALM
36f00 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 0a  ODE_QUERY<0 );..
36f10 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 50 41 47    if( eMode==PAG
36f20 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
36f30 41 4c 20 0a 20 20 20 26 26 20 70 50 61 67 65 72  AL .   && pPager
36f40 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
36f50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
36f60 5f 44 45 4c 45 54 45 0a 20 20 29 7b 0a 20 20 20  _DELETE.  ){.   
36f70 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
36f80 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
36f90 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 3b 0a 20 20  RNALMODE_WAL;.  
36fa0 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3e  }else if( eMode>
36fb0 3d 30 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  =0.   && (pPager
36fc0 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
36fd0 20 65 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f   eMode!=PAGER_JO
36fe0 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20  URNALMODE_WAL). 
36ff0 20 20 26 26 20 28 21 4d 45 4d 44 42 20 7c 7c 20    && (!MEMDB || 
37000 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
37010 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 7c  RNALMODE_MEMORY|
37020 7c 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  |eMode==PAGER_JO
37030 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 29 0a 20  URNALMODE_OFF). 
37040 20 20 26 26 20 21 70 50 61 67 65 72 2d 3e 64 62    && !pPager->db
37050 4d 6f 64 69 66 69 65 64 0a 20 20 20 26 26 20 28  Modified.   && (
37060 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
37070 6a 66 64 29 20 7c 7c 20 30 3d 3d 70 50 61 67 65  jfd) || 0==pPage
37080 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 0a 20  r->journalOff). 
37090 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 4f 70   ){.    if( isOp
370a0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
370b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
370c0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
370d0 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  jfd);.    }.    
370e0 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
370f0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
37100 41 54 45 20 26 20 31 29 3d 3d 31 20 29 3b 0a 20  ATE & 1)==1 );. 
37110 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
37120 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
37130 52 53 49 53 54 20 26 20 31 29 3d 3d 31 20 29 3b  RSIST & 1)==1 );
37140 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
37150 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
37160 44 45 4c 45 54 45 20 26 20 31 29 3d 3d 30 20 29  DELETE & 1)==0 )
37170 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
37180 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
37190 5f 4d 45 4d 4f 52 59 20 26 20 31 29 3d 3d 30 20  _MEMORY & 1)==0 
371a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
371b0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
371c0 45 5f 4f 46 46 20 26 20 31 29 3d 3d 30 20 29 3b  E_OFF & 1)==0 );
371d0 0a 20 20 20 20 69 66 28 20 28 70 50 61 67 65 72  .    if( (pPager
371e0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20  ->journalMode & 
371f0 31 29 3d 3d 31 20 26 26 20 28 65 4d 6f 64 65 20  1)==1 && (eMode 
37200 26 20 31 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  & 1)==0.        
37210 20 26 26 20 21 70 50 61 67 65 72 2d 3e 65 78 63   && !pPager->exc
37220 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
37230 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
37240 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
37250 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
37260 61 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20  al, 0);.    }.. 
37270 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
37280 61 6c 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f  alMode = (u8)eMo
37290 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  de;.  }.  return
372a0 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f   (int)pPager->jo
372b0 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a  urnalMode;.}../*
372c0 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20  .** Get/set the 
372d0 73 69 7a 65 2d 6c 69 6d 69 74 20 75 73 65 64 20  size-limit used 
372e0 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a  for persistent j
372f0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a  ournal files..**
37300 0a 2a 2a 20 53 65 74 74 69 6e 67 20 74 68 65 20  .** Setting the 
37310 73 69 7a 65 20 6c 69 6d 69 74 20 74 6f 20 2d 31  size limit to -1
37320 20 6d 65 61 6e 73 20 6e 6f 20 6c 69 6d 69 74 20   means no limit 
37330 69 73 20 65 6e 66 6f 72 63 65 64 2e 0a 2a 2a 20  is enforced..** 
37340 41 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 73 65  An attempt to se
37350 74 20 61 20 6c 69 6d 69 74 20 73 6d 61 6c 6c 65  t a limit smalle
37360 72 20 74 68 61 6e 20 2d 31 20 69 73 20 61 20 6e  r than -1 is a n
37370 6f 2d 6f 70 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c  o-op..*/.i64 sql
37380 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
37390 53 69 7a 65 4c 69 6d 69 74 28 50 61 67 65 72 20  SizeLimit(Pager 
373a0 2a 70 50 61 67 65 72 2c 20 69 36 34 20 69 4c 69  *pPager, i64 iLi
373b0 6d 69 74 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d  mit){.  if( iLim
373c0 69 74 3e 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50  it>=-1 ){.    pP
373d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
373e0 65 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b  eLimit = iLimit;
373f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50  .  }.  return pP
37400 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
37410 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eLimit;.}../*.**
37420 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
37430 72 20 74 6f 20 74 68 65 20 70 50 61 67 65 72 2d  r to the pPager-
37440 3e 70 42 61 63 6b 75 70 20 76 61 72 69 61 62 6c  >pBackup variabl
37450 65 2e 20 54 68 65 20 62 61 63 6b 75 70 20 6d 6f  e. The backup mo
37460 64 75 6c 65 0a 2a 2a 20 69 6e 20 62 61 63 6b 75  dule.** in backu
37470 70 2e 63 20 6d 61 69 6e 74 61 69 6e 73 20 74 68  p.c maintains th
37480 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69  e content of thi
37490 73 20 76 61 72 69 61 62 6c 65 2e 20 54 68 69 73  s variable. This
374a0 20 6d 6f 64 75 6c 65 0a 2a 2a 20 75 73 65 73 20   module.** uses 
374b0 69 74 20 6f 70 61 71 75 65 6c 79 20 61 73 20 61  it opaquely as a
374c0 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71  n argument to sq
374d0 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
374e0 72 74 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69  rt() and.** sqli
374f0 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
37500 29 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 71 6c 69 74  ) only..*/.sqlit
37510 65 33 5f 62 61 63 6b 75 70 20 2a 2a 73 71 6c 69  e3_backup **sqli
37520 74 65 33 50 61 67 65 72 42 61 63 6b 75 70 50 74  te3PagerBackupPt
37530 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
37540 7b 0a 20 20 72 65 74 75 72 6e 20 26 70 50 61 67  {.  return &pPag
37550 65 72 2d 3e 70 42 61 63 6b 75 70 3b 0a 7d 0a 0a  er->pBackup;.}..
37560 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
37570 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68  MIT_WAL./*.** Th
37580 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
37590 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 75  alled when the u
375a0 73 65 72 20 69 6e 76 6f 6b 65 73 20 22 50 52 41  ser invokes "PRA
375b0 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74 22 2e  GMA checkpoint".
375c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
375d0 61 67 65 72 43 68 65 63 6b 70 6f 69 6e 74 28 50  agerCheckpoint(P
375e0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
375f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
37600 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
37610 72 2d 3e 70 57 61 6c 20 29 7b 0a 20 20 20 20 75  r->pWal ){.    u
37620 38 20 2a 7a 42 75 66 20 3d 20 28 75 38 20 2a 29  8 *zBuf = (u8 *)
37630 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
37640 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
37650 74 65 33 57 61 6c 43 68 65 63 6b 70 6f 69 6e 74  te3WalCheckpoint
37660 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 0a 20  (pPager->pWal,. 
37670 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
37680 6e 6f 53 79 6e 63 20 3f 20 30 20 3a 20 70 50 61  noSync ? 0 : pPa
37690 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
376a0 2c 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ,.        pPager
376b0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 7a 42 75 66  ->pageSize, zBuf
376c0 2c 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  , .        pPage
376d0 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 2c  r->xBusyHandler,
376e0 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
376f0 6e 64 6c 65 72 41 72 67 0a 20 20 20 20 29 3b 0a  ndlerArg.    );.
37700 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
37710 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .}..int sqlite3P
37720 61 67 65 72 57 61 6c 43 61 6c 6c 62 61 63 6b 28  agerWalCallback(
37730 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
37740 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
37750 57 61 6c 43 61 6c 6c 62 61 63 6b 28 70 50 61 67  WalCallback(pPag
37760 65 72 2d 3e 70 57 61 6c 29 3b 0a 7d 0a 0a 2f 2a  er->pWal);.}../*
37770 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
37780 69 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  if the underlyin
37790 67 20 56 46 53 20 66 6f 72 20 74 68 65 20 67 69  g VFS for the gi
377a0 76 65 6e 20 70 61 67 65 72 20 73 75 70 70 6f 72  ven pager suppor
377b0 74 73 20 74 68 65 0a 2a 2a 20 70 72 69 6d 69 74  ts the.** primit
377c0 69 76 65 73 20 6e 65 63 65 73 73 61 72 79 20 66  ives necessary f
377d0 6f 72 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c  or write-ahead l
377e0 6f 67 67 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ogging..*/.int s
377f0 71 6c 69 74 65 33 50 61 67 65 72 57 61 6c 53 75  qlite3PagerWalSu
37800 70 70 6f 72 74 65 64 28 50 61 67 65 72 20 2a 70  pported(Pager *p
37810 50 61 67 65 72 29 7b 0a 20 20 63 6f 6e 73 74 20  Pager){.  const 
37820 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
37830 64 73 20 2a 70 4d 65 74 68 6f 64 73 20 3d 20 70  ds *pMethods = p
37840 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
37850 6f 64 73 3b 0a 20 20 72 65 74 75 72 6e 20 70 4d  ods;.  return pM
37860 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e  ethods->iVersion
37870 3e 3d 32 20 26 26 20 70 4d 65 74 68 6f 64 73 2d  >=2 && pMethods-
37880 3e 78 53 68 6d 4f 70 65 6e 21 3d 30 3b 0a 7d 0a  >xShmOpen!=0;.}.
37890 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 63 6f  ./*.** Open a co
378a0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nnection to the 
378b0 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20  write-ahead log 
378c0 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
378d0 50 61 67 65 72 2e 20 49 66 0a 2a 2a 20 74 68 65  Pager. If.** the
378e0 20 6c 6f 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   log connection 
378f0 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  is already open,
37900 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
37910 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
37920 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
37930 20 62 65 20 68 6f 6c 64 69 6e 67 20 61 20 53 48   be holding a SH
37940 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ARED lock on the
37950 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
37960 6f 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 66  o call.** this f
37970 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
37980 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
37990 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
379a0 72 2c 20 69 6e 74 20 2a 70 69 73 4f 70 65 6e 29  r, int *pisOpen)
379b0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
379c0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
379d0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
379e0 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  de */..  assert(
379f0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
37a00 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
37a10 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 70    if( !pPager->p
37a20 57 61 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21  Wal ){.    if( !
37a30 73 71 6c 69 74 65 33 50 61 67 65 72 57 61 6c 53  sqlite3PagerWalS
37a40 75 70 70 6f 72 74 65 64 28 70 50 61 67 65 72 29  upported(pPager)
37a50 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
37a60 5f 43 41 4e 54 4f 50 45 4e 3b 0a 0a 20 20 20 20  _CANTOPEN;..    
37a70 2f 2a 20 4f 70 65 6e 20 74 68 65 20 63 6f 6e 6e  /* Open the conn
37a80 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 6f  ection to the lo
37a90 67 20 66 69 6c 65 2e 20 49 66 20 74 68 69 73 20  g file. If this 
37aa0 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 2c  operation fails,
37ab0 20 0a 20 20 20 20 2a 2a 20 28 65 2e 67 2e 20 64   .    ** (e.g. d
37ac0 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 28 29 20 66  ue to malloc() f
37ad0 61 69 6c 75 72 65 29 2c 20 75 6e 6c 6f 63 6b 20  ailure), unlock 
37ae0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
37af0 65 20 61 6e 64 20 0a 20 20 20 20 2a 2a 20 72 65  e and .    ** re
37b00 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
37b10 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  de..    */.    r
37b20 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 4f 70  c = sqlite3WalOp
37b30 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  en(pPager->pVfs,
37b40 20 70 50 61 67 65 72 2d 3e 66 64 2c 0a 20 20 20   pPager->fd,.   
37b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b60 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69       pPager->zFi
37b70 6c 65 6e 61 6d 65 2c 20 26 70 50 61 67 65 72 2d  lename, &pPager-
37b80 3e 70 57 61 6c 29 3b 0a 20 20 20 20 69 66 28 20  >pWal);.    if( 
37b90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
37ba0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
37bb0 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
37bc0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
37bd0 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  AL;.    }.  }els
37be0 65 7b 0a 20 20 20 20 2a 70 69 73 4f 70 65 6e 20  e{.    *pisOpen 
37bf0 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = 1;.  }..  retu
37c00 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
37c10 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
37c20 20 63 61 6c 6c 65 64 20 74 6f 20 63 6c 6f 73 65   called to close
37c30 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
37c40 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20  to the log file 
37c50 70 72 69 6f 72 0a 2a 2a 20 74 6f 20 73 77 69 74  prior.** to swit
37c60 63 68 69 6e 67 20 66 72 6f 6d 20 57 41 4c 20 74  ching from WAL t
37c70 6f 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2e  o rollback mode.
37c80 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 63 6c  .**.** Before cl
37c90 6f 73 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69  osing the log fi
37ca0 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  le, this functio
37cb0 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 74 61  n attempts to ta
37cc0 6b 65 20 61 6e 20 0a 2a 2a 20 45 58 43 4c 55 53  ke an .** EXCLUS
37cd0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
37ce0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
37cf0 66 20 74 68 69 73 20 63 61 6e 6e 6f 74 20 62 65  f this cannot be
37d00 20 6f 62 74 61 69 6e 65 64 2c 20 61 6e 0a 2a 2a   obtained, an.**
37d10 20 65 72 72 6f 72 20 28 53 51 4c 49 54 45 5f 42   error (SQLITE_B
37d20 55 53 59 29 20 69 73 20 72 65 74 75 72 6e 65 64  USY) is returned
37d30 20 61 6e 64 20 74 68 65 20 6c 6f 67 20 63 6f 6e   and the log con
37d40 6e 65 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63  nection is not c
37d50 6c 6f 73 65 64 2e 0a 2a 2a 20 49 66 20 73 75 63  losed..** If suc
37d60 63 65 73 73 66 75 6c 2c 20 74 68 65 20 45 58 43  cessful, the EXC
37d70 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 6e  LUSIVE lock is n
37d80 6f 74 20 72 65 6c 65 61 73 65 64 20 62 65 66 6f  ot released befo
37d90 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
37da0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
37db0 72 43 6c 6f 73 65 57 61 6c 28 50 61 67 65 72 20  rCloseWal(Pager 
37dc0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
37dd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
37de0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
37df0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
37e00 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
37e10 45 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 49  E_WAL );..  /* I
37e20 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 69  f the log file i
37e30 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
37e40 65 6e 2c 20 62 75 74 20 64 6f 65 73 20 65 78 69  en, but does exi
37e50 73 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  st in the file-s
37e60 79 73 74 65 6d 2c 0a 20 20 2a 2a 20 69 74 20 6d  ystem,.  ** it m
37e70 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68  ay need to be ch
37e80 65 63 6b 70 6f 69 6e 74 65 64 20 62 65 66 6f 72  eckpointed befor
37e90 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  e the connection
37ea0 20 63 61 6e 20 73 77 69 74 63 68 20 74 6f 0a 20   can switch to. 
37eb0 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64   ** rollback mod
37ec0 65 2e 20 4f 70 65 6e 20 69 74 20 6e 6f 77 20 73  e. Open it now s
37ed0 6f 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65  o this can happe
37ee0 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  n..  */.  if( !p
37ef0 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 7b 0a 20  Pager->pWal ){. 
37f00 20 20 20 69 6e 74 20 6c 6f 67 65 78 69 73 74 73     int logexists
37f10 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
37f20 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
37f30 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
37f40 4c 4f 43 4b 5f 53 48 41 52 45 44 29 3b 0a 20 20  LOCK_SHARED);.  
37f50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
37f60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
37f70 3d 20 70 61 67 65 72 48 61 73 57 41 4c 28 70 50  = pagerHasWAL(pP
37f80 61 67 65 72 2c 20 26 6c 6f 67 65 78 69 73 74 73  ager, &logexists
37f90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
37fa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
37fb0 26 20 6c 6f 67 65 78 69 73 74 73 20 29 7b 0a 20  & logexists ){. 
37fc0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
37fd0 33 57 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  3WalOpen(pPager-
37fe0 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 66  >pVfs, pPager->f
37ff0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
38000 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
38010 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
38020 26 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  &pPager->pWal);.
38030 20 20 20 20 7d 0a 20 20 7d 0a 20 20 20 20 0a 20      }.  }.    . 
38040 20 2f 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 61   /* Checkpoint a
38050 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 6c 6f 67  nd close the log
38060 2e 20 42 65 63 61 75 73 65 20 61 6e 20 45 58 43  . Because an EXC
38070 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 68  LUSIVE lock is h
38080 65 6c 64 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20  eld on.  ** the 
38090 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
380a0 68 65 20 6c 6f 67 20 61 6e 64 20 6c 6f 67 2d 73  he log and log-s
380b0 75 6d 6d 61 72 79 20 66 69 6c 65 73 20 77 69 6c  ummary files wil
380c0 6c 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 20 20  l be deleted..  
380d0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
380e0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
380f0 2d 3e 70 57 61 6c 20 29 7b 0a 20 20 20 20 72 63  ->pWal ){.    rc
38100 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
38110 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
38120 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49  ITE_LOCK_EXCLUSI
38130 56 45 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  VE);.    if( rc=
38140 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
38150 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
38160 57 61 6c 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  WalClose(pPager-
38170 3e 70 57 61 6c 2c 0a 20 20 20 20 20 20 20 20 20  >pWal,.         
38180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38190 20 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e    (pPager->noSyn
381a0 63 20 3f 20 30 20 3a 20 70 50 61 67 65 72 2d 3e  c ? 0 : pPager->
381b0 73 79 6e 63 5f 66 6c 61 67 73 29 2c 20 0a 20 20  sync_flags), .  
381c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
381d0 67 65 53 69 7a 65 2c 20 28 75 38 2a 29 70 50 61  geSize, (u8*)pPa
381e0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 0a 20  ger->pTmpSpace. 
381f0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70 50       );.      pP
38200 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a  ager->pWal = 0;.
38210 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
38220 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74   /* If we cannot
38230 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   get an EXCLUSIV
38240 45 20 6c 6f 63 6b 2c 20 64 6f 77 6e 67 72 61 64  E lock, downgrad
38250 65 20 74 68 65 20 50 45 4e 44 49 4e 47 20 6c 6f  e the PENDING lo
38260 63 6b 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ck.      ** that
38270 20 77 65 20 64 69 64 20 67 65 74 20 62 61 63 6b   we did get back
38280 20 74 6f 20 53 48 41 52 45 44 2e 20 2a 2f 0a 20   to SHARED. */. 
38290 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
382a0 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
382b0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41   SQLITE_LOCK_SHA
382c0 52 45 44 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RED);.    }.  }.
382d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
382e0 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a  endif..#endif /*
382f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
38300 4b 49 4f 20 2a 2f 0a                             KIO */.