/ Hex Artifact Content
Login

Artifact 65efcf8cc70de5facf4375dbd78a99ceb3d19d6e:


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: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2660: 4d 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57  MIT_WAL.  u32 aW
2670: 61 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50  alData[WAL_SAVEP
2680: 4f 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20  OINT_NDATA];    
2690: 20 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70      /* WAL savep
26a0: 6f 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  oint context */.
26b0: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
26c0: 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63   A open page cac
26d0: 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  he is an instanc
26e0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
26f0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ng structure..**
2700: 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a  .** errCode.**.*
2710: 2a 20 20 20 50 61 67 65 72 2e 65 72 72 43 6f 64  *   Pager.errCod
2720: 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  e may be set to 
2730: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
2740: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72  LITE_CORRUPT, or
2750: 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49 54 45 5f  .**   or SQLITE_
2760: 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f  FULL. Once one o
2770: 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  f the first thre
2780: 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73 2c  e errors occurs,
2790: 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a 20   it persists.** 
27a0: 20 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65    and is returne
27b0: 64 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20  d as the result 
27c0: 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70  of every major p
27d0: 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20  ager API call.  
27e0: 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f  The.**   SQLITE_
27f0: 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64 65  FULL return code
2800: 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69 66   is slightly dif
2810: 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73 69  ferent. It persi
2820: 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74  sts only until t
2830: 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20 73 75 63  he.**   next suc
2840: 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b  cessful rollback
2850: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e   is performed on
2860: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
2870: 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20 53 51 4c  . Also,.**   SQL
2880: 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f  ITE_FULL does no
2890: 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71 6c  t affect the sql
28a0: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 61  ite3PagerGet() a
28b0: 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nd sqlite3PagerL
28c0: 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20 41 50 49  ookup().**   API
28d0: 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69 6c  s, they may stil
28e0: 6c 20 62 65 20 75 73 65 64 20 73 75 63 63 65 73  l be used succes
28f0: 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 64 62  sfully..**.** db
2900: 53 69 7a 65 56 61 6c 69 64 2c 20 64 62 53 69 7a  SizeValid, dbSiz
2910: 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 2c 20 64  e, dbOrigSize, d
2920: 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20  bFileSize.**.** 
2930: 20 20 4d 61 6e 61 67 69 6e 67 20 74 68 65 20 73    Managing the s
2940: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
2950: 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65  ase file in page
2960: 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20 63 6f  s is a little co
2970: 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20 20 20  mplicated..**   
2980: 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67  The variable Pag
2990: 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74 61 69  er.dbSize contai
29a0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
29b0: 20 70 61 67 65 73 20 74 68 61 74 20 74 68 65 20   pages that the 
29c0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 69 6d  database.**   im
29d0: 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  age currently co
29e0: 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65 20 64  ntains. As the d
29f0: 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 67 72  atabase image gr
2a00: 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73 20 74  ows or shrinks t
2a10: 68 69 73 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c  his.**   variabl
2a20: 65 20 69 73 20 75 70 64 61 74 65 64 2e 20 54 68  e is updated. Th
2a30: 65 20 76 61 72 69 61 62 6c 65 20 50 61 67 65 72  e variable Pager
2a40: 2e 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74  .dbFileSize cont
2a50: 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 0a  ains the number.
2a60: 2a 2a 20 20 20 6f 66 20 70 61 67 65 73 20 69 6e  **   of pages in
2a70: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a80: 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 62 65 20  le. This may be 
2a90: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 50  different from P
2aa0: 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a 2a 20 20  ager.dbSize.**  
2ab0: 20 69 66 20 73 6f 6d 65 20 70 61 67 65 73 20 68   if some pages h
2ac0: 61 76 65 20 62 65 65 6e 20 61 70 70 65 6e 64 65  ave been appende
2ad0: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
2ae0: 65 20 69 6d 61 67 65 20 62 75 74 20 6e 6f 74 20  e image but not 
2af0: 79 65 74 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20  yet written.**  
2b00: 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20 63 61   out from the ca
2b10: 63 68 65 20 74 6f 20 74 68 65 20 61 63 74 75 61  che to the actua
2b20: 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  l file on disk. 
2b30: 4f 72 20 69 66 20 74 68 65 20 69 6d 61 67 65 20  Or if the image 
2b40: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 74 72  has been.**   tr
2b50: 75 6e 63 61 74 65 64 20 62 79 20 61 6e 20 69 6e  uncated by an in
2b60: 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
2b70: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65 20   operation. The 
2b80: 50 61 67 65 72 2e 64 62 4f 72 69 67 53 69 7a 65  Pager.dbOrigSize
2b90: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20 63   variable.**   c
2ba0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62  ontains the numb
2bb0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
2bc0: 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
2bd0: 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  e when the curre
2be0: 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73 61 63 74  nt.**   transact
2bf0: 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20  ion was opened. 
2c00: 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  The contents of 
2c10: 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74 68 65  all three of the
2c20: 73 65 20 76 61 72 69 61 62 6c 65 73 20 69 73 0a  se variables is.
2c30: 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61 72 61 6e  **   only guaran
2c40: 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72 72 65  teed to be corre
2c50: 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c 65 61  ct if the boolea
2c60: 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 56 61  n Pager.dbSizeVa
2c70: 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  lid is true..**.
2c80: 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e 64 65 72  **   TODO: Under
2c90: 20 77 68 61 74 20 63 6f 6e 64 69 74 69 6f 6e 73   what conditions
2ca0: 20 69 73 20 64 62 53 69 7a 65 56 61 6c 69 64 20   is dbSizeValid 
2cb0: 73 65 74 3f 20 43 6c 65 61 72 65 64 3f 0a 2a 2a  set? Cleared?.**
2cc0: 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  .** changeCountD
2cd0: 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  one.**.**   This
2ce0: 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c   boolean variabl
2cf0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b  e is used to mak
2d00: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
2d10: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a  change-counter .
2d20: 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74 65  **   (the 4-byte
2d30: 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61 74   header field at
2d40: 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34 20   byte offset 24 
2d50: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2d60: 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20 6e  file) is .**   n
2d70: 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65 20  ot updated more 
2d80: 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65 73  often than neces
2d90: 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49  sary. .**.**   I
2da0: 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  t is set to true
2db0: 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65   when the change
2dc0: 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20 69  -counter field i
2dd0: 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63 68  s updated, which
2de0: 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79 20   .**   can only 
2df0: 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78 63  happen if an exc
2e00: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 68  lusive lock is h
2e10: 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
2e20: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 49  ase file..**   I
2e30: 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73 65  t is cleared (se
2e40: 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65 6e  t to false) when
2e50: 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69 76  ever an exclusiv
2e60: 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20 20  e lock is .**   
2e70: 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e 20  relinquished on 
2e80: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e90: 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20 74  e. Each time a t
2ea0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
2eb0: 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54 68  mmitted,.**   Th
2ec0: 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
2ed0: 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65 63  e flag is inspec
2ee0: 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74 72  ted. If it is tr
2ef0: 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66 0a  ue, the work of.
2f00: 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74 68  **   updating th
2f10: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
2f20: 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72 20   is omitted for 
2f30: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
2f40: 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  saction..**.**  
2f50: 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d 20   This mechanism 
2f60: 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e 20  means that when 
2f70: 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
2f80: 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f 6e  sive mode, a con
2f90: 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e 65  nection .**   ne
2fa0: 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20 74  ed only update t
2fb0: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2fc0: 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65 20  r once, for the 
2fd0: 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69 6f  first transactio
2fe0: 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65 64  n.**   committed
2ff0: 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64 69 66 69  ..**.** dbModifi
3000: 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 64  ed.**.**   The d
3010: 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67 20 69  bModified flag i
3020: 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20 61  s set whenever a
3030: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 69   database page i
3040: 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a 20 20 20  s dirtied..**   
3050: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 61 74  It is cleared at
3060: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   the end of each
3070: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
3080: 0a 2a 2a 20 20 20 49 74 20 69 73 20 75 73 65 64  .**   It is used
3090: 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
30a0: 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20 65 6e   or otherwise en
30b0: 64 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ding a transacti
30c0: 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74 68 65 20  on. If.**   the 
30d0: 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67 20  dbModified flag 
30e0: 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 6c 65  is clear then le
30f0: 73 73 20 77 6f 72 6b 20 68 61 73 20 74 6f 20 62  ss work has to b
3100: 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 6a 6f  e done..**.** jo
3110: 75 72 6e 61 6c 53 74 61 72 74 65 64 0a 2a 2a 0a  urnalStarted.**.
3120: 2a 2a 20 20 20 54 68 69 73 20 66 6c 61 67 20 69  **   This flag i
3130: 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20 74  s set whenever t
3140: 68 65 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  he the main jour
3150: 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 20 61 6e  nal is opened an
3160: 64 0a 2a 2a 20 20 20 69 6e 69 74 69 61 6c 69 7a  d.**   initializ
3170: 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 70  ed.**.**   The p
3180: 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c 61  oint of this fla
3190: 67 20 69 73 20 74 68 61 74 20 69 74 20 6d 75 73  g is that it mus
31a0: 74 20 62 65 20 73 65 74 20 61 66 74 65 72 20 74  t be set after t
31b0: 68 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20 6a  he .**   first j
31c0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
31d0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
31e0: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
31f0: 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41 66  to disk..**   Af
3200: 74 65 72 20 74 68 69 73 20 68 61 73 20 68 61 70  ter this has hap
3210: 70 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65 73  pened, new pages
3220: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
3230: 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20   database .**   
3240: 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20  do not need the 
3250: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
3260: 66 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68 65  flag set, as the
3270: 79 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a  y do not need.**
3280: 20 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61     to wait for a
3290: 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62 65   journal sync be
32a0: 66 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62 65  fore they can be
32b0: 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a   written out to.
32c0: 2a 2a 20 20 20 74 68 65 20 64 61 74 61 62 61 73  **   the databas
32d0: 65 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e 63  e file (see func
32e0: 74 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74 65  tion pager_write
32f0: 28 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73 65  ())..**   .** se
3300: 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20  tMaster.**.**   
3310: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
3320: 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
3330: 74 68 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  that the master 
3340: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
3350: 65 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29 20  e.**   (if any) 
3360: 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e 20  is only written 
3370: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
3380: 20 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a   file once..**.*
3390: 2a 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74 74  *   When committ
33a0: 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
33b0: 6e 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  n, the master jo
33c0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
33d0: 28 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d 61  (if any).**   ma
33e0: 79 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  y be written int
33f0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
3400: 6c 65 20 77 68 69 6c 65 20 74 68 65 20 70 61 67  le while the pag
3410: 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a 2a  er is still in.*
3420: 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56  *   PAGER_RESERV
3430: 45 44 20 73 74 61 74 65 20 28 73 65 65 20 43 6f  ED state (see Co
3440: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 66  mmitPhaseOne() f
3450: 6f 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e 20  or the action). 
3460: 49 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74 74  It.**   then att
3470: 65 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64 65  empts to upgrade
3480: 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65   to an exclusive
3490: 20 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20 61   lock. If this a
34a0: 74 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69 6c  ttempt.**   fail
34b0: 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 42  s, then SQLITE_B
34c0: 55 53 59 20 6d 61 79 20 62 65 20 72 65 74 75 72  USY may be retur
34d0: 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20  ned to the user 
34e0: 61 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a 20  and the user.** 
34f0: 20 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f    may attempt to
3500: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
3510: 73 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61  saction again la
3520: 74 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a 20  ter (calling.** 
3530: 20 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65    CommitPhaseOne
3540: 28 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73 20  () again). This 
3550: 66 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f 20  flag is used to 
3560: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
3570: 0a 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f 75  .**   master jou
3580: 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e 6c  rnal name is onl
3590: 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
35a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
35b0: 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69 6d  e first.**   tim
35c0: 65 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  e CommitPhaseOne
35d0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
35e0: 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 2c 20  .** doNotSpill, 
35f0: 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 0a 2a  doNotSyncSpill.*
3600: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 65 6e 61 62  *.**   When enab
3610: 6c 65 64 2c 20 63 61 63 68 65 20 73 70 69 6c 6c  led, cache spill
3620: 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64  s are prohibited
3630: 2e 20 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c  .  The doNotSpil
3640: 6c 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20  l variable.**   
3650: 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63 61 63  inhibits all cac
3660: 68 65 20 73 70 69 6c 6c 20 61 6e 64 20 64 6f 4e  he spill and doN
3670: 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 6e 68 69  otSyncSpill inhi
3680: 62 69 74 73 20 74 68 6f 73 65 20 73 70 69 6c 6c  bits those spill
3690: 73 20 74 68 61 74 0a 2a 2a 20 20 20 77 6f 75 6c  s that.**   woul
36a0: 64 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  d require a jour
36b0: 6e 61 6c 20 73 79 6e 63 2e 20 20 54 68 65 20 64  nal sync.  The d
36c0: 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 73  oNotSyncSpill is
36d0: 20 73 65 74 20 61 6e 64 20 63 6c 65 61 72 65 64   set and cleared
36e0: 20 0a 2a 2a 20 20 20 62 79 20 73 71 6c 69 74 65   .**   by sqlite
36f0: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 6e  3PagerWrite() in
3700: 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65 6e   order to preven
3710: 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  t a journal sync
3720: 20 66 72 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20   from happening 
3730: 0a 2a 2a 20 20 20 69 6e 20 62 65 74 77 65 65 6e  .**   in between
3740: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67   the journalling
3750: 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f 6e   of two pages on
3760: 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72   the same sector
3770: 2e 20 20 54 68 65 0a 2a 2a 20 20 20 64 6f 4e 6f  .  The.**   doNo
3780: 74 53 70 69 6c 6c 20 76 61 6c 75 65 20 73 65 74  tSpill value set
3790: 20 74 6f 20 70 72 65 76 65 6e 74 20 70 61 67 65   to prevent page
37a0: 72 53 74 72 65 73 73 28 29 20 66 72 6f 6d 20 74  rStress() from t
37b0: 72 79 69 6e 67 20 74 6f 20 75 73 65 0a 2a 2a 20  rying to use.** 
37c0: 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 75    the journal du
37d0: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
37e0: 0a 2a 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a  .**.** needSync.
37f0: 2a 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74  **.**   TODO: It
3800: 20 6d 69 67 68 74 20 62 65 20 65 61 73 69 65 72   might be easier
3810: 20 74 6f 20 73 65 74 20 74 68 69 73 20 76 61 72   to set this var
3820: 69 61 62 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f  iable in writeJo
3830: 75 72 6e 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20  urnalHdr().**   
3840: 61 6e 64 20 77 72 69 74 65 4d 61 73 74 65 72 4a  and writeMasterJ
3850: 6f 75 72 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43  ournal() only. C
3860: 68 61 6e 67 65 20 69 74 73 20 6d 65 61 6e 69 6e  hange its meanin
3870: 67 20 74 6f 20 22 75 6e 73 79 6e 63 65 64 20 64  g to "unsynced d
3880: 61 74 61 0a 2a 2a 20 20 20 68 61 73 20 62 65 65  ata.**   has bee
3890: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
38a0: 20 6a 6f 75 72 6e 61 6c 22 2e 0a 2a 2a 0a 2a 2a   journal"..**.**
38b0: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a   subjInMemory.**
38c0: 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20  .**   This is a 
38d0: 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65  boolean variable
38e0: 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20  . If true, then 
38f0: 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62  any required sub
3900: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73  -journal.**   is
3910: 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
3920: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
3930: 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20  file. If false, 
3940: 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  then in-memory.*
3950: 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73  *   sub-journals
3960: 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66   are only used f
3970: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  or in-memory pag
3980: 65 72 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 72  er files..*/.str
3990: 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71  uct Pager {.  sq
39a0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b  lite3_vfs *pVfs;
39b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20            /* OS 
39c0: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65  functions to use
39d0: 20 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20   for IO */.  u8 
39e0: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20  exclusiveMode;  
39f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c           /* Bool
3a00: 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63  ean. True if loc
3a10: 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55  king_mode==EXCLU
3a20: 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75  SIVE */.  u8 jou
3a30: 72 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20  rnalMode;       
3a40: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
3a50: 74 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  the PAGER_JOURNA
3a60: 4c 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a  LMODE_* values *
3a70: 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61  /.  u8 useJourna
3a80: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
3a90: 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63  /* Use a rollbac
3aa0: 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69  k journal on thi
3ab0: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  s file */.  u8 n
3ac0: 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20  oReadlock;      
3ad0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
3ae0: 74 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61  t bother to obta
3af0: 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a  in readlocks */.
3b00: 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20    u8 noSync;    
3b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3b20: 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65   Do not sync the
3b30: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65   journal if true
3b40: 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e   */.  u8 fullSyn
3b50: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3b60: 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79    /* Do extra sy
3b70: 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ncs of the journ
3b80: 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  al for robustnes
3b90: 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66  s */.  u8 sync_f
3ba0: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
3bb0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e     /* One of SYN
3bc0: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
3bd0: 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65  _FULL */.  u8 te
3be0: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
3bf0: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
3c00: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
3c10: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
3c20: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
3c30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3c40: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
3c50: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
3c60: 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20  8 memDb;        
3c70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3c80: 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c  ue to inhibit al
3c90: 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20  l file I/O */.. 
3ca0: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
3cb0: 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73  g block contains
3cc0: 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d   those class mem
3cd0: 62 65 72 73 20 74 68 61 74 20 61 72 65 20 64 79  bers that are dy
3ce0: 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d  namically.  ** m
3cf0: 6f 64 69 66 69 65 64 20 64 75 72 69 6e 67 20 6e  odified during n
3d00: 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73  ormal operations
3d10: 2e 20 54 68 65 20 6f 74 68 65 72 20 76 61 72 69  . The other vari
3d20: 61 62 6c 65 73 20 69 6e 20 74 68 69 73 20 73 74  ables in this st
3d30: 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 72 65  ructure.  ** are
3d40: 20 65 69 74 68 65 72 20 63 6f 6e 73 74 61 6e 74   either constant
3d50: 20 74 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20   throughout the 
3d60: 6c 69 66 65 74 69 6d 65 20 6f 66 20 74 68 65 20  lifetime of the 
3d70: 70 61 67 65 72 2c 20 6f 72 20 65 6c 73 65 0a 20  pager, or else. 
3d80: 20 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72   ** used to stor
3d90: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
3da0: 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20  parameters that 
3db0: 61 66 66 65 63 74 20 74 68 65 20 77 61 79 20 74  affect the way t
3dc0: 68 65 20 70 61 67 65 72 20 0a 20 20 2a 2a 20 6f  he pager .  ** o
3dd0: 70 65 72 61 74 65 73 2e 0a 20 20 2a 2a 0a 20 20  perates..  **.  
3de0: 2a 2a 20 54 68 65 20 27 73 74 61 74 65 27 20 76  ** The 'state' v
3df0: 61 72 69 61 62 6c 65 20 69 73 20 64 65 73 63 72  ariable is descr
3e00: 69 62 65 64 20 69 6e 20 6d 6f 72 65 20 64 65 74  ibed in more det
3e10: 61 69 6c 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ail along with t
3e20: 68 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74  he.  ** descript
3e30: 69 6f 6e 73 20 6f 66 20 74 68 65 20 76 61 6c 75  ions of the valu
3e40: 65 73 20 69 74 20 6d 61 79 20 74 61 6b 65 20 2d  es it may take -
3e50: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 65 74   PAGER_UNLOCK et
3e60: 63 2e 20 4d 61 6e 79 20 6f 66 20 74 68 65 0a 20  c. Many of the. 
3e70: 20 2a 2a 20 6f 74 68 65 72 20 76 61 72 69 61 62   ** other variab
3e80: 6c 65 73 20 69 6e 20 74 68 69 73 20 62 6c 6f 63  les in this bloc
3e90: 6b 20 61 72 65 20 64 65 73 63 72 69 62 65 64 20  k are described 
3ea0: 69 6e 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 64  in the comment d
3eb0: 69 72 65 63 74 6c 79 20 0a 20 20 2a 2a 20 61 62  irectly .  ** ab
3ec0: 6f 76 65 20 74 68 69 73 20 63 6c 61 73 73 20 64  ove this class d
3ed0: 65 66 69 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  efinition..  */.
3ee0: 20 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20    u8 state;     
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3f00: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f   PAGER_UNLOCK, _
3f10: 53 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45  SHARED, _RESERVE
3f20: 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20  D, etc. */.  u8 
3f30: 64 62 4d 6f 64 69 66 69 65 64 3b 20 20 20 20 20  dbModified;     
3f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3f50: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
3f60: 79 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  y changes to the
3f70: 20 44 62 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64   Db */.  u8 need
3f80: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
3f90: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3fa0: 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65  an fsync() is ne
3fb0: 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  eded on the jour
3fc0: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  nal */.  u8 jour
3fd0: 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20  nalStarted;     
3fe0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3ff0: 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61  header of journa
4000: 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20  l is synced */. 
4010: 20 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44   u8 changeCountD
4020: 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  one;         /* 
4030: 53 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d  Set after increm
4040: 65 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67  enting the chang
4050: 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  e-counter */.  u
4060: 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20  8 setMaster;    
4070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
4080: 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65  ue if a m-j name
4090: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
40a0: 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75  n to jrnl */.  u
40b0: 38 20 64 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20  8 doNotSpill;   
40c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
40d0: 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63   not spill the c
40e0: 61 63 68 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65  ache when non-ze
40f0: 72 6f 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74  ro */.  u8 doNot
4100: 53 79 6e 63 53 70 69 6c 6c 3b 20 20 20 20 20 20  SyncSpill;      
4110: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 6f      /* Do not do
4120: 20 61 20 73 70 69 6c 6c 20 74 68 61 74 20 72 65   a spill that re
4130: 71 75 69 72 65 73 20 6a 72 6e 6c 20 73 79 6e 63  quires jrnl sync
4140: 20 2a 2f 0a 20 20 75 38 20 64 62 53 69 7a 65 56   */.  u8 dbSizeV
4150: 61 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  alid;           
4160: 20 20 2f 2a 20 53 65 74 20 77 68 65 6e 20 64 62    /* Set when db
4170: 53 69 7a 65 20 69 73 20 63 6f 72 72 65 63 74 20  Size is correct 
4180: 2a 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65  */.  u8 subjInMe
4190: 6d 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  mory;           
41a0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
41b0: 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f  in-memory sub-jo
41c0: 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f  urnals */.  Pgno
41d0: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
41e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
41f0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
4200: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
4210: 50 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b  Pgno dbOrigSize;
4220: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64              /* d
4230: 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65  bSize before the
4240: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
4250: 74 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  tion */.  Pgno d
4260: 62 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20  bFileSize;      
4270: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4280: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
4290: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
42a0: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
42c0: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
42d0: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
42e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4300: 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e    /* Pages journ
4310: 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74  alled since last
4320: 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65   j-header writte
4330: 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  n */.  u32 cksum
4340: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
4350: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
4360: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
4370: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
4380: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65   */.  u32 nSubRe
4390: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
43a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
43b0: 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74  ecords written t
43c0: 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  o sub-journal */
43d0: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f  .  Bitvec *pInJo
43e0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f  urnal;         /
43f0: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
4400: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
4410: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
4420: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
4430: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
4440: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
4450: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f   for database */
4460: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
4470: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *jfd;          /
4480: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
4490: 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e  r for main journ
44a0: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
44b0: 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20  file *sjfd;     
44c0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
44d0: 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a  riptor for sub-j
44e0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
44f0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
4500: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4510: 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20  nt write offset 
4520: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
4530: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
4540: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
4550: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
4560: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
4570: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
4580: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  /.  i64 journalS
4590: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  izeLimit;       
45a0: 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f  /* Size limit fo
45b0: 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  r persistent jou
45c0: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
45d0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
45e0: 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41  aSavepoint; /* A
45f0: 72 72 61 79 20 6f 66 20 61 63 74 69 76 65 20 73  rray of active s
4600: 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69  avepoints */.  i
4610: 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  nt nSavepoint;  
4620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4630: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
4640: 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d   in aSavepoint[]
4650: 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c   */.  char dbFil
4660: 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20  eVers[16];      
4670: 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65    /* Changes whe
4680: 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66  never database f
4690: 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20  ile changes */. 
46a0: 20 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b   u32 sectorSize;
46b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
46c0: 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  Assumed sector s
46d0: 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ize during rollb
46e0: 61 63 6b 20 2a 2f 0a 0a 20 20 75 31 36 20 6e 45  ack */..  u16 nE
46f0: 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
4700: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
4710: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20  s many bytes to 
4720: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
4730: 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65  age */.  i16 nRe
4740: 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20  serve;          
4750: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4760: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61  f unused bytes a
4770: 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61  t end of each pa
4780: 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46  ge */.  u32 vfsF
4790: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
47a0: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72      /* Flags for
47b0: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
47c0: 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 70 61  en() */.  int pa
47d0: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
47e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
47f0: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61  of bytes in a pa
4800: 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  ge */.  Pgno mxP
4810: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
4820: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
4830: 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74  llowed size of t
4840: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
4850: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
4860: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
4870: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
4880: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63  base file */.  c
4890: 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20  har *zJournal;  
48a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
48b0: 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
48c0: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  l file */.  int 
48d0: 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28  (*xBusyHandler)(
48e0: 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74  void*); /* Funct
48f0: 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e  ion to call when
4900: 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20   busy */.  void 
4910: 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  *pBusyHandlerArg
4920: 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78  ;      /* Contex
4930: 74 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78  t argument for x
4940: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 23  BusyHandler */.#
4950: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
4960: 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d  T.  int nHit, nM
4970: 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  iss;            
4980: 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20 61 6e  /* Cache hits an
4990: 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69  d missing */.  i
49a0: 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65  nt nRead, nWrite
49b0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
49c0: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
49d0: 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e  d/written */.#en
49e0: 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65  dif.  void (*xRe
49f0: 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29  initer)(DbPage*)
4a00: 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72  ; /* Call this r
4a10: 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f  outine when relo
4a20: 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23  ading pages */.#
4a30: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
4a40: 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28  _CODEC.  void *(
4a50: 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
4a60: 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20  oid*,Pgno,int); 
4a70: 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65  /* Routine for e
4a80: 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20  n/decoding data 
4a90: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  */.  void (*xCod
4aa0: 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64  ecSizeChng)(void
4ab0: 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e  *,int,int); /* N
4ac0: 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20 73 69  otify of page si
4ad0: 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  ze changes */.  
4ae0: 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65  void (*xCodecFre
4af0: 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20  e)(void*);      
4b00: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75         /* Destru
4b10: 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64  ctor for the cod
4b20: 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  ec */.  void *pC
4b30: 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  odec;           
4b40: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
4b50: 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e  ument to xCodec.
4b60: 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65  .. methods */.#e
4b70: 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d  ndif.  char *pTm
4b80: 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
4b90: 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65     /* Pager.page
4ba0: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70  Size bytes of sp
4bb0: 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20  ace for tmp use 
4bc0: 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43  */.  PCache *pPC
4bd0: 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20  ache;           
4be0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
4bf0: 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74  age cache object
4c00: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61   */.  sqlite3_ba
4c10: 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20  ckup *pBackup;  
4c20: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
4c30: 6c 69 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20  list of ongoing 
4c40: 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73  backup processes
4c50: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
4c60: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61  TE_OMIT_WAL.  Wa
4c70: 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20  l *pWal;        
4c80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
4c90: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65  te-ahead log use
4ca0: 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  d by "journal_mo
4cb0: 64 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61  de=wal" */.  cha
4cc0: 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20  r *zWal;        
4cd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
4ce0: 20 6e 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d   name for write-
4cf0: 61 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e  ahead log */.#en
4d00: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  dif.};../*.** Th
4d10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
4d20: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c  al variables hol
4d30: 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  d counters used 
4d40: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70  for.** testing p
4d50: 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54  urposes only.  T
4d60: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 64  hese variables d
4d70: 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a  o not exist in.*
4d80: 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20  * a non-testing 
4d90: 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61  build.  These va
4da0: 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20  riables are not 
4db0: 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a  thread-safe..*/.
4dc0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
4dd0: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  ST.int sqlite3_p
4de0: 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
4df0: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
4e00: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
4e10: 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a  s read from DB *
4e20: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
4e30: 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
4e40: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  t = 0;   /* Numb
4e50: 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73  er of full pages
4e60: 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a   written to DB *
4e70: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
4e80: 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
4e90: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
4ea0: 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74  er of pages writ
4eb0: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
4ec0: 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  /.# define PAGER
4ed0: 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65  _INCR(v)  v++.#e
4ee0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47  lse.# define PAG
4ef0: 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69  ER_INCR(v).#endi
4f00: 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e  f..../*.** Journ
4f10: 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77  al files begin w
4f20: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
4f30: 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20  g magic string. 
4f40: 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73   The data.** was
4f50: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f   obtained from /
4f60: 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20  dev/random.  It 
4f70: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20  is used only as 
4f80: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a  a sanity check..
4f90: 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73  **.** Since vers
4fa0: 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a  ion 2.8.0, the j
4fb0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
4fc0: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61  ntains additiona
4fd0: 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63  l sanity.** chec
4fe0: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
4ff0: 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20  .  If the power 
5000: 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20  fails while the 
5010: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
5020: 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d  .** written, sem
5030: 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65  i-random garbage
5040: 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65   data might appe
5050: 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ar in the journa
5060: 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20  l.** file after 
5070: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
5080: 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70  d.  If an attemp
5090: 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a  t is then made.*
50a0: 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f  * to roll the jo
50b0: 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20  urnal back, the 
50c0: 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
50d0: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68  e corrupted.  Th
50e0: 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  e additional.** 
50f0: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
5100: 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d  data is an attem
5110: 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  pt to discover t
5120: 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68  he garbage in th
5130: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  e.** journal and
5140: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a   ignore it..**.*
5150: 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65  * The sanity che
5160: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
5170: 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f  n for the new jo
5180: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
5190: 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32  sists.** of a 32
51a0: 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e  -bit checksum on
51b0: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61   each page of da
51c0: 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75  ta.  The checksu
51d0: 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a  m covers both.**
51e0: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
51f0: 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d   and the pPager-
5200: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
5210: 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  of data for the 
5220: 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b  page..** This ck
5230: 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  sum is initializ
5240: 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72  ed to a 32-bit r
5250: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74  andom value that
5260: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a   appears in the.
5270: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
5280: 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
5290: 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e  header.  The ran
52a0: 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  dom initializer 
52b0: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a  is important,.**
52c0: 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65   because garbage
52d0: 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61   data that appea
52e0: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
52f0: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69   a journal is li
5300: 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61  kely.** data tha
5310: 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74  t was once in ot
5320: 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68  her files that h
5330: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c  ave now been del
5340: 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a  eted.  If the.**
5350: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61   garbage data ca
5360: 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c  me from an obsol
5370: 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
5380: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  , the checksums 
5390: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72  might.** be corr
53a0: 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69  ect.  But by ini
53b0: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68  tializing the ch
53c0: 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d  ecksum to random
53d0: 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20   value which.** 
53e0: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  is different for
53f0: 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20   every journal, 
5400: 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74  we minimize that
5410: 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   risk..*/.static
5420: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
5430: 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  char aJournalMag
5440: 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c  ic[] = {.  0xd9,
5450: 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66   0xd5, 0x05, 0xf
5460: 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30  9, 0x20, 0xa1, 0
5470: 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f  x63, 0xd7,.};../
5480: 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
5490: 20 74 68 65 20 6f 66 20 65 61 63 68 20 70 61 67   the of each pag
54a0: 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  e record in the 
54b0: 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e  journal is given
54c0: 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f   by.** the follo
54d0: 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23  wing macro..*/.#
54e0: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50  define JOURNAL_P
54f0: 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28  G_SZ(pPager)  ((
5500: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
5510: 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ) + 8)../*.** Th
5520: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
5530: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
5540: 61 67 65 72 2e 20 54 68 69 73 20 69 73 20 75 73  ager. This is us
5550: 75 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a  ually the same .
5560: 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e  ** size as a sin
5570: 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  gle disk sector.
5580: 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63   See also setSec
5590: 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64  torSize()..*/.#d
55a0: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44  efine JOURNAL_HD
55b0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50  R_SZ(pPager) (pP
55c0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
55d0: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63  )../*.** The mac
55e0: 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65  ro MEMDB is true
55f0: 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69   if we are deali
5600: 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65  ng with an in-me
5610: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
5620: 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20  * We do this as 
5630: 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20  a macro so that 
5640: 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d  if the SQLITE_OM
5650: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72  IT_MEMORYDB macr
5660: 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65  o is set,.** the
5670: 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20   value of MEMDB 
5680: 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61  will be a consta
5690: 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  nt and the compi
56a0: 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a  ler will optimiz
56b0: 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68  e.** out code th
56c0: 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65  at would never e
56d0: 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65  xecute..*/.#ifde
56e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
56f0: 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20  MORYDB.# define 
5700: 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20  MEMDB 0.#else.# 
5710: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61  define MEMDB pPa
5720: 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69  ger->memDb.#endi
5730: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  f../*.** The max
5740: 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20  imum legal page 
5750: 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20  number is (2^31 
5760: 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  - 1)..*/.#define
5770: 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20   PAGER_MAX_PGNO 
5780: 32 31 34 37 34 38 33 36 34 37 0a 0a 23 69 66 6e  2147483647..#ifn
5790: 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a  def NDEBUG ./*.*
57a0: 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20  * Usage:.**.**  
57b0: 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
57c0: 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
57d0: 65 72 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63  er) );.*/.static
57e0: 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65   int assert_page
57f0: 72 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a 70  r_state(Pager *p
5800: 50 61 67 65 72 29 7b 0a 0a 20 20 2f 2a 20 41 20  Pager){..  /* A 
5810: 74 65 6d 70 2d 66 69 6c 65 20 69 73 20 61 6c 77  temp-file is alw
5820: 61 79 73 20 69 6e 20 50 41 47 45 52 5f 45 58 43  ays in PAGER_EXC
5830: 4c 55 53 49 56 45 20 6f 72 20 50 41 47 45 52 5f  LUSIVE or PAGER_
5840: 53 59 4e 43 45 44 20 73 74 61 74 65 2e 20 2a 2f  SYNCED state. */
5850: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
5860: 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c  r->tempFile==0 |
5870: 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  | pPager->state>
5880: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
5890: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 63 68   );..  /* The ch
58a0: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c  angeCountDone fl
58b0: 61 67 20 69 73 20 61 6c 77 61 79 73 20 73 65 74  ag is always set
58c0: 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 20   for temp-files 
58d0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
58e0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ger->tempFile==0
58f0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e   || pPager->chan
5900: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a  geCountDone );..
5910: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
5920: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
5930: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73  rn true if it is
5940: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
5950: 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e  ite page *pPg in
5960: 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
5970: 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65  al..** A page ne
5980: 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65  eds to be writte
5990: 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  n into the sub-j
59a0: 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20  ournal if there 
59b0: 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72  exists one.** or
59c0: 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70   more open savep
59d0: 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a  oints for which:
59e0: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70  .**.**   * The p
59f0: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65  age-number is le
5a00: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
5a10: 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69   to PagerSavepoi
5a20: 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a  nt.nOrig, and.**
5a30: 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72     * The bit cor
5a40: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
5a50: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
5a60: 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20   not set in.**  
5a70: 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
5a80: 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a  t.pInSavepoint..
5a90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
5aa0: 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50  bjRequiresPage(P
5ab0: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 67  gHdr *pPg){.  Pg
5ac0: 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70  no pgno = pPg->p
5ad0: 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
5ae0: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
5af0: 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  er;.  int i;.  f
5b00: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72  or(i=0; i<pPager
5b10: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b  ->nSavepoint; i+
5b20: 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76  +){.    PagerSav
5b30: 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61  epoint *p = &pPa
5b40: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
5b50: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  i];.    if( p->n
5b60: 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d  Orig>=pgno && 0=
5b70: 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65  =sqlite3BitvecTe
5b80: 73 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  st(p->pInSavepoi
5b90: 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20  nt, pgno) ){.   
5ba0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
5bb0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5bc0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
5bd0: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70  rn true if the p
5be0: 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
5bf0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
5c00: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
5c10: 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  t pageInJournal(
5c20: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72  PgHdr *pPg){.  r
5c30: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74  eturn sqlite3Bit
5c40: 76 65 63 54 65 73 74 28 70 50 67 2d 3e 70 50 61  vecTest(pPg->pPa
5c50: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
5c60: 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a   pPg->pgno);.}..
5c70: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
5c80: 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  bit integer from
5c90: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
5ca0: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f  descriptor.  Sto
5cb0: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  re the integer.*
5cc0: 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69  * that is read i
5cd0: 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e  n *pRes.  Return
5ce0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
5cf0: 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c  erything worked,
5d00: 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20   or an.** error 
5d10: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
5d20: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  g goes wrong..**
5d30: 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61  .** All values a
5d40: 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73  re stored on dis
5d50: 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e  k as big-endian.
5d60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
5d70: 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65  ead32bits(sqlite
5d80: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
5d90: 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65  offset, u32 *pRe
5da0: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
5db0: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74  har ac[4];.  int
5dc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
5dd0: 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65  ead(fd, ac, size
5de0: 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b  of(ac), offset);
5df0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
5e00: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65  E_OK ){.    *pRe
5e10: 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  s = sqlite3Get4b
5e20: 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72  yte(ac);.  }.  r
5e30: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
5e40: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
5e50: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61  t integer into a
5e60: 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69   string buffer i
5e70: 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74  n big-endian byt
5e80: 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66  e order..*/.#def
5e90: 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c  ine put32bits(A,
5ea0: 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62  B)  sqlite3Put4b
5eb0: 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f  yte((u8*)A,B)../
5ec0: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
5ed0: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
5ee0: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
5ef0: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74  descriptor.  Ret
5f00: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
5f10: 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
5f20: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
5f30: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
5f40: 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
5f50: 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28  int write32bits(
5f60: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
5f70: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33  , i64 offset, u3
5f80: 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61  2 val){.  char a
5f90: 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74  c[4];.  put32bit
5fa0: 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65  s(ac, val);.  re
5fb0: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72  turn sqlite3OsWr
5fc0: 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f  ite(fd, ac, 4, o
5fd0: 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ffset);.}../*.**
5fe0: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   The argument to
5ff0: 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61   this macro is a
6000: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
6010: 20 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66   (type sqlite3_f
6020: 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e  ile*)..** Return
6030: 20 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20   0 if it is not 
6040: 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72  open, or non-zer
6050: 6f 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66  o (but not 1) if
6060: 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   it is..**.** Th
6070: 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 65 78  is is so that ex
6080: 70 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65  pressions can be
6090: 20 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a   written as:.**.
60a0: 2a 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28  **   if( isOpen(
60b0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20  pPager->jfd) ){ 
60c0: 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61  ....**.** instea
60d0: 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28  d of.**.**   if(
60e0: 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d   pPager->jfd->pM
60f0: 65 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f  ethods ){ ....*/
6100: 0a 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28  .#define isOpen(
6110: 70 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65  pFd) ((pFd)->pMe
6120: 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 49 66  thods)../*.** If
6130: 20 66 69 6c 65 20 70 46 64 20 69 73 20 6f 70 65   file pFd is ope
6140: 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f  n, call sqlite3O
6150: 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e  sUnlock() on it.
6160: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
6170: 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  sUnlock(sqlite3_
6180: 66 69 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20 65  file *pFd, int e
6190: 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20 21 69 73  Lock){.  if( !is
61a0: 4f 70 65 6e 28 70 46 64 29 20 29 7b 0a 20 20 20  Open(pFd) ){.   
61b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
61c0: 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
61d0: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
61e0: 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a  pFd, eLock);.}..
61f0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
6200: 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ion determines w
6210: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
6220: 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
6230: 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63  ptimization.** c
6240: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
6250: 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65 20  this pager. The 
6260: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
6270: 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a   be used if:.**.
6280: 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c 75  **  (a) the valu
6290: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
62a0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
62b0: 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74 65  stics() indicate
62c0: 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61  s that.**      a
62d0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d   database page m
62e0: 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  ay be written at
62f0: 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a  omically, and.**
6300: 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65 20    (b) the value 
6310: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65  returned by OsSe
6320: 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65  ctorSize() is le
6330: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
6340: 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
6350: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  page size..**.**
6360: 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   The optimizatio
6370: 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73  n is also always
6380: 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d   enabled for tem
6390: 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74  porary files. It
63a0: 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20   is.** an error 
63b0: 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  to call this fun
63c0: 63 74 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20  ction if pPager 
63d0: 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20  is opened on an 
63e0: 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74  in-memory.** dat
63f0: 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
6400: 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
6410: 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c   cannot be used,
6420: 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   0 is returned. 
6430: 49 66 20 69 74 20 63 61 6e 20 62 65 20 75 73 65  If it can be use
6440: 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76  d,.** then the v
6450: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
6460: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
6470: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
6480: 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e  en it.** contain
6490: 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20  s rollback data 
64a0: 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  for exactly one 
64b0: 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  page..*/.#ifdef 
64c0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
64d0: 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69  OMIC_WRITE.stati
64e0: 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72  c int jrnlBuffer
64f0: 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
6500: 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21  er){.  assert( !
6510: 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21  MEMDB );.  if( !
6520: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
6530: 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20   ){.    int dc; 
6540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76            /* Dev
6560: 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
6570: 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ics */.    int n
6580: 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20  Sector;         
6590: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
65a0: 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20  Sector size */. 
65b0: 20 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20     int szPage;  
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65d0: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a       /* Page siz
65e0: 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  e */..    assert
65f0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
6600: 3e 66 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d  >fd) );.    dc =
6610: 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
6620: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
6630: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
6640: 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65   nSector = pPage
6650: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20  r->sectorSize;. 
6660: 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67     szPage = pPag
6670: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20  er->pageSize;.. 
6680: 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
6690: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
66a0: 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
66b0: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
66c0: 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
66d0: 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
66e0: 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c   if( 0==(dc&(SQL
66f0: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
6700: 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c  |(szPage>>8)) ||
6710: 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29   nSector>szPage)
6720: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
6730: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
6740: 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f   return JOURNAL_
6750: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
6760: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
6770: 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66  Pager);.}.#endif
6780: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ../*.** If SQLIT
6790: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73  E_CHECK_PAGES is
67a0: 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65   defined then we
67b0: 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20   do some sanity 
67c0: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74  checking.** on t
67d0: 68 65 20 63 61 63 68 65 20 75 73 69 6e 67 20 61  he cache using a
67e0: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20   hash function. 
67f0: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
6800: 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64  r testing.** and
6810: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
6820: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
6830: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a  E_CHECK_PAGES./*
6840: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d  .** Return a 32-
6850: 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20  bit hash of the 
6860: 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50  page data for pP
6870: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  age..*/.static u
6880: 33 32 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  32 pager_datahas
6890: 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73  h(int nByte, uns
68a0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74  igned char *pDat
68b0: 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d  a){.  u32 hash =
68c0: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   0;.  int i;.  f
68d0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b  or(i=0; i<nByte;
68e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20   i++){.    hash 
68f0: 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20  = (hash*1039) + 
6900: 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20  pData[i];.  }.  
6910: 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73  return hash;.}.s
6920: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
6930: 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a  pagehash(PgHdr *
6940: 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e  pPage){.  return
6950: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
6960: 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70  pPage->pPager->p
6970: 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e  ageSize, (unsign
6980: 65 64 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d  ed char *)pPage-
6990: 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69  >pData);.}.stati
69a0: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74  c void pager_set
69b0: 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20  _pagehash(PgHdr 
69c0: 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65  *pPage){.  pPage
69d0: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
69e0: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 61 67  er_pagehash(pPag
69f0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  e);.}../*.** The
6a00: 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72   CHECK_PAGE macr
6a10: 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a  o takes a PgHdr*
6a20: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
6a30: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
6a40: 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66  _PAGES.** is def
6a50: 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47  ined, and NDEBUG
6a60: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c   is not defined,
6a70: 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   an assert() sta
6a80: 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a  tement checks.**
6a90: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
6aa0: 73 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f  s either dirty o
6ab0: 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20  r still matches 
6ac0: 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70  the calculated p
6ad0: 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65  age-hash..*/.#de
6ae0: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
6af0: 78 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a  x) checkPage(x).
6b00: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
6b10: 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  kPage(PgHdr *pPg
6b20: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
6b30: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
6b40: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67  ;.  assert( !pPg
6b50: 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50  ->pageHash || pP
6b60: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 0a 20 20  ager->errCode.  
6b70: 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61      || (pPg->fla
6b80: 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20  gs&PGHDR_DIRTY) 
6b90: 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68  || pPg->pageHash
6ba0: 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  ==pager_pagehash
6bb0: 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73  (pPg) );.}..#els
6bc0: 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  e.#define pager_
6bd0: 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20 30  datahash(X,Y)  0
6be0: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70  .#define pager_p
6bf0: 61 67 65 68 61 73 68 28 58 29 20 20 30 0a 23 64  agehash(X)  0.#d
6c00: 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45  efine CHECK_PAGE
6c10: 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53  (x).#endif  /* S
6c20: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
6c30: 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  S */../*.** When
6c40: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
6c50: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6c60: 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
6c70: 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a  r must be open..
6c80: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
6c90: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61   attempts to rea
6ca0: 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  d a master journ
6cb0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f  al file name fro
6cc0: 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66  m the .** end of
6cd0: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69   the file and, i
6ce0: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f  f successful, co
6cf0: 70 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d  pies it into mem
6d00: 6f 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a  ory supplied .**
6d10: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
6d20: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
6d30: 76 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  ve writeMasterJo
6d40: 75 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20  urnal() for the 
6d50: 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74  format.** used t
6d60: 6f 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72  o store a master
6d70: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
6d80: 6d 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  me at the end of
6d90: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
6da0: 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d  .**.** zMaster m
6db0: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
6dc0: 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
6dd0: 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20  t nMaster bytes 
6de0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
6df0: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73  the caller. This
6e00: 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74   should be sqlit
6e10: 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
6e20: 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74  e+1 (to ensure t
6e30: 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67  here is.** enoug
6e40: 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65  h space to write
6e50: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
6e60: 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68  nal name). If th
6e70: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6e80: 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  .** name in the 
6e90: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65  journal is longe
6ea0: 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62  r than nMaster b
6eb0: 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  ytes (including 
6ec0: 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  a.** nul-termina
6ed0: 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20  tor), then this 
6ee0: 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66  is handled as if
6ef0: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
6f00: 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20  al name.** were 
6f10: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a  present in the j
6f20: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
6f30: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
6f40: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
6f50: 72 65 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e  resent at the en
6f60: 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d of the journal
6f70: 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  .** file, then i
6f80: 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f  t is copied into
6f90: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
6fa0: 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
6fb0: 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  r. A.** nul-term
6fc0: 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20 61  inator byte is a
6fd0: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62  ppended to the b
6fe0: 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  uffer following 
6ff0: 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
7000: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e  urnal file name.
7010: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  .**.** If it is 
7020: 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
7030: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
7040: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
7050: 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74  resent .** zMast
7060: 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20  er[0] is set to 
7070: 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  0 and SQLITE_OK 
7080: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
7090: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
70a0: 72 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  rs while reading
70b0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
70c0: 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74  l file, an SQLit
70d0: 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  e.** error code 
70e0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
70f0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d  static int readM
7100: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c  asterJournal(sql
7110: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c  ite3_file *pJrnl
7120: 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  , char *zMaster,
7130: 20 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20   u32 nMaster){. 
7140: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
7150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
7160: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
7170: 75 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20  u32 len;        
7180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
7190: 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66  ngth in bytes of
71a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
71b0: 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a  name */.  i64 sz
71c0: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
71d0: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
71e0: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a  ze in bytes of j
71f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e  ournal file pJrn
7200: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
7210: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7220: 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d    /* MJ checksum
7230: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
7240: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
7250: 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  2 u;            
7260: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
7270: 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
7280: 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
7290: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
72a0: 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f    /* A buffer to
72b0: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
72c0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73  header */.  zMas
72d0: 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a  ter[0] = '\0';..
72e0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
72f0: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
7300: 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20  FileSize(pJrnl, 
7310: 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a  &szJ)).   || szJ
7320: 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  <16.   || SQLITE
7330: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
7340: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
7350: 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c  -16, &len)).   |
7360: 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a  | len>=nMaster .
7370: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
7380: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
7390: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c  s(pJrnl, szJ-12,
73a0: 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20   &cksum)).   || 
73b0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
73c0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
73d0: 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c  Jrnl, aMagic, 8,
73e0: 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d   szJ-8)).   || m
73f0: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
7400: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a  ournalMagic, 8).
7410: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
7420: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
7430: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73  Read(pJrnl, zMas
7440: 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36  ter, len, szJ-16
7450: 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20  -len)).  ){.    
7460: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
7470: 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20    /* See if the 
7480: 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73  checksum matches
7490: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
74a0: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f  nal name */.  fo
74b0: 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b  r(u=0; u<len; u+
74c0: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d  +){.    cksum -=
74d0: 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d   zMaster[u];.  }
74e0: 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a  .  if( cksum ){.
74f0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68      /* If the ch
7500: 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61  ecksum doesn't a
7510: 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20  dd up, then one 
7520: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64  or more of the d
7530: 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20  isk sectors.    
7540: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
7550: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7560: 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72   filename is cor
7570: 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61  rupted. This mea
7580: 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69  ns.    ** defini
7590: 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20  tely roll back, 
75a0: 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53  so just return S
75b0: 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70  QLITE_OK and rep
75c0: 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20  ort a (nul).    
75d0: 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
75e0: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20  l filename..    
75f0: 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a  */.    len = 0;.
7600: 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65    }.  zMaster[le
7610: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20  n] = '\0';.   . 
7620: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7630: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
7640: 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66  rn the offset of
7650: 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e   the sector boun
7660: 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64  dary at or immed
7670: 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f  iately .** follo
7680: 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69  wing the value i
7690: 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  n pPager->journa
76a0: 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61  lOff, assuming a
76b0: 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65   sector .** size
76c0: 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74   of pPager->sect
76d0: 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a  orSize bytes..**
76e0: 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65  .** i.e for a se
76f0: 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32  ctor size of 512
7700: 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e  :.**.**   Pager.
7710: 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20  journalOff      
7720: 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65      Return value
7730: 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
7740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
7760: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a               0.*
7780: 2a 20 20 20 35 31 32 20 20 20 20 20 20 20 20 20  *   512         
7790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
77a0: 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20  2.**   100      
77b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77c0: 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20   512.**   2000  
77d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77e0: 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a      2048.** .*/.
77f0: 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e  static i64 journ
7800: 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61 67 65  alHdrOffset(Page
7810: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
7820: 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  4 offset = 0;.  
7830: 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e  i64 c = pPager->
7840: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66  journalOff;.  if
7850: 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65  ( c ){.    offse
7860: 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e  t = ((c-1)/JOURN
7870: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
7880: 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c  ) + 1) * JOURNAL
7890: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
78a0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
78b0: 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44  ffset%JOURNAL_HD
78c0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20  R_SZ(pPager)==0 
78d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
78e0: 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65  set>=c );.  asse
78f0: 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a  rt( (offset-c)<J
7900: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
7910: 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72  ager) );.  retur
7920: 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a  n offset;.}../*.
7930: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
7940: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
7950: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
7960: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
7970: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
7980: 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  on is a no-op if
7990: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
79a0: 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77  e has not been w
79b0: 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74  ritten to.** wit
79c0: 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hin the current 
79d0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65  transaction (i.e
79e0: 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e  . if Pager.journ
79f0: 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a  alOff==0)..**.**
7a00: 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69   If doTruncate i
7a10: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68  s non-zero or th
7a20: 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  e Pager.journalS
7a30: 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c  izeLimit variabl
7a40: 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  e is.** set to 0
7a50: 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20  , then truncate 
7a60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
7a70: 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
7a80: 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73  n size. Otherwis
7a90: 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32  e,.** zero the 2
7aa0: 38 2d 62 79 74 65 20 68 65 61 64 65 72 20 61 74  8-byte header at
7ab0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
7ac0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
7ad0: 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20  In either case, 
7ae0: 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72  .** if the pager
7af0: 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79   is not in no-sy
7b00: 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  nc mode, sync th
7b10: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
7b20: 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61  mmediately .** a
7b30: 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20  fter writing or 
7b40: 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a  truncating it..*
7b50: 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f  *.** If Pager.jo
7b60: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69  urnalSizeLimit i
7b70: 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74  s set to a posit
7b80: 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  ive, non-zero va
7b90: 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c  lue, and.** foll
7ba0: 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61  owing the trunca
7bb0: 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20  tion or zeroing 
7bc0: 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20  described above 
7bd0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
7be0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
7bf0: 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72   in bytes is lar
7c00: 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61  ger than this va
7c10: 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61  lue, then trunca
7c20: 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  te the.** journa
7c30: 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e  l file to Pager.
7c40: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
7c50: 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72   bytes. The jour
7c60: 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a  nal file does.**
7c70: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
7c80: 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67  synced following
7c90: 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e   this operation.
7ca0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
7cb0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62  error occurs, ab
7cc0: 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67  andon processing
7cd0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
7ce0: 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  IO error code..*
7cf0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  * Otherwise, ret
7d00: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
7d10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72  /.static int zer
7d20: 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  oJournalHdr(Page
7d30: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64  r *pPager, int d
7d40: 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e  oTruncate){.  in
7d50: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
7d60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d80: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
7d90: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
7da0: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
7db0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
7dc0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20  >journalOff ){. 
7dd0: 20 20 20 63 6f 6e 73 74 20 69 36 34 20 69 4c 69     const i64 iLi
7de0: 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  mit = pPager->jo
7df0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
7e00: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
7e10: 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20  e of jsl */..   
7e20: 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f   IOTRACE(("JZERO
7e30: 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  HDR %p\n", pPage
7e40: 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72  r)).    if( doTr
7e50: 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74  uncate || iLimit
7e60: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
7e70: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
7e80: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
7e90: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
7ea0: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
7eb0: 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b  st char zeroHdr[
7ec0: 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20  28] = {0};.     
7ed0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
7ee0: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
7ef0: 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f  , zeroHdr, sizeo
7f00: 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a  f(zeroHdr), 0);.
7f10: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
7f20: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
7f30: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
7f40: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
7f50: 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
7f60: 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53  r->jfd, SQLITE_S
7f70: 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61  YNC_DATAONLY|pPa
7f80: 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
7f90: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
7fa0: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
7fb0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
7fc0: 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20 74   committed but t
7fd0: 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20  he write lock . 
7fe0: 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68     ** is still h
7ff0: 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e  eld on the file.
8000: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 73   If there is a s
8010: 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67  ize limit config
8020: 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ured for .    **
8030: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
8040: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20  journal and the 
8050: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72  journal file cur
8060: 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20  rently consumes 
8070: 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61 63  more.    ** spac
8080: 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d 69  e than that limi
8090: 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72  t allows for, tr
80a0: 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54  uncate it now. T
80b0: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a  here is no need.
80c0: 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74      ** to sync t
80d0: 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e  he file followin
80e0: 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  g this operation
80f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
8100: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
8110: 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20  & iLimit>0 ){.  
8120: 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20 20      i64 sz;.    
8130: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8140: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
8150: 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20  >jfd, &sz);.    
8160: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
8170: 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74  _OK && sz>iLimit
8180: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
8190: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
81a0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
81b0: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d  iLimit);.      }
81c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
81d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
81e0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
81f0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
8200: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
8210: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
8220: 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20  urnal.** header 
8230: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
8240: 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74 65  bytes) is writte
8250: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
8260: 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a  al file at the.*
8270: 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  * current locati
8280: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  on..**.** The fo
8290: 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75  rmat for the jou
82a0: 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 61  rnal header is a
82b0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20  s follows:.** - 
82c0: 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69  8 bytes: Magic i
82d0: 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e  dentifying journ
82e0: 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20  al format..** - 
82f0: 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20  4 bytes: Number 
8300: 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f  of records in jo
8310: 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d  urnal, or -1 no-
8320: 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e  sync mode is on.
8330: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52  .** - 4 bytes: R
8340: 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65  andom number use
8350: 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e  d for page hash.
8360: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49  .** - 4 bytes: I
8370: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
8380: 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d  page count..** -
8390: 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72   4 bytes: Sector
83a0: 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68   size used by th
83b0: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77  e process that w
83c0: 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61  rote this journa
83d0: 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  l..** - 4 bytes:
83e0: 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20 73   Database page s
83f0: 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c  ize..** .** Foll
8400: 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c  owed by (JOURNAL
8410: 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79  _HDR_SZ - 28) by
8420: 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70  tes of unused sp
8430: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
8440: 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  nt writeJournalH
8450: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
8460: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
8470: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
8480: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
8490: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61  rn code */.  cha
84a0: 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50 61  r *zHeader = pPa
84b0: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20  ger->pTmpSpace; 
84c0: 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 70   /* Temporary sp
84d0: 61 63 65 20 75 73 65 64 20 74 6f 20 62 75 69 6c  ace used to buil
84e0: 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  d header */.  u3
84f0: 32 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67  2 nHeader = pPag
8500: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20  er->pageSize;   
8510: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
8520: 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
8530: 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20 75  y zHeader */.  u
8540: 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20  32 nWrite;      
8550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8560: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 68     /* Bytes of h
8570: 65 61 64 65 72 20 73 65 63 74 6f 72 20 77 72 69  eader sector wri
8580: 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69  tten */.  int ii
8590: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
85a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
85b0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
85c0: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ..  assert( isOp
85d0: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
85e0: 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e  );      /* Journ
85f0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
8600: 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20  open. */..  if( 
8610: 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f  nHeader>JOURNAL_
8620: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
8630: 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d 20  {.    nHeader = 
8640: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
8650: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Pager);.  }..  /
8660: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
8670: 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
8680: 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 6d   and any of them
8690: 20 77 65 72 65 20 63 72 65 61 74 65 64 20 0a 20   were created . 
86a0: 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 6d 6f   ** since the mo
86b0: 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61  st recent journa
86c0: 6c 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69  l header was wri
86d0: 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68 65  tten, update the
86e0: 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65   .  ** PagerSave
86f0: 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
8700: 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a   fields now..  *
8710: 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
8720: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
8730: 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
8740: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53 61 76  if( pPager->aSav
8750: 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f  epoint[ii].iHdrO
8760: 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ffset==0 ){.    
8770: 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70    pPager->aSavep
8780: 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66  oint[ii].iHdrOff
8790: 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  set = pPager->jo
87a0: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a  urnalOff;.    }.
87b0: 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
87c0: 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67  ournalHdr = pPag
87d0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
87e0: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
87f0: 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a  t(pPager);..  /*
8800: 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65   .  ** Write the
8810: 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68   nRec Field - th
8820: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
8830: 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f   records that fo
8840: 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a  llow this.  ** j
8850: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e  ournal header. N
8860: 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73  ormally, zero is
8870: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73   written to this
8880: 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20 74   value at this t
8890: 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20  ime..  ** After 
88a0: 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65 20  the records are 
88b0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75  added to the jou
88c0: 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f  rnal (and the jo
88d0: 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20  urnal synced, . 
88e0: 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73   ** if in full-s
88f0: 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a  ync mode), the z
8900: 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74 74  ero is overwritt
8910: 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75 65  en with the true
8920: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20   number.  ** of 
8930: 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79 6e  records (see syn
8940: 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a  cJournal())..  *
8950: 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72 20  *.  ** A faster 
8960: 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20 74  alternative is t
8970: 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46 46  o write 0xFFFFFF
8980: 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20 66  FF to the nRec f
8990: 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20  ield. When.  ** 
89a0: 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72  reading the jour
89b0: 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20 74  nal this value t
89c0: 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20 61  ells SQLite to a
89d0: 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a 20  ssume that the. 
89e0: 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20   ** rest of the 
89f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
8a00: 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67 65  tains valid page
8a10: 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20 61   records. This a
8a20: 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69  ssumption.  ** i
8a30: 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73 20  s dangerous, as 
8a40: 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
8a50: 75 72 72 65 64 20 77 68 69 6c 73 74 20 77 72 69  urred whilst wri
8a60: 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72  ting to the jour
8a70: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74  nal.  ** file it
8a80: 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d   may contain som
8a90: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 2e 20  e garbage data. 
8aa0: 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73 63  There are two sc
8ab0: 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65  enarios.  ** whe
8ac0: 72 65 20 74 68 69 73 20 72 69 73 6b 20 63 61 6e  re this risk can
8ad0: 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a   be ignored:.  *
8ae0: 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20  *.  **   * When 
8af0: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
8b00: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f  no-sync mode. Co
8b10: 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c  rruption can fol
8b20: 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20 70  low a.  **     p
8b30: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e 20  ower failure in 
8b40: 74 68 69 73 20 63 61 73 65 20 61 6e 79 77 61 79  this case anyway
8b50: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  ..  **.  **   * 
8b60: 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  When the SQLITE_
8b70: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
8b80: 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54  D flag is set. T
8b90: 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a 20  his guarantees. 
8ba0: 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61 72   **     that gar
8bb0: 62 61 67 65 20 64 61 74 61 20 69 73 20 6e 65 76  bage data is nev
8bc0: 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  er appended to t
8bd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
8be0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
8bf0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
8c00: 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f  d) || pPager->no
8c10: 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20 28 70  Sync );.  if( (p
8c20: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 7c  Pager->noSync) |
8c30: 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | (pPager->journ
8c40: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
8c50: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
8c60: 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33  ).   || (sqlite3
8c70: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
8c80: 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
8c90: 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  fd)&SQLITE_IOCAP
8ca0: 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20  _SAFE_APPEND) . 
8cb0: 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a   ){.    memcpy(z
8cc0: 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c  Header, aJournal
8cd0: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
8ce0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
8cf0: 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48     put32bits(&zH
8d00: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
8d10: 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78  urnalMagic)], 0x
8d20: 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c  ffffffff);.  }el
8d30: 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a  se{.    memset(z
8d40: 48 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f  Header, 0, sizeo
8d50: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
8d60: 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  +4);.  }..  /* T
8d70: 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d  he random check-
8d80: 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72  hash initialiser
8d90: 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72   */ .  sqlite3_r
8da0: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
8db0: 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
8dc0: 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  it), &pPager->ck
8dd0: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33  sumInit);.  put3
8de0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
8df0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
8e00: 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d  gic)+4], pPager-
8e10: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f  >cksumInit);.  /
8e20: 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61  * The initial da
8e30: 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20  tabase size */. 
8e40: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
8e50: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
8e60: 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50  nalMagic)+8], pP
8e70: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
8e80: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75  );.  /* The assu
8e90: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
8ea0: 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
8eb0: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
8ec0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
8ed0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
8ee0: 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74  2], pPager->sect
8ef0: 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54  orSize);..  /* T
8f00: 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  he page size */.
8f10: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
8f20: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
8f30: 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20  rnalMagic)+16], 
8f40: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
8f50: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  );..  /* Initial
8f60: 69 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f  izing the tail o
8f70: 66 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20  f the buffer is 
8f80: 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20  not necessary.  
8f90: 45 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20  Everything.  ** 
8fa0: 77 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68  works find if th
8fb0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73  e following mems
8fc0: 65 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e  et() is omitted.
8fd0: 20 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69    But initializi
8fe0: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f  ng.  ** the memo
8ff0: 72 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67  ry prevents valg
9000: 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61  rind from compla
9010: 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65  ining, so we are
9020: 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a   willing to.  **
9030: 20 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72   take the perfor
9040: 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a  mance hit..  */.
9050: 20 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65    memset(&zHeade
9060: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
9070: 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a  lMagic)+20], 0,.
9080: 20 20 20 20 20 20 20 20 20 6e 48 65 61 64 65 72           nHeader
9090: 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  -(sizeof(aJourna
90a0: 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20  lMagic)+20));.. 
90b0: 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69   /* In theory, i
90c0: 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73  t is only necess
90d0: 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65  ary to write the
90e0: 20 32 38 20 62 79 74 65 73 20 74 68 61 74 20 74   28 bytes that t
90f0: 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  he .  ** journal
9100: 20 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73   header consumes
9110: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
9120: 66 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20  file here. Then 
9130: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20  increment the . 
9140: 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   ** Pager.journa
9150: 6c 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62 79  lOff variable by
9160: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20   JOURNAL_HDR_SZ 
9170: 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  so that the next
9180: 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73   .  ** record is
9190: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
91a0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72  following sector
91b0: 20 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20   (leaving a gap 
91c0: 69 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a  in the file.  **
91d0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d   that will be im
91e0: 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20  plicitly filled 
91f0: 69 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20  in by the OS).. 
9200: 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72   **.  ** However
9210: 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 69 73   it has been dis
9220: 63 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20  covered that on 
9230: 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69  some systems thi
9240: 73 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20  s pattern can . 
9250: 20 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61   ** be significa
9260: 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e  ntly slower than
9270: 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72   contiguously wr
9280: 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68  iting data to th
9290: 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65  e file,.  ** eve
92a0: 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20  n if that means 
92b0: 65 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69  explicitly writi
92c0: 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 62  ng data to the b
92d0: 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a  lock of .  ** (J
92e0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
92f0: 32 38 29 20 62 79 74 65 73 20 74 68 61 74 20 77  28) bytes that w
9300: 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e  ill not be used.
9310: 20 53 6f 20 74 68 61 74 20 69 73 20 77 68 61 74   So that is what
9320: 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a  .  ** is done. .
9330: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f    **.  ** The lo
9340: 6f 70 20 69 73 20 72 65 71 75 69 72 65 64 20 68  op is required h
9350: 65 72 65 20 69 6e 20 63 61 73 65 20 74 68 65 20  ere in case the 
9360: 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c  sector-size is l
9370: 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a  arger than the .
9380: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61    ** database pa
9390: 67 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74  ge size. Since t
93a0: 68 65 20 7a 48 65 61 64 65 72 20 62 75 66 66 65  he zHeader buffe
93b0: 72 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e  r is only Pager.
93c0: 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79  pageSize.  ** by
93d0: 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72  tes in size, mor
93e0: 65 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20  e than one call 
93f0: 74 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  to sqlite3OsWrit
9400: 65 28 29 20 6d 61 79 20 62 65 20 72 65 71 75 69  e() may be requi
9410: 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75  red.  ** to popu
9420: 6c 61 74 65 20 74 68 65 20 65 6e 74 69 72 65 20  late the entire 
9430: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
9440: 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66  ector..  */ .  f
9450: 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d  or(nWrite=0; rc=
9460: 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69  =SQLITE_OK&&nWri
9470: 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  te<JOURNAL_HDR_S
9480: 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74  Z(pPager); nWrit
9490: 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20  e+=nHeader){.   
94a0: 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
94b0: 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %p %lld %d\n", p
94c0: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
94d0: 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64  ournalHdr, nHead
94e0: 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71  er)).    rc = sq
94f0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
9500: 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65  ger->jfd, zHeade
9510: 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67  r, nHeader, pPag
9520: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
9530: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
9540: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
9550: 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
9560: 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61  alOff );.    pPa
9570: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
9580: 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a  += nHeader;.  }.
9590: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
95a0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
95b0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
95c0: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69  open when this i
95d0: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
95e0: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a  nal header file.
95f0: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
9600: 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61  SZ bytes) is rea
9610: 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65  d from the curre
9620: 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74  nt location in t
9630: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
9640: 6c 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20  le. The current 
9650: 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  location in the 
9660: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
9670: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67  given by.** pPag
9680: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20  er->journalOff. 
9690: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
96a0: 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  ve function writ
96b0: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f  eJournalHdr() fo
96c0: 72 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69  r.** a descripti
96d0: 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  on of the journa
96e0: 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e  l header format.
96f0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65  .**.** If the he
9700: 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63  ader is read suc
9710: 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65  cessfully, *pNRe
9720: 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  c is set to the 
9730: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67  number of.** pag
9740: 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77  e records follow
9750: 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20  ing this header 
9760: 61 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20  and *pDbSize is 
9770: 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20  set to the size 
9780: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
9790: 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  se before the tr
97a0: 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c  ansaction began,
97b0: 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c   in pages. Also,
97c0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
97d0: 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  it.** is set to 
97e0: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
97f0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
9800: 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f  header. SQLITE_O
9810: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
9820: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
9830: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
9840: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20  nal header file 
9850: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f  appears to be co
9860: 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
9870: 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72  DONE is.** retur
9880: 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61  ned and *pNRec a
9890: 6e 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20  nd *PDbSize are 
98a0: 75 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a  undefined.  If J
98b0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
98c0: 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  tes.** cannot be
98d0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
98e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65  ournal file an e
98f0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
9900: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
9910: 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c   int readJournal
9920: 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  Hdr(.  Pager *pP
9930: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
9940: 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
9950: 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48  ect */.  int isH
9960: 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61  ot,.  i64 journa
9970: 6c 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  lSize,          
9980: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
9990: 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66  e open journal f
99a0: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
99b0: 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20    u32 *pNRec,   
99c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
99d0: 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61  * OUT: Value rea
99e0: 64 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20  d from the nRec 
99f0: 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a  field */.  u32 *
9a00: 70 44 62 53 69 7a 65 20 20 20 20 20 20 20 20 20  pDbSize         
9a10: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
9a20: 56 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61  Value of origina
9a30: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
9a40: 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  field */.){.  in
9a50: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
9a60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
9a70: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
9a80: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
9a90: 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41  gic[8];     /* A
9aa0: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
9ab0: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
9ac0: 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
9ad0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
9ae0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
9af0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62  journal header b
9b00: 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20  eing read */..  
9b10: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
9b20: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20  Pager->jfd) );  
9b30: 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66      /* Journal f
9b40: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
9b50: 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e  . */..  /* Advan
9b60: 63 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ce Pager.journal
9b70: 4f 66 66 20 74 6f 20 74 68 65 20 73 74 61 72 74  Off to the start
9b80: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65 63   of the next sec
9b90: 74 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a  tor. If the.  **
9ba0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
9bb0: 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74   too small for t
9bc0: 68 65 72 65 20 74 6f 20 62 65 20 61 20 68 65 61  here to be a hea
9bd0: 64 65 72 20 73 74 6f 72 65 64 20 61 74 20 74 68  der stored at th
9be0: 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72  is.  ** point, r
9bf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
9c00: 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  E..  */.  pPager
9c10: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
9c20: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
9c30: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
9c40: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
9c50: 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f+JOURNAL_HDR_SZ
9c60: 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e  (pPager) > journ
9c70: 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  alSize ){.    re
9c80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
9c90: 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20  ;.  }.  iHdrOff 
9ca0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
9cb0: 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  lOff;..  /* Read
9cc0: 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20   in the first 8 
9cd0: 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75  bytes of the jou
9ce0: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20  rnal header. If 
9cf0: 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63  they do not matc
9d00: 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69  h.  ** the  magi
9d10: 63 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61  c string found a
9d20: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
9d30: 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ach journal head
9d40: 65 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  er, return.  ** 
9d50: 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20  SQLITE_DONE. If 
9d60: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
9d70: 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  rs, return an er
9d80: 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77  ror code. Otherw
9d90: 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65  ise,.  ** procee
9da0: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  d..  */.  if( is
9db0: 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d  Hot || iHdrOff!=
9dc0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
9dd0: 64 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  dr ){.    rc = s
9de0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
9df0: 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
9e00: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
9e10: 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20  , iHdrOff);.    
9e20: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
9e30: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
9e40: 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
9e50: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
9e60: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
9e70: 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20  agic))!=0 ){.   
9e80: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9e90: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
9ea0: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
9eb0: 66 69 72 73 74 20 74 68 72 65 65 20 33 32 2d 62  first three 32-b
9ec0: 69 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  it fields of the
9ed0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a   journal header:
9ee0: 20 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66   The nRec.  ** f
9ef0: 69 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73  ield, the checks
9f00: 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61  um-initializer a
9f10: 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
9f20: 73 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72  size at the star
9f30: 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72  t.  ** of the tr
9f40: 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72  ansaction. Retur
9f50: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
9f60: 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
9f70: 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69   wrong..  */.  i
9f80: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
9f90: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
9fa0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
9fb0: 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20  Off+8, pNRec)). 
9fc0: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
9fd0: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
9fe0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
9ff0: 64 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65  drOff+12, &pPage
a000: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20  r->cksumInit)). 
a010: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
a020: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
a030: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
a040: 64 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a  drOff+16, pDbSiz
a050: 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  e)).  ){.    ret
a060: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69  urn rc;.  }..  i
a070: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
a080: 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
a090: 75 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20  u32 iPageSize;  
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a0b0: 50 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20  Page-size field 
a0c0: 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
a0d0: 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65  r */.    u32 iSe
a0e0: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
a0f0: 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d        /* Sector-
a100: 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f  size field of jo
a110: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
a120: 20 20 20 20 75 31 36 20 69 50 61 67 65 53 69 7a      u16 iPageSiz
a130: 65 31 36 3b 20 20 20 20 20 20 20 20 20 20 20 20  e16;            
a140: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 69 50 61 67   /* Copy of iPag
a150: 65 53 69 7a 65 20 69 6e 20 31 36 2d 62 69 74 20  eSize in 16-bit 
a160: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  variable */..   
a170: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67   /* Read the pag
a180: 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
a190: 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68  r-size journal h
a1a0: 65 61 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f  eader fields. */
a1b0: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
a1c0: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
a1d0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
a1e0: 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69  , iHdrOff+20, &i
a1f0: 53 65 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20  SectorSize)).   
a200: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
a210: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
a220: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
a230: 64 72 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65  drOff+24, &iPage
a240: 53 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20  Size)).    ){.  
a250: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
a260: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
a270: 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
a280: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
a290: 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
a2a0: 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
a2b0: 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74  s.    ** are wit
a2c0: 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65  hin range. To be
a2d0: 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74   'in range', bot
a2e0: 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f  h values need to
a2f0: 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20   be a power.    
a300: 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65  ** of two greate
a310: 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
a320: 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e  to 512 or 32, an
a330: 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68  d not greater th
a340: 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a  an their .    **
a350: 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70   respective comp
a360: 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d  ile time maximum
a370: 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a   limits..    */.
a380: 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
a390: 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20  e<512           
a3a0: 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f         || iSecto
a3b0: 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c  rSize<32.     ||
a3c0: 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54   iPageSize>SQLIT
a3d0: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
a3e0: 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d  || iSectorSize>M
a3f0: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20  AX_SECTOR_SIZE. 
a400: 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69      || ((iPageSi
a410: 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29  ze-1)&iPageSize)
a420: 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74  !=0   || ((iSect
a430: 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f  orSize-1)&iSecto
a440: 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29  rSize)!=0 .    )
a450: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
a460: 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67  e either the pag
a470: 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72  e-size or sector
a480: 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75  -size in the jou
a490: 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a  rnal-header is .
a4a0: 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64        ** invalid
a4b0: 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65  , then the proce
a4c0: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
a4d0: 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  e journal-header
a4e0: 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20   must have .    
a4f0: 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66    ** crashed bef
a500: 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77  ore the header w
a510: 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68  as synced. In th
a520: 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61  is case stop rea
a530: 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74  ding .      ** t
a540: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
a550: 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  here..      */. 
a560: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
a570: 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
a580: 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
a590: 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d  e page-size to m
a5a0: 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72  atch the value r
a5b0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
a5c0: 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73  rnal. .    ** Us
a5d0: 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d  e a testcase() m
a5e0: 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72  acro to make sur
a5f0: 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61  e that malloc fa
a600: 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20  ilure within .  
a610: 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67    ** PagerSetPag
a620: 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65  esize() is teste
a630: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 50  d..    */.    iP
a640: 61 67 65 53 69 7a 65 31 36 20 3d 20 28 75 31 36  ageSize16 = (u16
a650: 29 69 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  )iPageSize;.    
a660: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
a670: 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
a680: 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65 31  ger, &iPageSize1
a690: 36 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74  6, -1);.    test
a6a0: 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
a6b0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _OK );.    asser
a6c0: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
a6d0: 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 31 36 3d   || iPageSize16=
a6e0: 3d 28 75 31 36 29 69 50 61 67 65 53 69 7a 65 20  =(u16)iPageSize 
a6f0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74  );..    /* Updat
a700: 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
a710: 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
a720: 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
a730: 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65  d by .    ** the
a740: 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72   process that cr
a750: 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e  eated this journ
a760: 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72  al. If this jour
a770: 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  nal was.    ** c
a780: 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
a790: 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ess other than t
a7a0: 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68  his one, then th
a7b0: 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  is routine.    *
a7c0: 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  * is being calle
a7d0: 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  d from within pa
a7e0: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20  ger_playback(). 
a7f0: 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a  The local value.
a800: 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e      ** of Pager.
a810: 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65  sectorSize is re
a820: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e  stored at the en
a830: 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e  d of that routin
a840: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  e..    */.    pP
a850: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
a860: 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a   = iSectorSize;.
a870: 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
a880: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
a890: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
a8a0: 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
a8b0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
a8c0: 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
a8d0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
a8e0: 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
a8f0: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
a900: 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
a910: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
a920: 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
a930: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
a940: 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
a950: 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
a960: 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
a970: 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
a980: 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
a990: 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
a9a0: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
a9b0: 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
a9c0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
a9d0: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
a9e0: 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
a9f0: 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
aa00: 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
aa10: 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41     + 4 bytes: PA
aa20: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20  GER_MJ_PGNO..** 
aa30: 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73    + N bytes: Mas
aa40: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
aa50: 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a  name in utf-8..*
aa60: 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e  *   + 4 bytes: N
aa70: 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74   (length of mast
aa80: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
aa90: 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c  in bytes, no nul
aaa0: 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a  -terminator)..**
aab0: 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61     + 4 bytes: Ma
aac0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
aad0: 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  e checksum..**  
aae0: 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75   + 8 bytes: aJou
aaf0: 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a  rnalMagic[]..**.
ab00: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
ab10: 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b  urnal page check
ab20: 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f  sum is the sum o
ab30: 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  f the bytes in t
ab40: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
ab50: 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65  rnal name, where
ab60: 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e   each byte is in
ab70: 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73  terpreted as a s
ab80: 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65  igned 8-bit inte
ab90: 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d  ger..**.** If zM
aba0: 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20  aster is a NULL 
abb0: 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20  pointer (occurs 
abc0: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74  for a single dat
abd0: 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
abe0: 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c  n), .** this cal
abf0: 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  l is a no-op..*/
ac00: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
ac10: 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50  eMasterJournal(P
ac20: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
ac30: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
ac40: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
ac50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac60: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
ac70: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
ac80: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
ac90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
aca0: 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20  ength of string 
acb0: 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34  zMaster */.  i64
acc0: 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ace0: 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
acf0: 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  r in journal fil
ad00: 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53  e */.  i64 jrnlS
ad10: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
ad20: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
ad30: 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
ad40: 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32  on disk */.  u32
ad50: 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20   cksum = 0;     
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ad70: 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72   Checksum of str
ad80: 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a  ing zMaster */..
ad90: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c    if( !zMaster |
ada0: 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  | pPager->setMas
adb0: 74 65 72 0a 20 20 20 7c 7c 20 70 50 61 67 65 72  ter.   || pPager
adc0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
add0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
ade0: 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70  _MEMORY .   || p
adf0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
ae00: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
ae10: 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a  LMODE_OFF .  ){.
ae20: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ae30: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  E_OK;.  }.  pPag
ae40: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
ae50: 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  1;.  assert( isO
ae60: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
ae70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
ae80: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
ae90: 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   <= pPager->jour
aea0: 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20  nalOff );..  /* 
aeb0: 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65  Calculate the le
aec0: 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e  ngth in bytes an
aed0: 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f  d the checksum o
aee0: 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66  f zMaster */.  f
aef0: 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d  or(nMaster=0; zM
af00: 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20  aster[nMaster]; 
af10: 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20  nMaster++){.    
af20: 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72  cksum += zMaster
af30: 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a  [nMaster];.  }..
af40: 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
af50: 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e  sync mode, advan
af60: 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64  ce to the next d
af70: 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72  isk sector befor
af80: 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74  e writing.  ** t
af90: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
afa0: 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20  l name. This is 
afb0: 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76  in case the prev
afc0: 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65  ious page writte
afd0: 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  n to.  ** the jo
afe0: 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64  urnal has alread
aff0: 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20  y been synced.. 
b000: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
b010: 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
b020: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
b030: 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
b040: 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
b050: 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d  .  }.  iHdrOff =
b060: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
b070: 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65  Off;..  /* Write
b080: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
b090: 6e 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20  nal data to the 
b0a0: 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  end of the journ
b0b0: 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a  al file. If.  **
b0c0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
b0d0: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  , return the err
b0e0: 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
b0f0: 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  aller..  */.  if
b100: 28 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  ( (0 != (rc = wr
b110: 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
b120: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20  ->jfd, iHdrOff, 
b130: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
b140: 61 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28  ager)))).   || (
b150: 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74  0 != (rc = sqlit
b160: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
b170: 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
b180: 6e 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66  nMaster, iHdrOff
b190: 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  +4))).   || (0 !
b1a0: 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62  = (rc = write32b
b1b0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
b1c0: 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
b1d0: 65 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20  er, nMaster))). 
b1e0: 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
b1f0: 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
b200: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
b210: 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63  f+4+nMaster+4, c
b220: 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30  ksum))).   || (0
b230: 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
b240: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
b250: 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  >jfd, aJournalMa
b260: 67 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b  gic, 8, iHdrOff+
b270: 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20  4+nMaster+8))). 
b280: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
b290: 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  c;.  }.  pPager-
b2a0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28  >journalOff += (
b2b0: 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a 20 20 70  nMaster+20);.  p
b2c0: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
b2d0: 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  = !pPager->noSyn
b2e0: 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  c;..  /* If the 
b2f0: 70 61 67 65 72 20 69 73 20 69 6e 20 70 65 72 69  pager is in peri
b300: 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f  stent-journal mo
b310: 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79  de, then the phy
b320: 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72  sical .  ** jour
b330: 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74  nal-file may ext
b340: 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64  end past the end
b350: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a   of the master-j
b360: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a  ournal name.  **
b370: 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20   and 8 bytes of 
b380: 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73 74 20  magic data just 
b390: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66  written to the f
b3a0: 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20  ile. This is .  
b3b0: 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63  ** dangerous bec
b3c0: 61 75 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f  ause the code to
b3d0: 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d   rollback a hot-
b3e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a  journal file.  *
b3f0: 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62  * will not be ab
b400: 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d  le to find the m
b410: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61  aster-journal na
b420: 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  me to determine 
b430: 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72  .  ** whether or
b440: 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c   not the journal
b450: 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20   is hot. .  **. 
b460: 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e   ** Easiest thin
b470: 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20  g to do in this 
b480: 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74  scenario is to t
b490: 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72  runcate the jour
b4a0: 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74  nal .  ** file t
b4b0: 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20 73  o the required s
b4c0: 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28  ize..  */ .  if(
b4d0: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
b4e0: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
b4f0: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
b500: 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20   &jrnlSize)).   
b510: 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67  && jrnlSize>pPag
b520: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20  er->journalOff. 
b530: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
b540: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
b550: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
b560: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
b570: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
b580: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
b590: 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61  a page in the ha
b5a0: 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69  sh table given i
b5b0: 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ts page number. 
b5c0: 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  Return.** a poin
b5d0: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
b5e0: 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 72  or NULL if the r
b5f0: 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
b600: 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79   not .** already
b610: 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73   in memory..*/.s
b620: 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67  tatic PgHdr *pag
b630: 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20  er_lookup(Pager 
b640: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
b650: 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b  no){.  PgHdr *p;
b660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b670: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
b680: 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f  rn value */..  /
b690: 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
b6a0: 69 62 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c 20  ible for a call 
b6b0: 74 6f 20 50 63 61 63 68 65 46 65 74 63 68 28 29  to PcacheFetch()
b6c0: 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67   with createFlag
b6d0: 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c  ==0 to.  ** fail
b6e0: 2c 20 73 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d  , since no attem
b6f0: 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64  pt to allocate d
b700: 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69  ynamic memory wi
b710: 6c 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f  ll be made..  */
b720: 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33  .  (void)sqlite3
b730: 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67  PcacheFetch(pPag
b740: 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
b750: 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65 74  o, 0, &p);.  ret
b760: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
b770: 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72  Unless the pager
b780: 20 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74 61   is in error-sta
b790: 74 65 2c 20 64 69 73 63 61 72 64 20 61 6c 6c 20  te, discard all 
b7a0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2e  in-memory pages.
b7b0: 20 49 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 72   If.** the pager
b7c0: 20 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74 61   is in error-sta
b7d0: 74 65 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61  te, then this ca
b7e0: 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ll is a no-op..*
b7f0: 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 57 68 79 20 63  *.** TODO: Why c
b800: 61 6e 20 77 65 20 6e 6f 74 20 72 65 73 65 74 20  an we not reset 
b810: 74 68 65 20 70 61 67 65 72 20 77 68 69 6c 65 20  the pager while 
b820: 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 3f 0a  in error state?.
b830: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
b840: 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72  ager_reset(Pager
b850: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
b860: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 70 50 61 67   SQLITE_OK==pPag
b870: 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
b880: 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
b890: 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e  Restart(pPager->
b8a0: 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 73 71  pBackup);.    sq
b8b0: 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72  lite3PcacheClear
b8c0: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
b8d0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
b8e0: 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a  bSizeValid = 0;.
b8f0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
b900: 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73  e all structures
b910: 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53   in the Pager.aS
b920: 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79  avepoint[] array
b930: 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a   and set both.**
b940: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
b950: 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76  t and Pager.nSav
b960: 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20  epoint to zero. 
b970: 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f  Close the sub-jo
b980: 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69  urnal.** if it i
b990: 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70  s open and the p
b9a0: 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65  ager is not in e
b9b0: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a  xclusive mode..*
b9c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
b9d0: 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
b9e0: 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
b9f0: 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  ){.  int ii;    
ba00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
ba10: 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69  erator for loopi
ba20: 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67 65 72  ng through Pager
ba30: 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20  .aSavepoint */. 
ba40: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
ba50: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
ba60: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ; ii++){.    sql
ba70: 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
ba80: 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70  y(pPager->aSavep
ba90: 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65  oint[ii].pInSave
baa0: 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66  point);.  }.  if
bab0: 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
bac0: 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69  siveMode || sqli
bad0: 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28  te3IsMemJournal(
bae0: 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b  pPager->sjfd) ){
baf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
bb00: 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ose(pPager->sjfd
bb10: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
bb20: 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53  _free(pPager->aS
bb30: 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61  avepoint);.  pPa
bb40: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20  ger->aSavepoint 
bb50: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
bb60: 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  Savepoint = 0;. 
bb70: 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63   pPager->nSubRec
bb80: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
bb90: 65 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65  et the bit numbe
bba0: 72 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61  r pgno in the Pa
bbb0: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
bbc0: 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69  Savepoint .** bi
bbd0: 74 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65  tvecs of all ope
bbe0: 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65  n savepoints. Re
bbf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
bc00: 66 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20  f successful.** 
bc10: 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  or SQLITE_NOMEM 
bc20: 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  if a malloc fail
bc30: 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73  ure occurs..*/.s
bc40: 74 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53  tatic int addToS
bc50: 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
bc60: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
bc70: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
bc80: 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
bc90: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
bca0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
bcb0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
bcc0: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
bcd0: 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  code */..  for(i
bce0: 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
bcf0: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
bd00: 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65  ){.    PagerSave
bd10: 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67  point *p = &pPag
bd20: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
bd30: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f  i];.    if( pgno
bd40: 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20  <=p->nOrig ){.  
bd50: 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65      rc |= sqlite
bd60: 33 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49  3BitvecSet(p->pI
bd70: 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f  nSavepoint, pgno
bd80: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
bd90: 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
bda0: 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73  MEM );.      ass
bdb0: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
bdc0: 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  OK || rc==SQLITE
bdd0: 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a  _NOMEM );.    }.
bde0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
bdf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
be00: 20 74 72 75 65 20 69 66 20 74 68 69 73 20 70 61   true if this pa
be10: 67 65 72 20 75 73 65 73 20 61 20 77 72 69 74 65  ger uses a write
be20: 2d 61 68 65 61 64 20 6c 6f 67 20 69 6e 73 74 65  -ahead log inste
be30: 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a  ad of the usual.
be40: 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ** rollback jour
be50: 6e 61 6c 2e 20 4f 74 68 65 72 77 69 73 65 20 66  nal. Otherwise f
be60: 61 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  alse..*/.#ifndef
be70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
be80: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
be90: 72 55 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70  rUseWal(Pager *p
bea0: 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
beb0: 20 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d   (pPager->pWal!=
bec0: 30 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  0);.}.#else.# de
bed0: 66 69 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c  fine pagerUseWal
bee0: 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70  (x) 0.# define p
bef0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
bf00: 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  x) 0.# define pa
bf10: 67 65 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77  gerWalFrames(v,w
bf20: 2c 78 2c 79 2c 7a 29 20 30 0a 23 20 64 65 66 69  ,x,y,z) 0.# defi
bf30: 6e 65 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49  ne pagerOpenWalI
bf40: 66 50 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49  fPresent(z) SQLI
bf50: 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70  TE_OK.# define p
bf60: 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
bf70: 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49  nsaction(z) SQLI
bf80: 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TE_OK.#endif../*
bf90: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  .** Unlock the d
bfa0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
bfb0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
bfc0: 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61   no-op if the pa
bfd0: 67 65 72 0a 2a 2a 20 69 73 20 69 6e 20 65 78 63  ger.** is in exc
bfe0: 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a  lusive mode..**.
bff0: 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
c000: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
c010: 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 69 73  error state, dis
c020: 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  card the content
c030: 73 20 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61 63  s of .** the cac
c040: 68 65 20 61 6e 64 20 72 65 73 65 74 20 74 68 65  he and reset the
c050: 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
c060: 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 2e   internal state.
c070: 20 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   If there is.** 
c080: 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d  an open journal-
c090: 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6e  file, then the n
c0a0: 65 78 74 20 74 69 6d 65 20 61 20 73 68 61 72 65  ext time a share
c0b0: 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  d-lock is obtain
c0c0: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67  ed.** on the pag
c0d0: 65 72 20 66 69 6c 65 20 28 62 79 20 74 68 69 73  er file (by this
c0e0: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
c0f0: 6f 63 65 73 73 29 2c 20 69 74 20 77 69 6c 6c 20  ocess), it will 
c100: 62 65 0a 2a 2a 20 74 72 65 61 74 65 64 20 61 73  be.** treated as
c110: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61   a hot-journal a
c120: 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  nd rolled back..
c130: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
c140: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65  ager_unlock(Page
c150: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
c160: 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
c170: 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
c180: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
c190: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  OK;          /* 
c1a0: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
c1b0: 20 20 20 69 6e 74 20 69 44 63 20 3d 20 69 73 4f     int iDc = isO
c1c0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 3f  pen(pPager->fd)?
c1d0: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
c1e0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
c1f0: 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20  Pager->fd):0;.. 
c200: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 65     /* If the ope
c210: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 73 75  rating system su
c220: 70 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f  pport deletion o
c230: 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74 68  f open files, th
c240: 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20  en.    ** close 
c250: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c260: 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74   when dropping t
c270: 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
c280: 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20  .  Otherwise.   
c290: 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e   ** another conn
c2a0: 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72  ection with jour
c2b0: 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20  nal_mode=delete 
c2c0: 6d 69 67 68 74 20 64 65 6c 65 74 65 20 74 68 65  might delete the
c2d0: 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74   file.    ** out
c2e0: 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a   from under us..
c2f0: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
c300: 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
c310: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26  LMODE_MEMORY   &
c320: 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
c330: 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
c340: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20  RNALMODE_OFF    
c350: 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
c360: 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
c370: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
c380: 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a       & 5)!=1 );.
c390: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
c3a0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
c3b0: 45 4c 45 54 45 20 20 20 26 20 35 29 21 3d 31 20  ELETE   & 5)!=1 
c3c0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
c3d0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
c3e0: 45 5f 54 52 55 4e 43 41 54 45 20 26 20 35 29 3d  E_TRUNCATE & 5)=
c3f0: 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
c400: 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
c410: 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20 26 20  MODE_PERSIST  & 
c420: 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28  5)==1 );.    if(
c430: 20 30 3d 3d 28 69 44 63 20 26 20 53 51 4c 49 54   0==(iDc & SQLIT
c440: 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41  E_IOCAP_UNDELETA
c450: 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20  BLE_WHEN_OPEN). 
c460: 20 20 20 20 7c 7c 20 31 21 3d 28 70 50 61 67 65      || 1!=(pPage
c470: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26  r->journalMode &
c480: 20 35 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20   5).    ){.     
c490: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
c4a0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
c4b0: 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
c4c0: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
c4d0: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
c4e0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
c4f0: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
c500: 20 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76     releaseAllSav
c510: 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b  epoints(pPager);
c520: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
c530: 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
c540: 2c 20 73 6f 6d 65 62 6f 64 79 20 65 6c 73 65 20  , somebody else 
c550: 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69 74 2e  might change it.
c560: 20 54 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75   The.    ** valu
c570: 65 73 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67  es stored in Pag
c580: 65 72 2e 64 62 53 69 7a 65 20 65 74 63 2e 20 6d  er.dbSize etc. m
c590: 69 67 68 74 20 62 65 63 6f 6d 65 20 69 6e 76 61  ight become inva
c5a0: 6c 69 64 20 69 66 0a 20 20 20 20 2a 2a 20 74 68  lid if.    ** th
c5b0: 69 73 20 68 61 70 70 65 6e 73 2e 20 20 4f 6e 65  is happens.  One
c5c0: 20 63 61 6e 20 61 72 67 75 65 20 74 68 61 74 20   can argue that 
c5d0: 74 68 69 73 20 64 6f 65 73 6e 27 74 20 6e 65 65  this doesn't nee
c5e0: 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 0a  d to be cleared.
c5f0: 20 20 20 20 2a 2a 20 75 6e 74 69 6c 20 74 68 65      ** until the
c600: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
c610: 63 68 65 63 6b 20 66 61 69 6c 73 20 69 6e 20 50  check fails in P
c620: 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29  agerSharedLock()
c630: 2e 0a 20 20 20 20 2a 2a 20 43 6c 65 61 72 69 6e  ..    ** Clearin
c640: 67 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  g the page size 
c650: 63 61 63 68 65 20 68 65 72 65 20 69 73 20 62 65  cache here is be
c660: 69 6e 67 20 63 6f 6e 73 65 72 76 61 74 69 76 65  ing conservative
c670: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
c680: 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
c690: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70   = 0;..    if( p
c6a0: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
c6b0: 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  r) ){.      sqli
c6c0: 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
c6d0: 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
c6e0: 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  >pWal);.    }els
c6f0: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73  e{.      rc = os
c700: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
c710: 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
c720: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b   }.    if( rc ){
c730: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
c740: 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20  rrCode = rc;.   
c750: 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28   }.    IOTRACE((
c760: 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70  "UNLOCK %p\n", p
c770: 50 61 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20  Pager))..    /* 
c780: 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  If Pager.errCode
c790: 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e   is set, the con
c7a0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
c7b0: 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20  er cache cannot 
c7c0: 62 65 0a 20 20 20 20 2a 2a 20 74 72 75 73 74 65  be.    ** truste
c7d0: 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 20  d. Now that the 
c7e0: 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 75 6e  pager file is un
c7f0: 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74  locked, the cont
c800: 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ents of the.    
c810: 2a 2a 20 63 61 63 68 65 20 63 61 6e 20 62 65 20  ** cache can be 
c820: 64 69 73 63 61 72 64 65 64 20 61 6e 64 20 74 68  discarded and th
c830: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 73 61 66  e error code saf
c840: 65 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20 20 20  ely cleared..   
c850: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
c860: 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
c870: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
c880: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
c890: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
c8a0: 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  e = SQLITE_OK;. 
c8b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67       }.      pag
c8c0: 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
c8d0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
c8e0: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
c8f0: 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  Done = 0;.    pP
c900: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
c910: 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  GER_UNLOCK;.    
c920: 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
c930: 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ed = 0;.  }.}../
c940: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
c950: 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  on should be cal
c960: 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4f 45 52  led when an IOER
c970: 52 2c 20 43 4f 52 52 55 50 54 20 6f 72 20 46 55  R, CORRUPT or FU
c980: 4c 4c 20 65 72 72 6f 72 0a 2a 2a 20 6d 61 79 20  LL error.** may 
c990: 68 61 76 65 20 6f 63 63 75 72 72 65 64 2e 20 54  have occurred. T
c9a0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
c9b0: 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
c9c0: 6f 20 74 68 65 20 70 61 67 65 72 20 0a 2a 2a 20  o the pager .** 
c9d0: 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73  structure, the s
c9e0: 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f 72 2d  econd the error-
c9f0: 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65  code about to be
ca00: 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70   returned by a p
ca10: 61 67 65 72 20 0a 2a 2a 20 41 50 49 20 66 75 6e  ager .** API fun
ca20: 63 74 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65  ction. The value
ca30: 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63   returned is a c
ca40: 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e  opy of the secon
ca50: 64 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74  d argument .** t
ca60: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
ca70: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73   .**.** If the s
ca80: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
ca90: 73 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  s SQLITE_IOERR, 
caa0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20  SQLITE_CORRUPT, 
cab0: 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a  or SQLITE_FULL.*
cac0: 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65 63 6f  * the error beco
cad0: 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74 2e 20  mes persistent. 
cae0: 55 6e 74 69 6c 20 74 68 65 20 70 65 72 73 69 73  Until the persis
caf0: 74 65 6e 74 20 65 72 72 6f 72 20 69 73 20 63 6c  tent error is cl
cb00: 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71  eared,.** subseq
cb10: 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73 20 6f  uent API calls o
cb20: 6e 20 74 68 69 73 20 50 61 67 65 72 20 77 69 6c  n this Pager wil
cb30: 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65  l immediately re
cb40: 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a  turn the same .*
cb50: 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  * error code..**
cb60: 0a 2a 2a 20 41 20 70 65 72 73 69 73 74 65 6e 74  .** A persistent
cb70: 20 65 72 72 6f 72 20 69 6e 64 69 63 61 74 65 73   error indicates
cb80: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
cb90: 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
cba0: 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74  cache .** cannot
cbb0: 20 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69   be trusted. Thi
cbc0: 73 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63  s state can be c
cbd0: 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65  leared by comple
cbe0: 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20  tely discarding 
cbf0: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
cc00: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
cc10: 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61  che. If a transa
cc20: 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65  ction was active
cc30: 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72   when.** the per
cc40: 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63  sistent error oc
cc50: 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65  curred, then the
cc60: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
cc70: 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f  l may need.** to
cc80: 20 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20   be replayed to 
cc90: 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74  restore the cont
cca0: 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61  ents of the data
ccb0: 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66  base file (as if
ccc0: 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f  .** it were a ho
ccd0: 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73  t-journal)..*/.s
cce0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
ccf0: 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61  error(Pager *pPa
cd00: 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20  ger, int rc){.  
cd10: 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30  int rc2 = rc & 0
cd20: 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72  xff;.  assert( r
cd30: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
cd40: 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
cd50: 72 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65  rt(.       pPage
cd60: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
cd70: 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20  TE_FULL ||.     
cd80: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
cd90: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a  e==SQLITE_OK ||.
cda0: 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
cdb0: 65 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d  errCode & 0xff)=
cdc0: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
cdd0: 29 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51  );.  if( rc2==SQ
cde0: 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32  LITE_FULL || rc2
cdf0: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  ==SQLITE_IOERR )
ce00: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
ce10: 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a  rCode = rc;.  }.
ce20: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ce30: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
ce40: 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72  rollback if a tr
ce50: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
ce60: 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ive and unlock t
ce70: 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
ce80: 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
ce90: 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
cea0: 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
ceb0: 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64  e error state, d
cec0: 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a  o not attempt .*
ced0: 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61  * the rollback a
cee0: 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73  t this time. Ins
cef0: 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f  tead, pager_unlo
cf00: 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20  ck() is called. 
cf10: 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70  The.** call to p
cf20: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69  ager_unlock() wi
cf30: 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69  ll discard all i
cf40: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20  n-memory pages, 
cf50: 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61  unlock.** the da
cf60: 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
cf70: 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20  clear the error 
cf80: 73 74 61 74 65 2e 20 49 66 20 74 68 69 73 20 6d  state. If this m
cf90: 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65  eans that.** the
cfa0: 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72  re is a hot-jour
cfb0: 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20  nal left in the 
cfc0: 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65  file-system, the
cfd0: 20 6e 65 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e   next connection
cfe0: 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  .** to obtain a 
cff0: 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
d000: 68 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20  he pager (which 
d010: 6d 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29  may be this one)
d020: 20 77 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74   will.** roll it
d030: 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
d040: 74 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f  the pager has no
d050: 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  t already entere
d060: 64 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  d the error stat
d070: 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a  e, but an IO or.
d080: 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20  ** malloc error 
d090: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
d0a0: 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74  rollback, then t
d0b0: 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20  his will itself 
d0c0: 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61  cause .** the pa
d0d0: 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
d0e0: 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 57 68   error state. Wh
d0f0: 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61  ich will be clea
d100: 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61  red by the.** ca
d110: 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
d120: 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62  ck(), as describ
d130: 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61  ed above..*/.sta
d140: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e  tic void pagerUn
d150: 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
d160: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
d170: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
d180: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
d190: 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74   && pPager->stat
d1a0: 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
d1b0: 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
d1c0: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
d1d0: 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  c();.    sqlite3
d1e0: 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
d1f0: 61 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  ager);.    sqlit
d200: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
d210: 63 28 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  c();.  }.  pager
d220: 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
d230: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
d240: 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72  outine ends a tr
d250: 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61  ansaction. A tra
d260: 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61  nsaction is usua
d270: 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a  lly ended by .**
d280: 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54   either a COMMIT
d290: 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f   or a ROLLBACK o
d2a0: 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72  peration. This r
d2b0: 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61  outine may be ca
d2c0: 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72  lled .** after r
d2d0: 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74  ollback of a hot
d2e0: 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20  -journal, or if 
d2f0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
d300: 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a  while opening.**
d310: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d320: 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  e or writing the
d330: 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72   very first jour
d340: 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a  nal-header of a.
d350: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  ** database tran
d360: 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20  saction..** .** 
d370: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
d380: 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  in PAGER_SHARED 
d390: 6f 72 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  or PAGER_UNLOCK 
d3a0: 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
d3b0: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
d3c0: 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
d3d0: 2d 6f 70 20 28 72 65 74 75 72 6e 73 20 53 51 4c  -op (returns SQL
d3e0: 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f  ITE_OK)..**.** O
d3f0: 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63  therwise, any ac
d400: 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
d410: 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a  are released..**
d420: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
d430: 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c  al file is open,
d440: 20 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e   then it is "fin
d450: 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20  alized". Once a 
d460: 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65  journal .** file
d470: 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69   has been finali
d480: 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  zed it is not po
d490: 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74  ssible to use it
d4a0: 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20   to roll back a 
d4b0: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
d4c0: 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20   Nor will it be 
d4d0: 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
d4e0: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62   a hot-journal b
d4f0: 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79  y this.** or any
d500: 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
d510: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63  connection. Exac
d520: 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61  tly how a journa
d530: 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a  l is finalized.*
d540: 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65  * depends on whe
d550: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
d560: 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
d570: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
d580: 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75  de and.** the cu
d590: 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  rrent journal-mo
d5a0: 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61  de (Pager.journa
d5b0: 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73  lMode value), as
d5c0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
d5d0: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d    journalMode==M
d5e0: 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75  EMORY.**     Jou
d5f0: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
d600: 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63  ptor is simply c
d610: 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74  losed. This dest
d620: 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20  roys an .**     
d630: 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
d640: 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  l..**.**   journ
d650: 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45  alMode==TRUNCATE
d660: 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20  .**     Journal 
d670: 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65  file is truncate
d680: 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  d to zero bytes 
d690: 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20  in size..**.**  
d6a0: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
d6b0: 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65  RSIST.**     The
d6c0: 20 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20   first 28 bytes 
d6d0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
d6e0: 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20  ile are zeroed. 
d6f0: 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73  This invalidates
d700: 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73  .**     the firs
d710: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
d720: 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e   in the file, an
d730: 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69  d hence the enti
d740: 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  re journal.**   
d750: 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c    file. An inval
d760: 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  id journal file 
d770: 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64  cannot be rolled
d780: 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   back..**.**   j
d790: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45  ournalMode==DELE
d7a0: 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f  TE.**     The jo
d7b0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c  urnal file is cl
d7c0: 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64  osed and deleted
d7d0: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
d7e0: 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  Delete()..**.** 
d7f0: 20 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72      If the pager
d800: 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
d810: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
d820: 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69  his method of fi
d830: 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20  nalizing.**     
d840: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d850: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20   is never used. 
d860: 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20  Instead, if the 
d870: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a  journalMode is.*
d880: 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64  *     DELETE and
d890: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
d8a0: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
d8b0: 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63   the method desc
d8c0: 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20  ribed under.**  
d8d0: 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
d8e0: 50 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20  PERSIST is used 
d8f0: 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41  instead..**.** A
d900: 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
d910: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 69   is finalized, i
d920: 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e  f running in non
d930: 2d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c  -exclusive mode,
d940: 20 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 6d 6f   the.** pager mo
d950: 76 65 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ves to PAGER_SHA
d960: 52 45 44 20 73 74 61 74 65 20 28 61 6e 64 20 64  RED state (and d
d970: 6f 77 6e 67 72 61 64 65 73 20 74 68 65 20 6c 6f  owngrades the lo
d980: 63 6b 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74  ck on the.** dat
d990: 61 62 61 73 65 20 66 69 6c 65 20 61 63 63 6f 72  abase file accor
d9a0: 64 69 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49  dingly)..**.** I
d9b0: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  f the pager is r
d9c0: 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
d9d0: 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 73 20  ive mode and is 
d9e0: 69 6e 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20  in PAGER_SYNCED 
d9f0: 73 74 61 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76  state,.** it mov
da00: 65 73 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c  es to PAGER_EXCL
da10: 55 53 49 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20  USIVE. No locks 
da20: 61 72 65 20 64 6f 77 6e 67 72 61 64 65 64 20 77  are downgraded w
da30: 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a  hen running in.*
da40: 2a 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  * exclusive mode
da50: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
da60: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
da70: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
da80: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
da90: 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61  curs during.** a
daa0: 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65  ny of the IO ope
dab0: 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c  rations to final
dac0: 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
dad0: 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74  file or unlock t
dae0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74  he.** database t
daf0: 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
db00: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
db10: 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49  d to the user. I
db20: 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74  f the .** operat
db30: 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  ion to finalize 
db40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
db50: 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65   fails, then the
db60: 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74   code still.** t
db70: 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  ries to unlock t
db80: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
db90: 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75   if not in exclu
dba0: 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  sive mode. If th
dbb0: 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72  e.** unlock oper
dbc0: 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77  ation fails as w
dbd0: 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69  ell, then the fi
dbe0: 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72  rst error code r
dbf0: 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  elated.** to the
dc00: 20 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63   first error enc
dc10: 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f  ountered (the jo
dc20: 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69  urnal finalizati
dc30: 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65  on one) is.** re
dc40: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
dc50: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f  c int pager_end_
dc60: 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  transaction(Page
dc70: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68  r *pPager, int h
dc80: 61 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  asMaster){.  int
dc90: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
dca0: 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
dcb0: 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ode from journal
dcc0: 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70   finalization op
dcd0: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
dce0: 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
dcf0: 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63  ;     /* Error c
dd00: 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65  ode from db file
dd10: 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f   unlock operatio
dd20: 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67  n */..  if( pPag
dd30: 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
dd40: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
dd50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
dd60: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 41  ;.  }.  releaseA
dd70: 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
dd80: 67 65 72 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ger);..  assert(
dd90: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
dda0: 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  jfd) || pPager->
ddb0: 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
ddc0: 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
ddd0: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
dde0: 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
ddf0: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
de00: 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69  ;..    /* Finali
de10: 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
de20: 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile. */.    if( 
de30: 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72  sqlite3IsMemJour
de40: 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  nal(pPager->jfd)
de50: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
de60: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
de70: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
de80: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
de90: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
dea0: 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
deb0: 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  jfd);.    }else 
dec0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
ded0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
dee0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
def0: 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ATE ){.      if(
df00: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
df10: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Off==0 ){.      
df20: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
df30: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
df40: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
df50: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
df60: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
df70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
df80: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
df90: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
dfa0: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
dfb0: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 0;.    }else
dfc0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
dfd0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
dfe0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
dff0: 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28 70 50  IST.      || (pP
e000: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
e010: 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  ode && pPager->j
e020: 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
e030: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
e040: 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  L).    ){.      
e050: 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c  rc = zeroJournal
e060: 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d  Hdr(pPager, hasM
e070: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70 61  aster);.      pa
e080: 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
e090: 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 70 50 61  , rc);.      pPa
e0a0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
e0b0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
e0c0: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
e0d0: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 0;.    }else
e0e0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
e0f0: 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78  branch may be ex
e100: 65 63 75 74 65 64 20 77 69 74 68 20 50 61 67 65  ecuted with Page
e110: 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d  r.journalMode==M
e120: 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a  EMORY if.      *
e130: 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  * a hot-journal 
e140: 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20  was just rolled 
e150: 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
e160: 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  se the journal. 
e170: 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f       ** file sho
e180: 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e  uld be closed an
e190: 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68  d deleted. If th
e1a0: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72  is connection wr
e1b0: 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ites to.      **
e1c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
e1d0: 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73  le, it will do s
e1e0: 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65  o using an in-me
e1f0: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20  mory journal. . 
e200: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
e210: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
e220: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
e230: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
e240: 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20  ETE .           
e250: 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
e260: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
e270: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
e280: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
e290: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
e2a0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
e2b0: 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
e2c0: 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
e2d0: 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
e2e0: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ->jfd);.      if
e2f0: 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
e300: 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ile ){.        r
e310: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
e320: 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
e330: 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
e340: 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 0);.      }.
e350: 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
e360: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
e370: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
e380: 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70  heIterateDirty(p
e390: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
e3a0: 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
e3b0: 73 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  sh);.#endif.  }.
e3c0: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
e3d0: 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
e3e0: 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
e3f0: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
e400: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
e410: 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69  nRec = 0;.  sqli
e420: 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
e430: 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  l(pPager->pPCach
e440: 65 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72  e);..  if( pager
e450: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
e460: 7b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  {.    rc2 = sqli
e470: 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54 72  te3WalEndWriteTr
e480: 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
e490: 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73 73  ->pWal);.    ass
e4a0: 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54 45  ert( rc2==SQLITE
e4b0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 70 50 61 67 65  _OK );.    pPage
e4c0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
e4d0: 5f 53 48 41 52 45 44 3b 0a 0a 20 20 20 20 2f 2a  _SHARED;..    /*
e4e0: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
e4f0: 6f 6e 20 77 61 73 20 69 6e 20 6c 6f 63 6b 69 6e  on was in lockin
e500: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
e510: 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e 6f 20   mode but is no 
e520: 6c 6f 6e 67 65 72 2c 0a 20 20 20 20 2a 2a 20 64  longer,.    ** d
e530: 72 6f 70 20 74 68 65 20 45 58 43 4c 55 53 49 56  rop the EXCLUSIV
e540: 45 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  E lock held on t
e550: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
e560: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
e570: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
e580: 69 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74  iveMode && sqlit
e590: 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f  e3WalExclusiveMo
e5a0: 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  de(pPager->pWal,
e5b0: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72 63 32   0) ){.      rc2
e5c0: 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67   = osUnlock(pPag
e5d0: 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c  er->fd, SHARED_L
e5e0: 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  OCK);.    }.  }e
e5f0: 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d  lse if( !pPager-
e600: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
e610: 7b 0a 20 20 20 20 72 63 32 20 3d 20 6f 73 55 6e  {.    rc2 = osUn
e620: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
e630: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
e640: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
e650: 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
e660: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
e670: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30  ngeCountDone = 0
e680: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
e690: 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
e6a0: 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20  ER_SYNCED ){.   
e6b0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
e6c0: 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
e6d0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
e6e0: 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
e6f0: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
e700: 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  c = 0;.  pPager-
e710: 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b  >dbModified = 0;
e720: 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20  ..  /* TODO: Is 
e730: 74 68 69 73 20 6f 70 74 69 6d 61 6c 3f 20 57 68  this optimal? Wh
e740: 79 20 69 73 20 74 68 65 20 64 62 20 73 69 7a 65  y is the db size
e750: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 68 65 72   invalidated her
e760: 65 20 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68 65  e .  ** when the
e770: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
e780: 73 20 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64 3f 20  s not unlocked? 
e790: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4f  */.  pPager->dbO
e7a0: 72 69 67 53 69 7a 65 20 3d 20 30 3b 0a 20 20 73  rigSize = 0;.  s
e7b0: 71 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e  qlite3PcacheTrun
e7c0: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43  cate(pPager->pPC
e7d0: 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62  ache, pPager->db
e7e0: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 21 4d 45  Size);.  if( !ME
e7f0: 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65  MDB ){.    pPage
e800: 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
e810: 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   0;.  }..  retur
e820: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
e830: 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ?rc2:rc);.}../*.
e840: 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61  ** Parameter aDa
e850: 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ta must point to
e860: 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61   a buffer of pPa
e870: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
e880: 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20  tes.** of data. 
e890: 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
e8a0: 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61  rn a checksum ba
e8b0: 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74  sed ont the cont
e8c0: 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  ents of the .** 
e8d0: 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64  page of data and
e8e0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
e8f0: 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b  ue of pPager->ck
e900: 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  sumInit..**.** T
e910: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61  his is not a rea
e920: 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69  l checksum. It i
e930: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68  s really just th
e940: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a  e sum of the .**
e950: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20   random initial 
e960: 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63  value (pPager->c
e970: 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76  ksumInit) and ev
e980: 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a  ery 200th byte.*
e990: 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  * of the page da
e9a0: 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  ta, starting wit
e9b0: 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70  h byte offset (p
e9c0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25  Pager->pageSize%
e9d0: 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79  200)..** Each by
e9e0: 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  te is interprete
e9f0: 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e  d as an 8-bit un
ea00: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a  signed integer..
ea10: 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74  **.** Changing t
ea20: 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20  he formula used 
ea30: 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20  to compute this 
ea40: 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73  checksum results
ea50: 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70   in an.** incomp
ea60: 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66  atible journal f
ea70: 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  ile format..**.*
ea80: 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72  * If journal cor
ea90: 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
eaa0: 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
eab0: 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
eac0: 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61  likely .** scena
ead0: 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20  rio is that one 
eae0: 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72  end or the other
eaf0: 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77   of the record w
eb00: 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20  ill be changed. 
eb10: 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c  .** It is much l
eb20: 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20  ess likely that 
eb30: 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20  the two ends of 
eb40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
eb50: 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f  rd will be.** co
eb60: 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69  rrect and the mi
eb70: 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e  ddle be corrupt.
eb80: 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68    Thus, this "ch
eb90: 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a  ecksum" scheme,.
eba0: 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61  ** though fast a
ebb0: 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68  nd simple, catch
ebc0: 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69  es the mostly li
ebd0: 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72  kely kind of cor
ebe0: 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
ebf0: 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
ec00: 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
ec10: 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  , const u8 *aDat
ec20: 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
ec30: 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
ec40: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nit;         /* 
ec50: 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74  Checksum value t
ec60: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
ec70: 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
ec80: 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20  geSize-200;     
ec90: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
eca0: 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28  nter */.  while(
ecb0: 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
ecc0: 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
ecd0: 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
ece0: 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
ecf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74  .}../*.** Report
ed00: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
ed10: 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65  e size and numbe
ed20: 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
ed30: 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74  tes back.** to t
ed40: 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66  he codec..*/.#if
ed50: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
ed60: 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64  ODEC.static void
ed70: 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
ed80: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
ed90: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
eda0: 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b  CodecSizeChng ){
edb0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  .    pPager->xCo
edc0: 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67  decSizeChng(pPag
edd0: 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67  er->pCodec, pPag
ede0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  er->pageSize,.  
edf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee00: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50           (int)pP
ee10: 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b  ager->nReserve);
ee20: 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
ee30: 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72  efine pagerRepor
ee40: 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20  tSize(X)     /* 
ee50: 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e  No-op if we do n
ee60: 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64  ot support a cod
ee70: 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ec */.#endif../*
ee80: 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  .** Read a singl
ee90: 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68  e page from eith
eea0: 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  er the journal f
eeb0: 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72  ile (if isMainJr
eec0: 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f  nl==1) or.** fro
eed0: 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
eee0: 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c  l (if isMainJrnl
eef0: 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63  ==0) and playbac
ef00: 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20  k that page..** 
ef10: 54 68 65 20 70 61 67 65 20 62 65 67 69 6e 73 20  The page begins 
ef20: 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73  at offset *pOffs
ef30: 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  et into the file
ef40: 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a  . The *pOffset.*
ef50: 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65  * value is incre
ef60: 61 73 65 64 20 74 6f 20 74 68 65 20 73 74 61 72  ased to the star
ef70: 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  t of the next pa
ef80: 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ge in the journa
ef90: 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 4d  l..**.** The isM
efa0: 61 69 6e 4a 72 6e 6c 20 66 6c 61 67 20 69 73 20  ainJrnl flag is 
efb0: 74 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  true if this is 
efc0: 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
efd0: 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a  k journal and.**
efe0: 20 66 61 6c 73 65 20 66 6f 72 20 74 68 65 20 73   false for the s
eff0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
f000: 2e 20 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  .  The main roll
f010: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65  back journal use
f020: 73 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 73 20 2d  s.** checksums -
f030: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
f040: 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 2e  ournal does not.
f050: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
f060: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
f070: 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61   page record rea
f080: 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
f090: 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
f0a0: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
f0b0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
f0c0: 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69  ue of Pager.dbSi
f0d0: 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  ze, then playbac
f0e0: 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20  k is.** skipped 
f0f0: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
f100: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
f110: 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74   If pDone is not
f120: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69   NULL, then it i
f130: 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61  s a record of pa
f140: 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c  ges that have al
f150: 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c  ready.** been pl
f160: 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74  ayed back.  If t
f170: 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66  he page at *pOff
f180: 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  set has already 
f190: 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
f1a0: 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72  .** (if the corr
f1b0: 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20  esponding pDone 
f1c0: 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e  bit is set) then
f1d0: 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61   skip the playba
f1e0: 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ck..** Make sure
f1f0: 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63   the pDone bit c
f200: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
f210: 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67  the *pOffset pag
f220: 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f  e is set.** prio
f230: 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a  r to returning..
f240: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
f250: 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63  e record is succ
f260: 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
f270: 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
f280: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  rnal file.** and
f290: 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68   played back, th
f2a0: 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  en SQLITE_OK is 
f2b0: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
f2c0: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
f2d0: 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  ** while reading
f2e0: 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d   the record from
f2f0: 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
f300: 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65  al file or while
f310: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74   writing.** to t
f320: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
f330: 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
f340: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
f350: 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a  rned. If data.**
f360: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
f370: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
f380: 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
f390: 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f  e but appears to
f3a0: 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64   be.** corrupted
f3b0: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
f3c0: 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20   returned. Data 
f3d0: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  is considered co
f3e0: 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77  rrupted in.** tw
f3f0: 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a  o circumstances:
f400: 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74  .** .**   * If t
f410: 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e  he record page-n
f420: 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c  umber is illegal
f430: 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f   (0 or PAGER_MJ_
f440: 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a  PGNO), or.**   *
f450: 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   If the record i
f460: 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
f470: 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
f480: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  n journal file.*
f490: 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68  *     and the ch
f4a0: 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65  ecksum field doe
f4b0: 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
f4c0: 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a  record content..
f4d0: 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66  **.** Neither of
f4e0: 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61   these two scena
f4f0: 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c  rios are possibl
f500: 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70  e during a savep
f510: 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  oint rollback..*
f520: 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20  *.** If this is 
f530: 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
f540: 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72  back, then memor
f550: 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65  y may have to be
f560: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20   dynamically.** 
f570: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
f580: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74  s function. If t
f590: 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20  his is the case 
f5a0: 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f  and an allocatio
f5b0: 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49  n fails,.** SQLI
f5c0: 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
f5d0: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
f5e0: 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
f5f0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50  ck_one_page(.  P
f600: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
f610: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f620: 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20  The pager being 
f630: 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
f640: 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20   i64 *pOffset,  
f650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f660: 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f  * Offset of reco
f670: 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a  rd to playback *
f680: 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
f690: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
f6a0: 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70    /* Bitvec of p
f6b0: 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61  ages already pla
f6c0: 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e  yed back */.  in
f6d0: 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20  t isMainJrnl,   
f6e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
f6f0: 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c   -> main journal
f700: 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e  . 0 -> sub-journ
f710: 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  al. */.  int isS
f720: 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 20 20  avepnt          
f730: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
f740: 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  or a savepoint r
f750: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20  ollback */.){.  
f760: 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
f770: 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
f780: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
f790: 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
f7a0: 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
f7b0: 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
f7c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f7d0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
f7e0: 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
f7f0: 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
f800: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
f810: 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
f820: 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
f830: 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
f840: 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20   char *aData;   
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f860: 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  * Temporary stor
f870: 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  age for the page
f880: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
f890: 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20  le *jfd;        
f8a0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
f8b0: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
f8c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
f8d0: 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65  */.  int isSynce
f8e0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
f8f0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
f900: 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79  urnal page is sy
f910: 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nced */..  asser
f920: 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e  t( (isMainJrnl&~
f930: 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  1)==0 );      /*
f940: 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30   isMainJrnl is 0
f950: 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
f960: 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31  t( (isSavepnt&~1
f970: 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  )==0 );       /*
f980: 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20   isSavepnt is 0 
f990: 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
f9a0: 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20  ( isMainJrnl || 
f9b0: 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20  pDone );     /* 
f9c0: 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65  pDone always use
f9d0: 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d on sub-journal
f9e0: 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  s */.  assert( i
f9f0: 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e  sSavepnt || pDon
fa00: 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f  e==0 );   /* pDo
fa10: 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e  ne never used on
fa20: 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a   non-savepoint *
fa30: 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61  /..  aData = pPa
fa40: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
fa50: 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20    assert( aData 
fa60: 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  );         /* Te
fa70: 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20  mp storage must 
fa80: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
fa90: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  n allocated */. 
faa0: 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
fab0: 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
fac0: 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20  || (!isMainJrnl 
fad0: 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b  && isSavepnt) );
fae0: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
faf0: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
fb00: 70 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74  page data from t
fb10: 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75  he journal or su
fb20: 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  b-journal.  ** f
fb30: 69 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65  ile. Return an e
fb40: 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65  rror code to the
fb50: 20 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f   caller if an IO
fb60: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20   error occurs.. 
fb70: 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61   */.  jfd = isMa
fb80: 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d  inJrnl ? pPager-
fb90: 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73  >jfd : pPager->s
fba0: 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  jfd;.  rc = read
fbb0: 33 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66  32bits(jfd, *pOf
fbc0: 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  fset, &pgno);.  
fbd0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
fbe0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
fbf0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
fc00: 65 61 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44  ead(jfd, (u8*)aD
fc10: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
fc20: 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74  eSize, (*pOffset
fc30: 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  )+4);.  if( rc!=
fc40: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
fc50: 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65  rn rc;.  *pOffse
fc60: 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  t += pPager->pag
fc70: 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61  eSize + 4 + isMa
fc80: 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20  inJrnl*4;..  /* 
fc90: 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
fca0: 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68  on the page.  Th
fcb0: 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72  is is more impor
fcc0: 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67  tant that I orig
fcd0: 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75  inally.  ** thou
fce0: 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72  ght.  If a power
fcf0: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
fd00: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
fd10: 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  l is being writt
fd20: 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c  en,.  ** it coul
fd30: 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20  d cause invalid 
fd40: 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74  data to be writt
fd50: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
fd60: 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  nal.  We need to
fd70: 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69  .  ** detect thi
fd80: 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28  s invalid data (
fd90: 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62  with high probab
fda0: 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72  ility) and ignor
fdb0: 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  e it..  */.  if(
fdc0: 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
fdd0: 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
fde0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61  pPager) ){.    a
fdf0: 73 73 65 72 74 28 20 21 69 73 53 61 76 65 70 6e  ssert( !isSavepn
fe00: 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  t );.    return 
fe10: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
fe20: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e  .  if( pgno>(Pgn
fe30: 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  o)pPager->dbSize
fe40: 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65   || sqlite3Bitve
fe50: 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e  cTest(pDone, pgn
fe60: 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  o) ){.    return
fe70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
fe80: 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
fe90: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61   ){.    rc = rea
fea0: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70  d32bits(jfd, (*p
feb0: 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75  Offset)-4, &cksu
fec0: 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  m);.    if( rc )
fed0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
fee0: 69 66 28 20 21 69 73 53 61 76 65 70 6e 74 20 26  if( !isSavepnt &
fef0: 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  & pager_cksum(pP
ff00: 61 67 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61  ager, (u8*)aData
ff10: 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  )!=cksum ){.    
ff20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ff30: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
ff40: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61  .  /* If this pa
ff50: 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ge has already b
ff60: 65 65 6e 20 70 6c 61 79 65 64 20 62 79 20 62 65  een played by be
ff70: 66 6f 72 65 20 64 75 72 69 6e 67 20 74 68 65 20  fore during the 
ff80: 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c  current.  ** rol
ff90: 6c 62 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27  lback, then don'
ffa0: 74 20 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79  t bother to play
ffb0: 20 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a   it back again..
ffc0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65    */.  if( pDone
ffd0: 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65   && (rc = sqlite
ffe0: 33 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65  3BitvecSet(pDone
fff0: 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45  , pgno))!=SQLITE
10000 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
10010 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
10020 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
10030 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
10040 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61  D || pPager->sta
10050 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
10060 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 57 68 65  IVE );..  /* Whe
10070 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 70  n playing back p
10080 61 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20 74  age 1, restore t
10090 68 65 20 6e 52 65 73 65 72 76 65 20 73 65 74 74  he nReserve sett
100a0 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ing.  */.  if( p
100b0 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65 72  gno==1 && pPager
100c0 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75 38  ->nReserve!=((u8
100d0 2a 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a  *)aData)[20] ){.
100e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73      pPager->nRes
100f0 65 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44 61  erve = ((u8*)aDa
10100 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67  ta)[20];.    pag
10110 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61  erReportSize(pPa
10120 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
10130 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
10140 69 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74  in RESERVED stat
10150 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e, then there mu
10160 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20  st be a copy of 
10170 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69  this.  ** page i
10180 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
10190 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
101a0 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20  just update the 
101b0 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a  pager cache,.  *
101c0 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  * not the databa
101d0 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  se file. The pag
101e0 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64  e is left marked
101f0 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63   dirty in this c
10200 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ase..  **.  ** A
10210 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74  n exception to t
10220 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49  he above rule: I
10230 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
10240 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
10250 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67  e.  ** and a pag
10260 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e  e is moved durin
10270 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  g an incremental
10280 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65   vacuum then the
10290 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e   page may.  ** n
102a0 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67  ot be in the pag
102b0 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a  er cache. Later:
102c0 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f   if a malloc() o
102d0 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  r IO error occur
102e0 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20  s.  ** during a 
102f0 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c  Movepage() call,
10300 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
10310 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65  ay not be in the
10320 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68   cache.  ** eith
10330 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69  er. So the condi
10340 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69  tion described i
10350 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61  n the above para
10360 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a  graph is not.  *
10370 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a  * assert()able..
10380 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20    **.  ** If in 
10390 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c  EXCLUSIVE state,
103a0 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20   then we update 
103b0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
103c0 69 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a  if it exists.  *
103d0 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66  * and the main f
103e0 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
103f0 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74   then marked not
10400 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a   dirty..  **.  *
10410 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20  * Ticket #1171: 
10420 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   The statement j
10430 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e  ournal might con
10440 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e  tain page conten
10450 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64  t that is.  ** d
10460 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
10470 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61  e page content a
10480 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
10490 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
104a0 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73    ** This occurs
104b0 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20   when a page is 
104c0 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f  changed prior to
104d0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
104e0 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
104f0 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69  hen changed agai
10500 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  n within the sta
10510 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f  tement.  When ro
10520 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20  lling back such 
10530 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  a.  ** statement
10540 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69   we must not wri
10550 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  te to the origin
10560 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65  al database unle
10570 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20  ss we know.  ** 
10580 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74  for certain that
10590 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
105a0 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63  ontents are sync
105b0 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  ed into the main
105c0 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a   rollback.  ** j
105d0 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69  ournal.  Otherwi
105e0 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73  se, a power loss
105f0 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64   might leave mod
10600 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68  ified data in th
10610 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
10620 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20  file without an 
10630 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c  entry in the rol
10640 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68  lback journal th
10650 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74  at can.  ** rest
10660 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
10670 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
10680 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64   form.  Two cond
10690 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20  itions must be. 
106a0 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77   ** met before w
106b0 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
106c0 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31  tabase files. (1
106d0 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  ) the database m
106e0 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b  ust be.  ** lock
106f0 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77  ed.  (2) we know
10700 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
10710 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  al page content 
10720 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a  is fully synced.
10730 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e    ** in the main
10740 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20   journal either 
10750 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
10760 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
10770 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68   or else.  ** th
10780 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  e page is marked
10790 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e   as needSync==0.
107a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d  .  **.  ** 2008-
107b0 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74  04-14:  When att
107c0 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75  empting to vacuu
107d0 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
107e0 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20  base file, it.  
107f0 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
10800 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65  o fail a stateme
10810 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  nt on a database
10820 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79   that does not y
10830 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44  et exist..  ** D
10840 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
10850 20 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61   write if databa
10860 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65  se file has neve
10870 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20  r been opened.. 
10880 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72 55   */.  if( pagerU
10890 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
108a0 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
108b0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 20 3d  }else{.    pPg =
108c0 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
108d0 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  ager, pgno);.  }
108e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c  .  assert( pPg |
108f0 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 50 41  | !MEMDB );.  PA
10900 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42  GERTRACE(("PLAYB
10910 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68  ACK %d page %d h
10920 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c  ash(%08x) %s\n",
10930 0a 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45  .           PAGE
10940 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
10950 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  o, pager_datahas
10960 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  h(pPager->pageSi
10970 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c  ze, (u8*)aData),
10980 0a 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d  .           (isM
10990 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f  ainJrnl?"main-jo
109a0 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72  urnal":"sub-jour
109b0 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66  nal").  ));.  if
109c0 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a  ( isMainJrnl ){.
109d0 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70      isSynced = p
109e0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c  Pager->noSync ||
109f0 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50   (*pOffset <= pP
10a00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
10a10 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10a20 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d  isSynced = (pPg=
10a30 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66  =0 || 0==(pPg->f
10a40 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45  lags & PGHDR_NEE
10a50 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20  D_SYNC));.  }.  
10a60 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61  if( (pPager->sta
10a70 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
10a80 49 56 45 29 0a 20 20 20 26 26 20 69 73 4f 70 65  IVE).   && isOpe
10a90 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20  n(pPager->fd).  
10aa0 20 26 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29   && isSynced.  )
10ab0 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d  {.    i64 ofst =
10ac0 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
10ad0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
10ae0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21  .    testcase( !
10af0 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 50 67  isSavepnt && pPg
10b00 21 3d 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61  !=0 && (pPg->fla
10b10 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
10b20 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  NC)!=0 );.    as
10b30 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
10b40 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
10b50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10b60 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
10b70 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50  , (u8*)aData, pP
10b80 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
10b90 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70  ofst);.    if( p
10ba0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  gno>pPager->dbFi
10bb0 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
10bc0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
10bd0 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d  ze = pgno;.    }
10be0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
10bf0 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20  >pBackup ){.    
10c00 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
10c10 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c   aData, pgno, 3,
10c20 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
10c30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10c40 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
10c50 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67  ger->pBackup, pg
10c60 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b  no, (u8*)aData);
10c70 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
10c80 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e  ager, aData, pgn
10c90 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f  o, 7, rc=SQLITE_
10ca0 4e 4f 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20  NOMEM, aData);. 
10cb0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
10cc0 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20   !isMainJrnl && 
10cd0 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pPg==0 ){.    /*
10ce0 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72 6f   If this is a ro
10cf0 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65  llback of a save
10d00 70 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77  point and data w
10d10 61 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74  as not written t
10d20 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  o.    ** the dat
10d30 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 70 61  abase and the pa
10d40 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d  ge is not in-mem
10d50 6f 72 79 2c 20 74 68 65 72 65 20 69 73 20 61 20  ory, there is a 
10d60 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a  potential.    **
10d70 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74   problem. When t
10d80 68 65 20 70 61 67 65 20 69 73 20 6e 65 78 74 20  he page is next 
10d90 66 65 74 63 68 65 64 20 62 79 20 74 68 65 20 62  fetched by the b
10da0 2d 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20  -tree layer, it 
10db0 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  .    ** will be 
10dc0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
10dd0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69  tabase file, whi
10de0 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  ch may or may no
10df0 74 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72  t be .    ** cur
10e00 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  rent. .    **.  
10e10 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61    ** There are a
10e20 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65   couple of diffe
10e30 72 65 6e 74 20 77 61 79 73 20 74 68 69 73 20 63  rent ways this c
10e40 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61  an happen. All a
10e50 72 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20  re quite.    ** 
10e60 6f 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75  obscure. When ru
10e70 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f  nning in synchro
10e80 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20  nous mode, this 
10e90 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
10ea0 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70  .    ** if the p
10eb0 61 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72  age is on the fr
10ec0 65 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73  ee-list at the s
10ed0 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
10ee0 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  saction, then.  
10ef0 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20    ** populated, 
10f00 74 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67  then moved using
10f10 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
10f20 65 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a  epage()..    **.
10f30 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74      ** The solut
10f40 69 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e  ion is to add an
10f50 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
10f60 74 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e  to the cache con
10f70 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74  taining.    ** t
10f80 68 65 20 64 61 74 61 20 6a 75 73 74 20 72 65 61  he data just rea
10f90 64 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  d from the sub-j
10fa0 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65  ournal. Mark the
10fb0 20 70 61 67 65 20 61 73 20 64 69 72 74 79 20 0a   page as dirty .
10fc0 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68      ** and if th
10fd0 65 20 70 61 67 65 72 20 72 65 71 75 69 72 65 73  e pager requires
10fe0 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c   a journal-sync,
10ff0 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70   then mark the p
11000 61 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72  age as .    ** r
11010 65 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e  equiring a journ
11020 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69  al-sync before i
11030 74 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20  t is written..  
11040 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
11050 20 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20   isSavepnt );.  
11060 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11070 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30 20  ->doNotSpill==0 
11080 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
11090 6f 4e 6f 74 53 70 69 6c 6c 2b 2b 3b 0a 20 20 20  oNotSpill++;.   
110a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
110b0 65 72 41 63 71 75 69 72 65 28 70 50 61 67 65 72  erAcquire(pPager
110c0 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29  , pgno, &pPg, 1)
110d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
110e0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
110f0 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==1 );.    pPage
11100 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2d 2d 3b  r->doNotSpill--;
11110 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
11120 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
11130 72 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61  rc;.    pPg->fla
11140 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45  gs &= ~PGHDR_NEE
11150 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69  D_READ;.    sqli
11160 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
11170 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69  ty(pPg);.  }.  i
11180 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a  f( pPg ){.    /*
11190 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20   No page should 
111a0 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74  ever be explicit
111b0 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ly rolled back t
111c0 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65  hat is in use, e
111d0 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
111e0 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73   page 1 which is
111f0 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20   held in use in 
11200 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68  order to keep th
11210 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e lock on the.  
11220 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63    ** database ac
11230 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75  tive. However su
11240 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65  ch a page may be
11250 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
11260 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  a result.    ** 
11270 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65  of an internal e
11280 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69  rror resulting i
11290 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63  n an automatic c
112a0 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
112b0 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
112c0 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ck()..    */.   
112d0 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20   void *pData;.  
112e0 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70    pData = pPg->p
112f0 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Data;.    memcpy
11300 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61  (pData, (u8*)aDa
11310 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
11320 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65  Size);.    pPage
11330 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67  r->xReiniter(pPg
11340 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69  );.    if( isMai
11350 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76  nJrnl && (!isSav
11360 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74  epnt || *pOffset
11370 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  <=pPager->journa
11380 6c 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f  lHdr) ){.      /
11390 2a 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  * If the content
113a0 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 77  s of this page w
113b0 65 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65  ere just restore
113c0 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  d from the main 
113d0 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  .      ** journa
113e0 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73  l file, then its
113f0 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65   content must be
11400 20 61 73 20 74 68 65 79 20 77 65 72 65 20 77 68   as they were wh
11410 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  en the .      **
11420 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
11430 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49   first opened. I
11440 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20 63  n this case we c
11450 61 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  an mark the page
11460 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65  .      ** as cle
11470 61 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20  an, since there 
11480 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20  will be no need 
11490 74 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74 20  to write it out 
114a0 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
114b0 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
114c0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72  **.      ** Ther
114d0 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69  e is one excepti
114e0 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e  on to this rule.
114f0 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
11500 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20  being rolled.   
11510 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61     ** back as pa
11520 72 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e  rt of a savepoin
11530 74 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29  t (or statement)
11540 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61   rollback from a
11550 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79  n .      ** unsy
11560 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20  nced portion of 
11570 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
11580 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69   file, then it i
11590 73 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20  s not safe.     
115a0 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20   ** to mark the 
115b0 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54  page as clean. T
115c0 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 6d  his is because m
115d0 61 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20  arking the page 
115e0 61 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61  as.      ** clea
115f0 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65  n will clear the
11600 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
11610 20 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65   flag. Since the
11620 20 70 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a   page is.      *
11630 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
11640 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72   journal file (r
11650 65 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72  ecorded in Pager
11660 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64  .pInJournal) and
11670 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47  .      ** the PG
11680 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
11690 61 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69  ag is cleared, i
116a0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72  f the page is wr
116b0 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a  itten to.      *
116c0 2a 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74  * again within t
116d0 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  his transaction,
116e0 20 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b   it will be mark
116f0 65 64 20 61 73 20 64 69 72 74 79 20 62 75 74 0a  ed as dirty but.
11700 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48        ** the PGH
11710 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
11720 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65  g will not be se
11730 74 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e  t. It could then
11740 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20   potentially.   
11750 20 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e     ** be written
11760 20 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61   out into the da
11770 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f  tabase file befo
11780 72 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66  re its journal f
11790 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67  ile.      ** seg
117a0 6d 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20  ment is synced. 
117b0 49 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72  If a crash occur
117c0 73 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c  s during or foll
117d0 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20  owing this,.    
117e0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f    ** database co
117f0 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73  rruption may ens
11800 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ue..      */.   
11810 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
11820 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
11830 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11840 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
11850 70 50 67 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  pPg);.    }.#ifd
11860 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
11870 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70  PAGES.    pPg->p
11880 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
11890 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
118a0 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20  endif.    /* If 
118b0 74 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c  this was page 1,
118c0 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68   then restore th
118d0 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  e value of Pager
118e0 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20  .dbFileVers..   
118f0 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f   ** Do this befo
11900 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e  re any decoding.
11910 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
11920 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==1 ){.      mem
11930 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
11940 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29  ileVers, &((u8*)
11950 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f  pData)[24],sizeo
11960 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
11970 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  Vers));.    }.. 
11980 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65     /* Decode the
11990 20 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20   page just read 
119a0 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20  from disk */.   
119b0 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
119c0 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
119d0 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
119e0 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74  OMEM);.    sqlit
119f0 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28  e3PcacheRelease(
11a00 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pPg);.  }.  retu
11a10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11a20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65  Parameter zMaste
11a30 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  r is the name of
11a40 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
11a50 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65  l file. A single
11a60 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
11a70 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74   that referred t
11a80 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
11a90 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75  rnal file has ju
11aa0 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  st been rolled b
11ab0 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ack..** This rou
11ac0 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69  tine checks if i
11ad0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
11ae0 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
11af0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  er journal file,
11b00 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20  .** and does so 
11b10 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  if it is..**.** 
11b20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72  Argument zMaster
11b30 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61   may point to Pa
11b40 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53  ger.pTmpSpace. S
11b50 6f 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73  o that buffer is
11b60 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62   not .** availab
11b70 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69  le for use withi
11b80 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  n this function.
11b90 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61  .**.** When a ma
11ba0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
11bb0 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 69 74  e is created, it
11bc0 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
11bd0 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a  th the names .**
11be0 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63   of all of its c
11bf0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f  hild journals, o
11c00 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72  ne after another
11c10 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75  , formatted as u
11c20 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64  tf-8 .** encoded
11c30 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f   text. The end o
11c40 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75  f each child jou
11c50 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72  rnal file is mar
11c60 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e  ked with a .** n
11c70 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79  ul-terminator by
11c80 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20  te (0x00). i.e. 
11c90 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
11ca0 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20  nts of a master 
11cb0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
11cc0 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
11cd0 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20  n involving two 
11ce0 64 61 74 61 62 61 73 65 73 20 6d 69 67 68 74 20  databases might 
11cf0 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f  be:.**.**   "/ho
11d00 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75  me/bill/a.db-jou
11d10 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69  rnal\x00/home/bi
11d20 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c  ll/b.db-journal\
11d30 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73  x00".**.** A mas
11d40 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11d50 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c   may only be del
11d60 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66  eted once all of
11d70 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a   its child .** j
11d80 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65  ournals have bee
11d90 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
11da0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
11db0 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e  on reads the con
11dc0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73  tents of the mas
11dd0 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
11de0 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79   into .** memory
11df0 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75   and loops throu
11e00 67 68 20 65 61 63 68 20 6f 66 20 74 68 65 20 63  gh each of the c
11e10 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  hild journal nam
11e20 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20  es. For.** each 
11e30 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69  child journal, i
11e40 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a  t checks if:.**.
11e50 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68  **   * if the ch
11e60 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ild journal exis
11e70 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a  ts, and if so.**
11e80 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c     * if the chil
11e90 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69  d journal contai
11ea0 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ns a reference t
11eb0 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
11ec0 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d   .**     file zM
11ed0 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61  aster.**.** If a
11ee0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
11ef0 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74  an be found that
11f00 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66   matches both of
11f10 20 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a   the criteria.**
11f20 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e   above, this fun
11f30 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
11f40 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
11f50 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c  hing. Otherwise,
11f60 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63   if.** no such c
11f70 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  hild journal can
11f80 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20   be found, file 
11f90 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65 74  zMaster is delet
11fa0 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66  ed from.** the f
11fb0 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67  ile-system using
11fc0 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
11fd0 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ()..**.** If an 
11fe0 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20  IO error within 
11ff0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
12000 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
12010 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a  returned. This.*
12020 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  * function alloc
12030 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63  ates memory by c
12040 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61  alling sqlite3Ma
12050 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c  lloc(). If an al
12060 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c  location.** fail
12070 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
12080 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
12090 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f  erwise, if no IO
120a0 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72   or malloc error
120b0 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c  s .** occur, SQL
120c0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
120d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20  ed..**.** TODO: 
120e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
120f0 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65  locates a single
12100 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79   block of memory
12110 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20   to load.** the 
12120 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
12130 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
12140 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
12150 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63   could be.** a c
12160 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74  ouple of kilobyt
12170 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e  es or so - poten
12180 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68  tially larger th
12190 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20  an the page .** 
121a0 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
121b0 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  int pager_delmas
121c0 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
121d0 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
121e0 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74  Master){.  sqlit
121f0 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
12200 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
12210 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
12220 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
12230 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn code */.  sql
12240 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74  ite3_file *pMast
12250 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  er;    /* Malloc
12260 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  'd master-journa
12270 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
12280 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  r */.  sqlite3_f
12290 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20  ile *pJournal;  
122a0 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69   /* Malloc'd chi
122b0 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ld-journal file 
122c0 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
122d0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75  char *zMasterJou
122e0 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e  rnal = 0; /* Con
122f0 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20  tents of master 
12300 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
12310 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75    i64 nMasterJou
12320 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53  rnal;       /* S
12330 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ize of master jo
12340 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
12350 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20  char *zJournal; 
12360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
12370 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72  nter to one jour
12380 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69  nal within MJ fi
12390 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  le */.  char *zM
123a0 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20  asterPtr;       
123b0 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f    /* Space to ho
123c0 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66  ld MJ filename f
123d0 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  rom a journal fi
123e0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73  le */.  int nMas
123f0 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20  terPtr;         
12400 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73    /* Amount of s
12410 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74  pace allocated t
12420 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a  o zMasterPtr[] *
12430 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
12440 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20   space for both 
12450 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64  the pJournal and
12460 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65   pMaster file de
12470 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20  scriptors..  ** 
12480 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  If successful, o
12490 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
124a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
124b0 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  reading..  */.  
124c0 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74  pMaster = (sqlit
124d0 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65  e3_file *)sqlite
124e0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73  3MallocZero(pVfs
124f0 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b  ->szOsFile * 2);
12500 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73  .  pJournal = (s
12510 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28  qlite3_file *)((
12520 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b  (u8 *)pMaster) +
12530 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29   pVfs->szOsFile)
12540 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72  ;.  if( !pMaster
12550 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
12560 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
12570 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  se{.    const in
12580 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
12590 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
125a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
125b0 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  ER_JOURNAL);.   
125c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
125d0 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  pen(pVfs, zMaste
125e0 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67  r, pMaster, flag
125f0 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  s, 0);.  }.  if(
12600 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12610 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
12620 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20  out;..  /* Load 
12630 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
12640 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
12650 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
12660 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c  ed from.  ** sql
12670 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e  ite3_malloc() an
12680 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  d pointed to by 
12690 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20  zMasterJournal. 
126a0 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20    Also obtain.  
126b0 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  ** sufficient sp
126c0 61 63 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50  ace (in zMasterP
126d0 74 72 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  tr) to hold the 
126e0 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a  names of master.
126f0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
12700 65 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  es extracted fro
12710 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61  m regular rollba
12720 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a  ck-journals..  *
12730 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
12740 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74  OsFileSize(pMast
12750 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72  er, &nMasterJour
12760 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  nal);.  if( rc!=
12770 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
12780 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
12790 20 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70    nMasterPtr = p
127a0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
127b0 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  1;.  zMasterJour
127c0 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  nal = sqlite3Mal
127d0 6c 6f 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72  loc((int)nMaster
127e0 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65  Journal + nMaste
127f0 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28  rPtr + 1);.  if(
12800 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   !zMasterJournal
12810 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
12820 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
12830 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
12840 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  t;.  }.  zMaster
12850 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f  Ptr = &zMasterJo
12860 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75  urnal[nMasterJou
12870 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20  rnal+1];.  rc = 
12880 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d  sqlite3OsRead(pM
12890 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f  aster, zMasterJo
128a0 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73  urnal, (int)nMas
128b0 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  terJournal, 0);.
128c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
128d0 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
128e0 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73  ster_out;.  zMas
128f0 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74  terJournal[nMast
12900 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a  erJournal] = 0;.
12910 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d  .  zJournal = zM
12920 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20  asterJournal;.  
12930 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c  while( (zJournal
12940 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  -zMasterJournal)
12950 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  <nMasterJournal 
12960 29 7b 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74  ){.    int exist
12970 73 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  s;.    rc = sqli
12980 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
12990 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  , zJournal, SQLI
129a0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
129b0 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20  , &exists);.    
129c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
129d0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
129e0 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
129f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69     }.    if( exi
12a00 73 74 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  sts ){.      /* 
12a10 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
12a20 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
12a30 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
12a40 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
12a50 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e     ** Open it an
12a60 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f  d check if it po
12a70 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74  ints at the mast
12a80 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  er journal. If. 
12a90 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75       ** so, retu
12aa0 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74  rn without delet
12ab0 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
12ac0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
12ad0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
12ae0 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61  c;.      int fla
12af0 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs = (SQLITE_OPE
12b00 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
12b10 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
12b20 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  NAL);.      rc =
12b30 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
12b40 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70  Vfs, zJournal, p
12b50 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20  Journal, flags, 
12b60 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
12b70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
12b80 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
12b90 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
12ba0 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72   }..      rc = r
12bb0 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
12bc0 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74  (pJournal, zMast
12bd0 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74  erPtr, nMasterPt
12be0 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
12bf0 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61  3OsClose(pJourna
12c00 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  l);.      if( rc
12c10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
12c20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
12c30 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
12c40 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d   }..      c = zM
12c50 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26  asterPtr[0]!=0 &
12c60 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72  & strcmp(zMaster
12c70 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30  Ptr, zMaster)==0
12c80 3b 0a 20 20 20 20 20 20 69 66 28 20 63 20 29 7b  ;.      if( c ){
12c90 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68  .        /* We h
12ca0 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20  ave a match. Do 
12cb0 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
12cc0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
12cd0 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67  le. */.        g
12ce0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
12cf0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
12d00 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d  .    zJournal +=
12d10 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33   (sqlite3Strlen3
12d20 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a  0(zJournal)+1);.
12d30 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f    }. .  sqlite3O
12d40 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b  sClose(pMaster);
12d50 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
12d60 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
12d70 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d  aster, 0);..delm
12d80 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c  aster_out:.  sql
12d90 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65  ite3_free(zMaste
12da0 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  rJournal);.  if(
12db0 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20   pMaster ){.    
12dc0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
12dd0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73  Master);.    ass
12de0 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f  ert( !isOpen(pJo
12df0 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71  urnal) );.    sq
12e00 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74  lite3_free(pMast
12e10 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
12e20 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
12e30 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
12e40 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20   used to change 
12e50 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20  the actual size 
12e60 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
12e70 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20  .** file in the 
12e80 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69  file-system. Thi
12e90 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77  s only happens w
12ea0 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  hen committing a
12eb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a   transaction,.**
12ec0 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   or rolling back
12ed0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28   a transaction (
12ee0 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e  including rollin
12ef0 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  g back a hot-jou
12f00 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rnal)..**.** If 
12f10 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
12f20 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70  e file is not op
12f30 65 6e 2c 20 6f 72 20 61 6e 20 65 78 63 6c 75 73  en, or an exclus
12f40 69 76 65 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a  ive lock is not.
12f50 2a 2a 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75  ** held, this fu
12f60 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
12f70 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  p. Otherwise, th
12f80 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
12f90 6c 65 20 69 73 0a 2a 2a 20 63 68 61 6e 67 65 64  le is.** changed
12fa0 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20   to nPage pages 
12fb0 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70  (nPage*pPager->p
12fc0 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20  ageSize bytes). 
12fd0 49 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 6f  If the file.** o
12fe0 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e  n disk is curren
12ff0 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  tly larger than 
13000 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65  nPage pages, the
13010 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a  n use the VFS.**
13020 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74   xTruncate() met
13030 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20  hod to truncate 
13040 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74  it..**.** Or, it
13050 20 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65 20   might might be 
13060 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68  the case that th
13070 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
13080 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a  s smaller than .
13090 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  ** nPage pages. 
130a0 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73  Some operating s
130b0 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61  ystem implementa
130c0 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f  tions can get co
130d0 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f  nfused if .** yo
130e0 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74  u try to truncat
130f0 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65  e a file to some
13100 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61   size that is la
13110 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a  rger than it .**
13120 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73   currently is, s
13130 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61  o detect this ca
13140 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73  se and write a s
13150 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20  ingle zero byte 
13160 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f  to .** the end o
13170 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69  f the new file i
13180 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
13190 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
131a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  urn SQLITE_OK. I
131b0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
131c0 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66  curs while modif
131d0 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61  ying.** the data
131e0 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72  base file, retur
131f0 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
13200 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
13210 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
13220 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
13230 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
13240 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
13250 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
13260 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
13270 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
13280 49 56 45 20 26 26 20 69 73 4f 70 65 6e 28 70 50  IVE && isOpen(pP
13290 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
132a0 20 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65   i64 currentSize
132b0 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 2f  , newSize;.    /
132c0 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61  * TODO: Is it sa
132d0 66 65 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e  fe to use Pager.
132e0 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f  dbFileSize here?
132f0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
13300 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
13310 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72  Pager->fd, &curr
13320 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65  entSize);.    ne
13330 77 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  wSize = pPager->
13340 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50  pageSize*(i64)nP
13350 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  age;.    if( rc=
13360 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75  =SQLITE_OK && cu
13370 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69  rrentSize!=newSi
13380 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ze ){.      if( 
13390 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53  currentSize>newS
133a0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ize ){.        r
133b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
133c0 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64  ncate(pPager->fd
133d0 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20  , newSize);.    
133e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
133f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
13400 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
13410 20 22 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d   "", 1, newSize-
13420 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
13430 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13440 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
13450 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
13460 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
13470 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
13480 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13490 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
134a0 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65   of the Pager.se
134b0 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
134c0 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
134d0 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f  ** pager based o
134e0 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
134f0 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
13500 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a  torSize method.*
13510 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61  * of the open da
13520 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
13530 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
13540 6c 20 62 65 20 75 73 65 64 20 75 73 65 64 20 0a  l be used used .
13550 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
13560 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69  the size and ali
13570 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61  gnment of journa
13580 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a  l header and .**
13590 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
135a0 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20  pointers within 
135b0 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20  created journal 
135c0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  files..**.** For
135d0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
135e0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
135f0 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c  ector size is al
13600 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a  ways 512 bytes..
13610 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
13620 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61   for non-tempora
13630 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66  ry files, the ef
13640 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
13650 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61  ize is.** the va
13660 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
13670 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28  the xSectorSize(
13680 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64  ) method rounded
13690 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20   up to 32 if.** 
136a0 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  it is less than 
136b0 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64  32, or rounded d
136c0 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f  own to MAX_SECTO
136d0 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20  R_SIZE if it.** 
136e0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
136f0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e  MAX_SECTOR_SIZE.
13700 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13710 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61  setSectorSize(Pa
13720 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
13730 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
13740 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
13750 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
13760 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ;..  if( !pPager
13770 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
13780 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65    /* Sector size
13790 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
137a0 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
137b0 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66  les. Also, the f
137c0 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  ile.    ** may n
137d0 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ot have been ope
137e0 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63  ned yet, in whic
137f0 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63  h case the OsSec
13800 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
13810 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61   call will segfa
13820 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ult..    */.    
13830 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
13840 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  ze = sqlite3OsSe
13850 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d  ctorSize(pPager-
13860 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  >fd);.  }.  if( 
13870 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
13880 7a 65 3c 33 32 20 29 7b 0a 20 20 20 20 70 50 61  ze<32 ){.    pPa
13890 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
138a0 3d 20 35 31 32 3b 0a 20 20 7d 0a 20 20 69 66 28  = 512;.  }.  if(
138b0 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
138c0 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ize>MAX_SECTOR_S
138d0 49 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72  IZE ){.    asser
138e0 74 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  t( MAX_SECTOR_SI
138f0 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 70  ZE>=512 );.    p
13900 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
13910 65 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  e = MAX_SECTOR_S
13920 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  IZE;.  }.}../*.*
13930 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a  * Playback the j
13940 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20  ournal and thus 
13950 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
13960 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20  base file to.** 
13970 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73  the state it was
13980 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74   in before we st
13990 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61  arted making cha
139a0 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  nges.  .**.** Th
139b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
139c0 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c  ormat is as foll
139d0 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29  ows: .**.**  (1)
139e0 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e    8 byte prefix.
139f0 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75    A copy of aJou
13a00 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20  rnalMagic[]..** 
13a10 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67   (2)  4 byte big
13a20 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
13a30 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
13a40 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67  ber of valid pag
13a50 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20  e records.**    
13a60 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61     in the journa
13a70 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75  l.  If this valu
13a80 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  e is 0xffffffff,
13a90 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68   then compute th
13aa0 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65  e.**       numbe
13ab0 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
13ac0 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  s from the journ
13ad0 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29  al size..**  (3)
13ae0 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
13af0 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
13b00 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  h is the initial
13b10 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a   value for the .
13b20 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20  **       sanity 
13b30 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34  checksum..**  (4
13b40 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65  )  4 byte intege
13b50 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
13b60 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
13b70 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  o truncate the.*
13b80 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65  *       database
13b90 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c   to during a rol
13ba0 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20  lback..**  (5)  
13bb0 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
13bc0 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
13bd0 69 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  is the sector si
13be0 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a  ze.  The header.
13bf0 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68 69 73  **       is this
13c00 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73   many bytes in s
13c10 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20  ize..**  (6)  4 
13c20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
13c30 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
13c40 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a   the page size..
13c50 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61  **  (7)  zero pa
13c60 64 64 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65  dding out to the
13c70 20 6e 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a   next sector siz
13c80 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f  e..**  (8)  Zero
13c90 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69   or more pages i
13ca0 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61  nstances, each a
13cb0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20  s follows:.**   
13cc0 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70       +  4 byte p
13cd0 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20  age number..**  
13ce0 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d        +  pPager-
13cf0 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
13d00 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20  of data..**     
13d10 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65     +  4 byte che
13d20 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  cksum.**.** When
13d30 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65   we speak of the
13d40 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
13d50 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72   we mean the fir
13d60 73 74 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65  st 7 items above
13d70 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20  ..** Each entry 
13d80 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
13d90 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
13da0 20 74 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a   the 8th item..*
13db0 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61  *.** Call the va
13dc0 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63  lue from the sec
13dd0 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63  ond bullet "nRec
13de0 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20  ".  nRec is the 
13df0 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c  number of.** val
13e00 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20  id page entries 
13e10 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
13e20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20   In most cases, 
13e30 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20  you can compute 
13e40 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
13e50 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69  nRec from the si
13e60 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
13e70 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20  l file.  But if 
13e80 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  a power.** failu
13e90 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
13ea0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  e the journal wa
13eb0 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
13ec0 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65   it could be the
13ed0 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68  .** case that th
13ee0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
13ef0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61  urnal file had a
13f00 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
13f10 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65  eased but.** the
13f20 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68   extra entries h
13f30 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20  ad not yet made 
13f40 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73  it safely to dis
13f50 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61  k.  In such a ca
13f60 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  se,.** the value
13f70 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65   of nRec compute
13f80 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  d from the file 
13f90 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  size would be to
13fa0 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a  o large.  For.**
13fb0 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65   that reason, we
13fc0 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
13fd0 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68  nRec value in th
13fe0 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
13ff0 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  If the nRec valu
14000 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20  e is 0xffffffff 
14010 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52  it means that nR
14020 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ec should be com
14030 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68  puted.** from th
14040 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68  e file size.  Th
14050 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  is value is used
14060 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73   when the user s
14070 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f  elects the.** no
14080 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72  -sync option for
14090 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
140a0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
140b0 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72  ould lead to cor
140c0 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  ruption.** in th
140d0 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f  is case.  But fo
140e0 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65  r things like te
140f0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77  mporary table (w
14100 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  hich will be.** 
14110 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
14120 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
14130 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72  ed) we don't car
14140 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e.  .**.** If th
14150 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73  e file opened as
14160 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
14170 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d  e is not a well-
14180 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61  formed.** journa
14190 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20  l file then all 
141a0 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20  pages up to the 
141b0 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20  first corrupted 
141c0 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a  page are rolled.
141d0 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70  ** back (or no p
141e0 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72  ages if the jour
141f0 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f  nal header is co
14200 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f  rrupted). The jo
14210 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
14220 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e   then deleted an
14230 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
14240 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66  rned, just as if
14250 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68   no corruption h
14260 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75  ad.** been encou
14270 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntered..**.** If
14280 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f   an I/O or mallo
14290 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73  c() error occurs
142a0 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69  , the journal-fi
142b0 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65  le is not delete
142c0 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  d.** and an erro
142d0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
142e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  ed..**.** The is
142f0 48 6f 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e  Hot parameter in
14300 64 69 63 61 74 65 73 20 74 68 61 74 20 77 65 20  dicates that we 
14310 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f  are trying to ro
14320 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  llback a journal
14330 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62  .** that might b
14340 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e  e a hot journal.
14350 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62    Or, it could b
14360 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
14370 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72  al is .** preser
14380 76 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a  ved because of J
14390 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
143a0 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44  ST or JOURNALMOD
143b0 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49  E_TRUNCATE..** I
143c0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
143d0 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73  ally is hot, res
143e0 65 74 20 74 68 65 20 70 61 67 65 72 20 63 61 63  et the pager cac
143f0 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67  he prior rolling
14400 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e  .** back any con
14410 74 65 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f  tent.  If the jo
14420 75 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20  urnal is merely 
14430 70 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72  persistent, no r
14440 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65  eset is.** neede
14450 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
14460 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
14470 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
14480 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c  nt isHot){.  sql
14490 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
144a0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
144b0 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
144c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
144d0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
144e0 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
144f0 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20  /.  u32 nRec;   
14500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14510 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
14520 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
14530 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20   */.  u32 u;    
14540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14550 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
14560 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e  counter */.  Pgn
14570 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20  o mxPg = 0;     
14580 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
14590 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69   the original fi
145a0 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20  le in pages */. 
145b0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
145c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
145d0 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75  ult code of a su
145e0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
145f0 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20  t res = 1;      
14600 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
14610 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
14620 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f  te3OsAccess() */
14630 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
14640 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
14650 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ame of master jo
14660 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e  urnal file if an
14670 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50  y */.  int needP
14680 61 67 65 72 52 65 73 65 74 3b 20 20 20 20 20 20  agerReset;      
14690 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74  /* True to reset
146a0 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66   page prior to f
146b0 69 72 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61  irst page rollba
146c0 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ck */..  /* Figu
146d0 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
146e0 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
146f0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f  he journal.  Abo
14700 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a  rt early if.  **
14710 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
14720 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73  empty..  */.  as
14730 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
14740 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72  ger->jfd) );.  r
14750 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
14760 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
14770 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  d, &szJ);.  if( 
14780 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
14790 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67   szJ==0 ){.    g
147a0 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
147b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  ;.  }..  /* Read
147c0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
147d0 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  nal name from th
147e0 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74  e journal, if it
147f0 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a   is present..  *
14800 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
14810 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
14820 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75  is specified, bu
14830 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f  t the file is no
14840 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f  t.  ** present o
14850 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65  n disk, then the
14860 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20   journal is not 
14870 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  hot and does not
14880 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a   need to be.  **
14890 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20   played back..  
148a0 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65  **.  ** TODO: Te
148b0 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f  chnically the fo
148c0 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72  llowing is an er
148d0 72 6f 72 20 62 65 63 61 75 73 65 20 69 74 20 61  ror because it a
148e0 73 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a  ssumes that.  **
148f0 20 62 75 66 66 65 72 20 50 61 67 65 72 2e 70 54   buffer Pager.pT
14900 6d 70 53 70 61 63 65 20 69 73 20 28 6d 78 50 61  mpSpace is (mxPa
14910 74 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20  thname+1) bytes 
14920 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20  or larger. i.e. 
14930 74 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65  that.  ** (pPage
14940 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70  r->pageSize >= p
14950 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
14960 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e  athname+1). Usin
14970 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a  g os_unix.c,.  *
14980 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73  *  mxPathname is
14990 20 35 31 32 2c 20 77 68 69 63 68 20 69 73 20 74   512, which is t
149a0 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d  he same as the m
149b0 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65  inimum allowable
149c0 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20   value.  ** for 
149d0 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20  pageSize..  */. 
149e0 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65   zMaster = pPage
149f0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
14a00 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
14a10 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
14a20 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  fd, zMaster, pPa
14a30 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
14a40 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20  hname+1);.  if( 
14a50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
14a60 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20   zMaster[0] ){. 
14a70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
14a80 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d  sAccess(pVfs, zM
14a90 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43  aster, SQLITE_AC
14aa0 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65  CESS_EXISTS, &re
14ab0 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65  s);.  }.  zMaste
14ac0 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21  r = 0;.  if( rc!
14ad0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72  =SQLITE_OK || !r
14ae0 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  es ){.    goto e
14af0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
14b00 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
14b10 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65  alOff = 0;.  nee
14b20 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 69 73  dPagerReset = is
14b30 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  Hot;..  /* This 
14b40 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20  loop terminates 
14b50 65 69 74 68 65 72 20 77 68 65 6e 20 61 20 72 65  either when a re
14b60 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f  adJournalHdr() o
14b70 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c  r .  ** pager_pl
14b80 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
14b90 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53  ) call returns S
14ba0 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
14bb0 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20   IO error .  ** 
14bc0 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20  occurs. .  */.  
14bd0 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
14be0 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74  /* Read the next
14bf0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
14c00 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
14c10 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
14c20 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20   are.    ** not 
14c30 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66  enough bytes lef
14c40 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
14c50 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70   file for a comp
14c60 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a  lete header, or.
14c70 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72      ** it is cor
14c80 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70  rupted, then a p
14c90 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66  rocess must of f
14ca0 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74  ailed while writ
14cb0 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54  ing it..    ** T
14cc0 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f  his indicates no
14cd0 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73  thing more needs
14ce0 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
14cf0 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ck..    */.    r
14d00 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
14d10 64 72 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74  dr(pPager, isHot
14d20 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d  , szJ, &nRec, &m
14d30 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  xPg);.    if( rc
14d40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a  !=SQLITE_OK ){ .
14d50 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
14d60 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
14d70 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
14d80 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
14d90 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
14da0 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  back;.    }..   
14db0 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30   /* If nRec is 0
14dc0 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
14dd0 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
14de0 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
14df0 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72  ocess.    ** wor
14e00 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  king in no-sync 
14e10 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73  mode. This means
14e20 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f   that the rest o
14e30 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  f the journal.  
14e40 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73    ** file consis
14e50 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65  ts of pages, the
14e60 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a  re are no more j
14e70 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20  ournal headers. 
14e80 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74  Compute.    ** t
14e90 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
14ea0 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61   based on this a
14eb0 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a  ssumption..    *
14ec0 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
14ed0 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20  0xffffffff ){.  
14ee0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
14ef0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
14f00 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
14f10 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
14f20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a  nRec = (int)((sz
14f30 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  J - JOURNAL_HDR_
14f40 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52  SZ(pPager))/JOUR
14f50 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
14f60 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
14f70 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61  * If nRec is 0 a
14f80 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b  nd this rollback
14f90 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63   is of a transac
14fa0 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20  tion created by 
14fb0 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63  this.    ** proc
14fc0 65 73 73 20 61 6e 64 20 69 66 20 74 68 69 73 20  ess and if this 
14fd0 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61  is the final hea
14fe0 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  der in the journ
14ff0 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e  al, then it mean
15000 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68  s.    ** that th
15010 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a  is part of the j
15020 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
15030 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20   filled but has 
15040 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20  not yet been.   
15050 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69   ** synced to di
15060 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65  sk.  Compute the
15070 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
15080 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65   based on the re
15090 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73  maining.    ** s
150a0 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  ize of the file.
150b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
150c0 68 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66  he third term of
150d0 20 74 68 65 20 74 65 73 74 20 77 61 73 20 61 64   the test was ad
150e0 64 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65  ded to fix ticke
150f0 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20  t #2565..    ** 
15100 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  When rolling bac
15110 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c  k a hot journal,
15120 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20   nRec==0 always 
15130 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e  means that the n
15140 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b  ext.    ** chunk
15150 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
15160 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61  contains zero pa
15170 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  ges to be rolled
15180 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20   back.  But.    
15190 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20  ** when doing a 
151a0 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65  ROLLBACK and the
151b0 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69   nRec==0 chunk i
151c0 73 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b  s the last chunk
151d0 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a   in.    ** the j
151e0 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73  ournal, it means
151f0 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
15200 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
15210 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a  additional.    *
15220 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e 65 65  * pages that nee
15230 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  d to be rolled b
15240 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65  ack and that the
15250 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
15260 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20   .    ** should 
15270 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65  be computed base
15280 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
15290 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20   file size..    
152a0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
152b0 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a  =0 && !isHot &&.
152c0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
152d0 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
152e0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
152f0 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
15300 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e  alOff ){.      n
15310 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a  Rec = (int)((szJ
15320 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
15330 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c  alOff) / JOURNAL
15340 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
15350 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
15360 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
15370 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20  rst header read 
15380 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
15390 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
153a0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
153b0 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20  ile back to its 
153c0 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
153d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
153e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
153f0 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
15400 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
15410 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
15420 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78  ncate(pPager, mx
15430 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
15440 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15450 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
15460 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
15470 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
15480 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a  >dbSize = mxPg;.
15490 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
154a0 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  py original page
154b0 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75  s out of the jou
154c0 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e  rnal and back in
154d0 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64  to the .    ** d
154e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
154f0 2f 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a  /or page cache..
15500 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75      */.    for(u
15510 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29  =0; u<nRec; u++)
15520 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64  {.      if( need
15530 50 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20  PagerReset ){.  
15540 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
15550 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
15560 20 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65     needPagerRese
15570 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
15580 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
15590 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
155a0 65 28 70 50 61 67 65 72 2c 26 70 50 61 67 65 72  e(pPager,&pPager
155b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31  ->journalOff,0,1
155c0 2c 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ,0);.      if( r
155d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
155e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
155f0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
15600 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
15610 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
15620 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
15630 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20  alOff = szJ;.   
15640 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
15650 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
15660 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
15670 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
15680 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
15690 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62  he journal has b
156a0 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73  een truncated, s
156b0 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69  imply stop readi
156c0 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ng and.         
156d0 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74   ** processing t
156e0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73  he journal. This
156f0 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69 66   might happen if
15700 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
15710 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  .          ** no
15720 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69  t completely wri
15730 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20  tten and synced 
15740 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68  prior to a crash
15750 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20  .  In that.     
15760 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68       ** case, th
15770 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  e database shoul
15780 64 20 68 61 76 65 20 6e 65 76 65 72 20 62 65 65  d have never bee
15790 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65  n written in the
157a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69  .          ** fi
157b0 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20  rst place so it 
157c0 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20  is OK to simply 
157d0 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c  abandon the roll
157e0 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  back. */.       
157f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
15800 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          got
15810 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
15820 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
15830 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
15840 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
15850 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61  rollback, quit a
15860 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  nd return the er
15870 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ror.          **
15880 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c   code.  This wil
15890 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65  l cause the page
158a0 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65  r to enter the e
158b0 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20  rror state.     
158c0 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20       ** so that 
158d0 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d 20  no further harm 
158e0 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50  will be done.  P
158f0 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a  erhaps the next.
15900 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
15910 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f  cess to come alo
15920 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20  ng will be able 
15930 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
15940 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
15950 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
15960 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
15970 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
15980 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
15990 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f    /*NOTREACHED*/
159a0 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
159b0 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
159c0 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20   /* Following a 
159d0 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61  rollback, the da
159e0 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75  tabase file shou
159f0 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74  ld be back in it
15a00 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  s original.  ** 
15a10 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74  state prior to t
15a20 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
15a30 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20  transaction, so 
15a40 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20  invoke the.  ** 
15a50 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
15a60 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63  UNCHANGED file-c
15a70 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f  ontrol method to
15a80 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a   disable the.  *
15a90 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74  * assertion that
15aa0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
15ab0 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64   counter was mod
15ac0 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  ified..  */.  as
15ad0 73 65 72 74 28 0a 20 20 20 20 70 50 61 67 65 72  sert(.    pPager
15ae0 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d  ->fd->pMethods==
15af0 30 20 7c 7c 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ||.    sqlite3
15b00 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50  OsFileControl(pP
15b10 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f  ager->fd,SQLITE_
15b20 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
15b30 45 44 2c 30 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b  ED,0)>=SQLITE_OK
15b40 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  .  );..  /* If t
15b50 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20  his playback is 
15b60 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61  happening automa
15b70 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73  tically as a res
15b80 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20  ult of an IO or 
15b90 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72  .  ** malloc err
15ba0 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72 65 64  or that occurred
15bb0 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67   after the chang
15bc0 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70  e-counter was up
15bd0 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20  dated but .  ** 
15be0 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
15bf0 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69  action was commi
15c00 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63  tted, then the c
15c10 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20  hange-counter . 
15c20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e   ** modification
15c30 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20 62   may just have b
15c40 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66  een reverted. If
15c50 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   this happens in
15c60 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a   exclusive .  **
15c70 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73   mode, then subs
15c80 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69  equent transacti
15c90 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79  ons performed by
15ca0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
15cb0 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70  will not.  ** up
15cc0 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d  date the change-
15cd0 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20  counter at all. 
15ce0 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f  This may lead to
15cf0 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74   cache inconsist
15d00 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65  ency.  ** proble
15d10 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f  ms for other pro
15d20 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70  cesses at some p
15d30 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
15d40 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a  re. So, just.  *
15d50 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68  * in case this h
15d60 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65  as happened, cle
15d70 61 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75  ar the changeCou
15d80 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e  ntDone flag now.
15d90 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
15da0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
15db0 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
15dc0 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  le;..  if( rc==S
15dd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15de0 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72  zMaster = pPager
15df0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
15e00 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
15e10 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
15e20 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
15e30 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
15e40 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74  thname+1);.    t
15e50 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
15e60 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20  ITE_OK );.  }.  
15e70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15e80 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53  K && pPager->noS
15e90 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72  ync==0 && pPager
15ea0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
15eb0 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20  XCLUSIVE ){.    
15ec0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
15ed0 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  nc(pPager->fd, p
15ee0 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
15ef0 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  s);.  }.  if( rc
15f00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
15f10 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30  Pager->noSync==0
15f20 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74   && pPager->stat
15f30 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
15f40 56 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  VE ){.    rc = s
15f50 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
15f60 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
15f70 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
15f80 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
15f90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
15fa0 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
15fb0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
15fc0 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27  zMaster[0]!='\0'
15fd0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
15fe0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15ff0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
16000 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
16010 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29  ster[0] && res )
16020 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
16030 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a  e was a master j
16040 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20  ournal and this 
16050 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
16060 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20  urn success,.   
16070 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
16080 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
16090 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
160a0 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20  ournal..    */. 
160b0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65     rc = pager_de
160c0 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20  lmaster(pPager, 
160d0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65  zMaster);.    te
160e0 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
160f0 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20  TE_OK );.  }..  
16100 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63  /* The Pager.sec
16110 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65  torSize variable
16120 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75   may have been u
16130 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c  pdated while rol
16140 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61  ling.  ** back a
16150 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64   journal created
16160 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69   by a process wi
16170 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73  th a different s
16180 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20  ector size.  ** 
16190 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20  value. Reset it 
161a0 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76  to the correct v
161b0 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72  alue for this pr
161c0 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65  ocess..  */.  se
161d0 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
161e0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
161f0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ;.}.../*.** Read
16200 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72   the content for
16210 20 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66   page pPg out of
16220 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16230 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20  le and into .** 
16240 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68  pPg->pData. A sh
16250 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65  ared lock or gre
16260 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c  ater must be hel
16270 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
16280 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65  e.** file before
16290 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
162a0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
162b0 49 66 20 70 61 67 65 20 31 20 69 73 20 72 65 61  If page 1 is rea
162c0 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  d, then the valu
162d0 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c  e of Pager.dbFil
162e0 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74  eVers[] is set t
162f0 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72  o.** the value r
16300 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
16310 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
16320 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
16330 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68   occurs, then th
16340 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65  e IO error is re
16350 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
16360 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  ller..** Otherwi
16370 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  se, SQLITE_OK is
16380 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
16390 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50  atic int readDbP
163a0 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
163b0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
163c0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20   = pPg->pPager; 
163d0 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
163e0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
163f0 70 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67  page pPg */.  Pg
16400 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70  no pgno = pPg->p
16410 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61  gno;       /* Pa
16420 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61  ge number to rea
16430 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  d */.  int rc = 
16440 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
16450 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
16460 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e  de */.  int isIn
16470 57 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Wal = 0;        
16480 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
16490 70 61 67 65 20 69 73 20 69 6e 20 6c 6f 67 20 66  page is in log f
164a0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73  ile */.  int pgs
164b0 7a 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  z = pPager->page
164c0 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20  Size; /* Number 
164d0 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61 64  of bytes to read
164e0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
164f0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
16500 47 45 52 5f 53 48 41 52 45 44 20 26 26 20 21 4d  GER_SHARED && !M
16510 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
16520 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
16530 3e 66 64 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e  >fd) );..  if( N
16540 45 56 45 52 28 21 69 73 4f 70 65 6e 28 70 50 61  EVER(!isOpen(pPa
16550 67 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20  ger->fd)) ){.   
16560 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16570 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
16580 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61   memset(pPg->pDa
16590 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  ta, 0, pPager->p
165a0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 65  ageSize);.    re
165b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
165c0 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72    }..  if( pager
165d0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
165e0 7b 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20  {.    /* Try to 
165f0 70 75 6c 6c 20 74 68 65 20 70 61 67 65 20 66 72  pull the page fr
16600 6f 6d 20 74 68 65 20 77 72 69 74 65 2d 61 68 65  om the write-ahe
16610 61 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72  ad log. */.    r
16620 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65  c = sqlite3WalRe
16630 61 64 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  ad(pPager->pWal,
16640 20 70 67 6e 6f 2c 20 26 69 73 49 6e 57 61 6c 2c   pgno, &isInWal,
16650 20 70 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74   pgsz, pPg->pDat
16660 61 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  a);.  }.  if( rc
16670 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
16680 69 73 49 6e 57 61 6c 20 29 7b 0a 20 20 20 20 69  isInWal ){.    i
16690 36 34 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67  64 iOffset = (pg
166a0 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
166b0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
166c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
166d0 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
166e0 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a  pPg->pData, pgsz
166f0 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
16700 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
16710 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
16720 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
16730 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
16740 20 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   }..  if( pgno==
16750 31 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20  1 ){.    if( rc 
16760 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
16770 68 65 20 72 65 61 64 20 69 73 20 75 6e 73 75 63  he read is unsuc
16780 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65  cessful, set the
16790 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f   dbFileVers[] to
167a0 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20   something.     
167b0 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65   ** that will ne
167c0 76 65 72 20 62 65 20 61 20 76 61 6c 69 64 20 66  ver be a valid f
167d0 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62  ile version.  db
167e0 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20  FileVers[] is a 
167f0 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66  copy.      ** of
16800 20 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66   bytes 24..39 of
16810 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
16820 42 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f  Bytes 28..31 sho
16830 75 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20  uld always be.  
16840 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74      ** zero or t
16850 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
16860 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e  atabase in page.
16870 20 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e   Bytes 32..35 an
16880 64 20 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a  d 35..39.      *
16890 2a 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65  * should be page
168a0 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61   numbers which a
168b0 72 65 20 6e 65 76 65 72 20 30 78 66 66 66 66 66  re never 0xfffff
168c0 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67  fff.  So filling
168d0 0a 20 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72  .      ** pPager
168e0 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77  ->dbFileVers[] w
168f0 69 74 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74  ith all 0xff byt
16900 65 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63  es should suffic
16910 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
16920 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72    ** For an encr
16930 79 70 74 65 64 20 64 61 74 61 62 61 73 65 2c 20  ypted database, 
16940 74 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73  the situation is
16950 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20   more complex:  
16960 62 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32  bytes.      ** 2
16970 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74  4..39 of the dat
16980 61 62 61 73 65 20 61 72 65 20 77 68 69 74 65 20  abase are white 
16990 6e 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65 20  noise.  But the 
169a0 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20  probability of. 
169b0 20 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f       ** white no
169c0 69 73 69 6e 67 20 65 71 75 61 6c 69 6e 67 20 31  ising equaling 1
169d0 36 20 62 79 74 65 73 20 6f 66 20 30 78 66 66 20  6 bytes of 0xff 
169e0 69 73 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73  is vanishingly s
169f0 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a  mall so.      **
16a00 20 77 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c   we should still
16a10 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f   be ok..      */
16a20 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
16a30 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
16a40 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70  , 0xff, sizeof(p
16a50 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
16a60 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  s));.    }else{.
16a70 20 20 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65        u8 *dbFile
16a80 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50  Vers = &((u8*)pP
16a90 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20  g->pData)[24];. 
16aa0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
16ab0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
16ac0 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a   dbFileVers, siz
16ad0 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
16ae0 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a  leVers));.    }.
16af0 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61    }.  CODEC1(pPa
16b00 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  ger, pPg->pData,
16b10 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53   pgno, 3, rc = S
16b20 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20  QLITE_NOMEM);.. 
16b30 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
16b40 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
16b50 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52  _count);.  PAGER
16b60 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52  _INCR(pPager->nR
16b70 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ead);.  IOTRACE(
16b80 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c  ("PGIN %p %d\n",
16b90 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
16ba0 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
16bb0 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64  FETCH %d page %d
16bc0 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
16be0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
16bf0 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
16c00 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20  hash(pPg)));..  
16c10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
16c20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16c30 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73  T_WAL./*.** This
16c40 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76   function is inv
16c50 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  oked once for ea
16c60 63 68 20 70 61 67 65 20 74 68 61 74 20 68 61 73  ch page that has
16c70 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a   already been .*
16c80 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  * written into t
16c90 68 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e  he log file when
16ca0 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69   a WAL transacti
16cb0 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
16cc0 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  k..** Parameter 
16cd0 69 50 67 20 69 73 20 74 68 65 20 70 61 67 65 20  iPg is the page 
16ce0 6e 75 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70  number of said p
16cf0 61 67 65 2e 20 54 68 65 20 70 43 74 78 20 61 72  age. The pCtx ar
16d00 67 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63  gument .** is ac
16d10 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72  tually a pointer
16d20 20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74   to the Pager st
16d30 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49  ructure..**.** I
16d40 66 20 70 61 67 65 20 69 50 67 20 69 73 20 70 72  f page iPg is pr
16d50 65 73 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63  esent in the cac
16d60 68 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f  he, and has no o
16d70 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
16d80 65 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20  ences,.** it is 
16d90 64 69 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72  discarded. Other
16da0 77 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 61  wise, if there a
16db0 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
16dc0 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65  utstanding.** re
16dd0 66 65 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61  ferences, the pa
16de0 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65  ge content is re
16df0 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20  loaded from the 
16e00 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65  database. If the
16e10 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72  .** attempt to r
16e20 65 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72  eload content fr
16e30 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
16e40 69 73 20 72 65 71 75 69 72 65 64 20 61 6e 64 20  is required and 
16e50 66 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72  fails, .** retur
16e60 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
16e70 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
16e80 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  e, SQLITE_OK..*/
16e90 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
16ea0 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f  rUndoCallback(vo
16eb0 69 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69  id *pCtx, Pgno i
16ec0 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Pg){.  int rc = 
16ed0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
16ee0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61  er *pPager = (Pa
16ef0 67 65 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67  ger *)pCtx;.  Pg
16f00 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67  Hdr *pPg;..  pPg
16f10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
16f20 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50  ookup(pPager, iP
16f30 67 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b  g);.  if( pPg ){
16f40 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
16f50 50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75  PcachePageRefcou
16f60 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20  nt(pPg)==1 ){.  
16f70 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
16f80 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20  eDrop(pPg);.    
16f90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
16fa0 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67  = readDbPage(pPg
16fb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
16fc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16fd0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52        pPager->xR
16fe0 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20  einiter(pPg);.  
16ff0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
17000 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
17010 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  g);.    }.  }.. 
17020 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66   /* Normally, if
17030 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
17040 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61  s rolled back, a
17050 6e 79 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73  ny backup proces
17060 73 65 73 20 61 72 65 0a 20 20 2a 2a 20 75 70 64  ses are.  ** upd
17070 61 74 65 64 20 61 73 20 64 61 74 61 20 69 73 20  ated as data is 
17080 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68  copied out of th
17090 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
170a0 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a  al and into the.
170b0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54    ** database. T
170c0 68 69 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 72  his is not gener
170d0 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69  ally possible wi
170e0 74 68 20 61 20 57 41 4c 20 64 61 74 61 62 61 73  th a WAL databas
170f0 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62  e, as.  ** rollb
17100 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d  ack involves sim
17110 70 6c 79 20 74 72 75 6e 63 61 74 69 6e 67 20 74  ply truncating t
17120 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65  he log file. The
17130 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20  refore, if one. 
17140 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d   ** or more fram
17150 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
17160 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
17170 74 68 65 20 6c 6f 67 20 28 61 6e 64 20 74 68 65  the log (and the
17180 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73  refore .  ** als
17190 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68  o copied into th
171a0 65 20 62 61 63 6b 75 70 20 64 61 74 61 62 61 73  e backup databas
171b0 65 73 29 20 61 73 20 70 61 72 74 20 6f 66 20 74  es) as part of t
171c0 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  his transaction,
171d0 0a 20 20 2a 2a 20 74 68 65 20 62 61 63 6b 75 70  .  ** the backup
171e0 73 20 6d 75 73 74 20 62 65 20 72 65 73 74 61 72  s must be restar
171f0 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ted..  */.  sqli
17200 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
17210 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
17220 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
17230 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
17240 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
17250 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  d to rollback a 
17260 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61  transaction on a
17270 20 57 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a   WAL database..*
17280 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
17290 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61  erRollbackWal(Pa
172a0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
172b0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
172c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172d0 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
172e0 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74  /.  PgHdr *pList
172f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17300 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64      /* List of d
17310 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 72 65  irty pages to re
17320 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f  vert */..  /* Fo
17330 72 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74  r all pages in t
17340 68 65 20 63 61 63 68 65 20 74 68 61 74 20 61 72  he cache that ar
17350 65 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74  e currently dirt
17360 79 20 6f 72 20 68 61 76 65 20 61 6c 72 65 61 64  y or have alread
17370 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72 69 74  y.  ** been writ
17380 74 65 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d  ten (but not com
17390 6d 69 74 74 65 64 29 20 74 6f 20 74 68 65 20 6c  mitted) to the l
173a0 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20  og file, do one 
173b0 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c  of the .  ** fol
173c0 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a  lowing:.  **.  *
173d0 2a 20 20 20 2b 20 44 69 73 63 61 72 64 20 74 68  *   + Discard th
173e0 65 20 63 61 63 68 65 64 20 70 61 67 65 20 28 69  e cached page (i
173f0 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20  f refcount==0), 
17400 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f  or.  **   + Relo
17410 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  ad page content 
17420 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
17430 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3e 30  e (if refcount>0
17440 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  )..  */.  pPager
17450 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
17460 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20  r->dbOrigSize;. 
17470 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
17480 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61  Undo(pPager->pWa
17490 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c  l, pagerUndoCall
174a0 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50  back, (void *)pP
174b0 61 67 65 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d  ager);.  pList =
174c0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69   sqlite3PcacheDi
174d0 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
174e0 70 50 43 61 63 68 65 29 3b 0a 20 20 77 68 69 6c  pPCache);.  whil
174f0 65 28 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d  e( pList && rc==
17500 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17510 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20   PgHdr *pNext = 
17520 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
17530 20 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64     rc = pagerUnd
17540 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20  oCallback((void 
17550 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d  *)pPager, pList-
17560 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73  >pgno);.    pLis
17570 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a  t = pNext;.  }..
17580 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17590 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
175a0 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70 65 72  ion is a wrapper
175b0 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57   around sqlite3W
175c0 61 6c 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77  alFrames(). As w
175d0 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a  ell as logging.*
175e0 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * the contents o
175f0 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61  f the list of pa
17600 67 65 73 20 68 65 61 64 65 64 20 62 79 20 70 4c  ges headed by pL
17610 69 73 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62  ist (connected b
17620 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68  y pDirty),.** th
17630 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69  is function noti
17640 66 69 65 73 20 61 6e 79 20 61 63 74 69 76 65 20  fies any active 
17650 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73  backup processes
17660 20 74 68 61 74 20 74 68 65 20 70 61 67 65 73 20   that the pages 
17670 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e  have.** changed.
17680 20 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74   .*/ .static int
17690 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
176a0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
176b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
176c0 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
176d0 63 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ct */.  PgHdr *p
176e0 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
176f0 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
17700 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67  of frames to log
17710 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e   */.  Pgno nTrun
17720 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  cate,           
17730 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
17740 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 69  e size after thi
17750 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e  s commit */.  in
17760 74 20 69 73 43 6f 6d 6d 69 74 2c 20 20 20 20 20  t isCommit,     
17770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17780 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
17790 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69   a commit */.  i
177a0 6e 74 20 73 79 6e 63 5f 66 6c 61 67 73 20 20 20  nt sync_flags   
177b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
177c0 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20  * Flags to pass 
177d0 74 6f 20 4f 73 53 79 6e 63 28 29 20 28 6f 72 20  to OsSync() (or 
177e0 30 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  0) */.){.  int r
177f0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
17800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
17810 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
17820 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17830 70 57 61 6c 20 29 3b 0a 20 20 72 63 20 3d 20 73  pWal );.  rc = s
17840 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28  qlite3WalFrames(
17850 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20  pPager->pWal, . 
17860 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
17870 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54  eSize, pList, nT
17880 72 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69  runcate, isCommi
17890 74 2c 20 73 79 6e 63 5f 66 6c 61 67 73 0a 20 20  t, sync_flags.  
178a0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
178b0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
178c0 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20  ->pBackup ){.   
178d0 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66   PgHdr *p;.    f
178e0 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70  or(p=pList; p; p
178f0 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
17900 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
17910 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
17920 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c  Backup, p->pgno,
17930 20 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29   (u8 *)p->pData)
17940 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
17950 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17960 2a 20 42 65 67 69 6e 20 61 20 72 65 61 64 20 74  * Begin a read t
17970 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
17980 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  e WAL..**.** Thi
17990 73 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74  s routine used t
179a0 6f 20 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67  o be called "pag
179b0 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29  erOpenSnapshot()
179c0 22 20 62 65 63 61 75 73 65 20 69 74 20 65 73 73  " because it ess
179d0 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65  entially.** make
179e0 73 20 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20  s a snapshot of 
179f0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
17a00 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e  the current poin
17a10 74 20 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72  t in time and pr
17a20 65 73 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20  eserves.** that 
17a30 73 6e 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65  snapshot for use
17a40 20 62 79 20 74 68 65 20 72 65 61 64 65 72 20 69   by the reader i
17a50 6e 20 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75  n spite of concu
17a60 72 72 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20  rrently changes 
17a70 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74  by.** other writ
17a80 65 72 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e  ers or checkpoin
17a90 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ters..*/.static 
17aa0 69 6e 74 20 70 61 67 65 72 42 65 67 69 6e 52 65  int pagerBeginRe
17ab0 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  adTransaction(Pa
17ac0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
17ad0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
17ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17af0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
17b00 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20  /.  int changed 
17b10 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
17b20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63      /* True if c
17b30 61 63 68 65 20 6d 75 73 74 20 62 65 20 72 65 73  ache must be res
17b40 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  et */..  assert(
17b50 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
17b60 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 73 71  ger) );..  /* sq
17b70 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54  lite3WalEndReadT
17b80 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73  ransaction() was
17b90 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20   not called for 
17ba0 74 68 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a  the previous.  *
17bb0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  * transaction in
17bc0 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58   locking_mode=EX
17bd0 43 4c 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c  CLUSIVE.  So cal
17be0 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65  l it now.  If we
17bf0 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63  .  ** are in loc
17c00 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c  king_mode=NORMAL
17c10 20 61 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77   and EndRead() w
17c20 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61  as previously ca
17c30 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64  lled,.  ** the d
17c40 75 70 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73  uplicate call is
17c50 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a   harmless..  */.
17c60 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52    sqlite3WalEndR
17c70 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
17c80 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20  Pager->pWal);.. 
17c90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
17ca0 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
17cb0 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
17cc0 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20  l, &changed);.  
17cd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17ce0 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 75 6d  K ){.    int dum
17cf0 6d 79 3b 0a 20 20 20 20 69 66 28 20 63 68 61 6e  my;.    if( chan
17d00 67 65 64 20 29 7b 0a 20 20 20 20 20 20 70 61 67  ged ){.      pag
17d10 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
17d20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17d30 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
17d40 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
17d50 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 20  eValid==0 );.   
17d60 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
17d70 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
17d80 74 28 70 50 61 67 65 72 2c 20 26 64 75 6d 6d 79  t(pPager, &dummy
17d90 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  );.  }.  pPager-
17da0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
17db0 48 41 52 45 44 3b 0a 0a 20 20 72 65 74 75 72 6e  HARED;..  return
17dc0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
17dd0 65 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c  eck if the *-wal
17de0 20 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65   file that corre
17df0 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61  sponds to the da
17e00 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79  tabase opened by
17e10 20 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74   pPager.** exist
17e20 73 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  s if the databas
17e30 65 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f  e is not empy, o
17e40 72 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  r verify that th
17e50 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65  e *-wal file doe
17e60 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20 28  s.** not exist (
17e70 62 79 20 64 65 6c 65 74 69 6e 67 20 69 74 29 20  by deleting it) 
17e80 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
17e90 66 69 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  file is empty..*
17ea0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
17eb0 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 74  base is not empt
17ec0 79 20 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20  y and the *-wal 
17ed0 66 69 6c 65 20 65 78 69 73 74 73 2c 20 6f 70 65  file exists, ope
17ee0 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69  n the pager.** i
17ef0 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20  n WAL mode.  If 
17f00 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
17f10 65 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a  empty or if no *
17f20 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  -wal file exists
17f30 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72   and.** if no er
17f40 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65  ror occurs, make
17f50 20 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75 72   sure Pager.jour
17f60 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73  nalMode is not s
17f70 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a  et to.** PAGER_J
17f80 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a  OURNALMODE_WAL..
17f90 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
17fa0 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72  ITE_OK or an err
17fb0 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49  or code..**.** I
17fc0 66 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 69  f the WAL file i
17fd0 73 20 6f 70 65 6e 65 64 2c 20 61 6c 73 6f 20 6f  s opened, also o
17fe0 70 65 6e 20 61 20 73 6e 61 70 73 68 6f 74 20 28  pen a snapshot (
17ff0 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
18000 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  )..**.** The cal
18010 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20  ler must hold a 
18020 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
18030 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18040 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a   to call this.**
18050 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75   function. Becau
18060 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  se an EXCLUSIVE 
18070 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66  lock on the db f
18080 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
18090 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20  to delete .** a 
180a0 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d  WAL on a none-em
180b0 70 74 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  pty database, th
180c0 69 73 20 65 6e 73 75 72 65 73 20 74 68 65 72 65  is ensures there
180d0 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64   is no race cond
180e0 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65  ition .** betwee
180f0 6e 20 74 68 65 20 78 41 63 63 65 73 73 28 29 20  n the xAccess() 
18100 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44 65  below and an xDe
18110 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65 78 65  lete() being exe
18120 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a  cuted by some .*
18130 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
18140 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
18150 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66  t pagerOpenWalIf
18160 50 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a 70  Present(Pager *p
18170 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
18180 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
18190 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
181a0 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  pFile ){.    int
181b0 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20   isWal;         
181c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
181d0 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65 20 65  ue if WAL file e
181e0 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74  xists */.    int
181f0 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
18200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
18210 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
18220 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 61  se file */.    a
18230 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
18240 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  tate>=SHARED_LOC
18250 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  K );.    rc = sq
18260 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
18270 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
18280 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
18290 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
182a0 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
182b0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
182c0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
182d0 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
182e0 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ->zWal, 0);.    
182f0 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a 20 20 20    isWal = 0;.   
18300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
18310 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
18320 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 70 50  ss(.          pP
18330 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
18340 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45  er->zWal, SQLITE
18350 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
18360 26 69 73 57 61 6c 0a 20 20 20 20 20 20 29 3b 0a  &isWal.      );.
18370 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
18380 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18390 20 20 20 20 20 69 66 28 20 69 73 57 61 6c 20 29       if( isWal )
183a0 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
183b0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
183c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
183d0 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28  te3PagerOpenWal(
183e0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
183f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18400 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18410 20 20 20 72 63 20 3d 20 70 61 67 65 72 42 65 67     rc = pagerBeg
18420 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
18430 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  n(pPager);.     
18440 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
18450 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
18460 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
18470 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
18480 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
18490 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
184a0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
184b0 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20  DE_DELETE;.     
184c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
184d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
184e0 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  if../*.** Playba
184f0 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61  ck savepoint pSa
18500 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20  vepoint. Or, if 
18510 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c  pSavepoint==NULL
18520 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a  , then playback.
18530 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ** the entire ma
18540 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18550 65 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76  e. The case pSav
18560 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63  epoint==NULL occ
18570 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52  urs when .** a R
18580 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61  OLLBACK TO comma
18590 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  nd is invoked on
185a0 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61   a SAVEPOINT tha
185b0 74 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  t is a transacti
185c0 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  on .** savepoint
185d0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61  ..**.** When pSa
185e0 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e  vepoint is not N
185f0 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e  ULL (meaning a n
18600 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  on-transaction s
18610 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20  avepoint is .** 
18620 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
18630 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  k), then the rol
18640 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f  lback consists o
18650 66 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74  f up to three st
18660 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d  ages,.** perform
18670 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
18680 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a  specified:.**.**
18690 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70     * Pages are p
186a0 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
186b0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
186c0 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74   starting at byt
186d0 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20  e.**     offset 
186e0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
186f0 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69  Offset and conti
18700 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20  nuing to .**    
18710 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
18720 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74  iHdrOffset, or t
18730 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
18740 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   main journal.**
18750 20 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67       file if Pag
18760 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
18770 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a  Offset is zero..
18780 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67  **.**   * If Pag
18790 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
187a0 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65  Offset is not ze
187b0 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  ro, then pages a
187c0 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20  re played.**    
187d0 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66   back starting f
187e0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
187f0 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65  header immediate
18800 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a  ly following .**
18810 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
18820 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74  int.iHdrOffset t
18830 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
18840 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
18850 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61  le..**.**   * Pa
18860 67 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61  ges are then pla
18870 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
18880 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  e sub-journal fi
18890 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20  le, starting.** 
188a0 20 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67      with the Pag
188b0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62  erSavepoint.iSub
188c0 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  Rec and continui
188d0 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ng to the end of
188e0 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72  .**     the jour
188f0 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
18900 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72  Throughout the r
18910 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c  ollback process,
18920 20 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67   each time a pag
18930 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  e is rolled back
18940 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70  , the.** corresp
18950 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
18960 74 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74  t in a bitvec st
18970 72 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c  ructure (variabl
18980 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a  e pDone in the.*
18990 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
189a0 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73   below). This is
189b0 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
189c0 74 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f  that a page is o
189d0 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61  nly.** rolled ba
189e0 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
189f0 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65  e it is encounte
18a00 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f  red in either jo
18a10 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
18a20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55  pSavepoint is NU
18a30 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  LL, then pages a
18a40 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62  re only played b
18a50 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
18a60 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  n.** journal fil
18a70 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  e. There is no n
18a80 65 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63  eed for a bitvec
18a90 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
18aa0 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63  *.** In either c
18ab0 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79  ase, before play
18ac0 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74  back commences t
18ad0 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20  he Pager.dbSize 
18ae0 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72  variable.** is r
18af0 65 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75  eset to the valu
18b00 65 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61  e that it held a
18b10 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
18b20 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a  he savepoint .**
18b30 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e   (or transaction
18b40 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20  ). No page with 
18b50 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72  a page-number gr
18b60 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20  eater than this 
18b70 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79  value.** is play
18b80 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20  ed back. If one 
18b90 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
18ba0 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70  t is simply skip
18bb0 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ped..*/.static i
18bc0 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  nt pagerPlayback
18bd0 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
18be0 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61  *pPager, PagerSa
18bf0 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f  vepoint *pSavepo
18c00 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b  int){.  i64 szJ;
18c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c20 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69   /* Effective si
18c30 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ze of the main j
18c40 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
18c50 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
18c60 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66       /* End of f
18c70 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20  irst segment of 
18c80 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63  main-journal rec
18c90 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ords */.  int rc
18ca0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
18cb0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
18cc0 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
18cd0 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Done = 0;       
18ce0 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73  /* Bitvec to ens
18cf0 75 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64  ure pages played
18d00 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20   back only once 
18d10 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
18d20 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
18d30 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20  ER_SHARED );..  
18d40 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69  /* Allocate a bi
18d50 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73  tvec to use to s
18d60 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20  tore the set of 
18d70 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
18d80 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65  k */.  if( pSave
18d90 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f  point ){.    pDo
18da0 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  ne = sqlite3Bitv
18db0 65 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f  ecCreate(pSavepo
18dc0 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20  int->nOrig);.   
18dd0 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20   if( !pDone ){. 
18de0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18df0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
18e00 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
18e10 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
18e20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75  back to the valu
18e30 65 20 69 74 20 77 61 73 20 62 65 66 6f 72 65 20  e it was before 
18e40 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20  the savepoint . 
18e50 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74   ** being revert
18e60 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20  ed was opened.. 
18e70 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
18e80 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e  Size = pSavepoin
18e90 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
18ea0 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e  nOrig : pPager->
18eb0 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70 50  dbOrigSize;.  pP
18ec0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
18ed0 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
18ee0 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28  tempFile;..  if(
18ef0 20 21 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20   !pSavepoint && 
18f00 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
18f10 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  er) ){.    retur
18f20 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57  n pagerRollbackW
18f30 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  al(pPager);.  }.
18f40 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72  .  /* Use pPager
18f50 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20  ->journalOff as 
18f60 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 69  the effective si
18f70 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72  ze of the main r
18f80 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
18f90 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61  rnal.  The actua
18fa0 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20  l file might be 
18fb0 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73  larger than this
18fc0 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a   in.  ** PAGER_J
18fd0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
18fe0 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55  ATE or PAGER_JOU
18ff0 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
19000 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a  .  But anything.
19010 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72    ** past pPager
19020 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20  ->journalOff is 
19030 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73  off-limits to us
19040 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70  ..  */.  szJ = p
19050 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
19060 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  f;.  assert( pag
19070 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
19080 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b  ==0 || szJ==0 );
19090 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20  ..  /* Begin by 
190a0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63  rolling back rec
190b0 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61  ords from the ma
190c0 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
190d0 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65  ing at.  ** Page
190e0 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73  rSavepoint.iOffs
190f0 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  et and continuin
19100 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f  g to the next jo
19110 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20  urnal header..  
19120 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20 62  ** There might b
19130 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65  e records in the
19140 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68   main journal th
19150 61 74 20 68 61 76 65 20 61 20 70 61 67 65 20 6e  at have a page n
19160 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74  umber.  ** great
19170 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
19180 65 6e 74 20 64 61 74 61 62 61 73 65 20 73 69 7a  ent database siz
19190 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  e (pPager->dbSiz
191a0 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a  e) but those.  *
191b0 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65  * will be skippe
191c0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e  d automatically.
191d0 20 20 50 61 67 65 73 20 61 72 65 20 61 64 64 65    Pages are adde
191e0 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68  d to pDone as th
191f0 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79  ey.  ** are play
19200 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed back..  */.  
19210 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 26  if( pSavepoint &
19220 26 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  & !pagerUseWal(p
19230 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69 48  Pager) ){.    iH
19240 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69  drOff = pSavepoi
19250 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f  nt->iHdrOffset ?
19260 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64   pSavepoint->iHd
19270 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20  rOffset : szJ;. 
19280 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
19290 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69  alOff = pSavepoi
192a0 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20  nt->iOffset;.   
192b0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
192c0 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
192d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72  >journalOff<iHdr
192e0 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Off ){.      rc 
192f0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
19300 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
19310 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
19320 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c  alOff, pDone, 1,
19330 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
19340 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
19350 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73  E_DONE );.  }els
19360 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  e{.    pPager->j
19370 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
19380 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75   }..  /* Continu
19390 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72  e rolling back r
193a0 65 63 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68  ecords out of th
193b0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
193c0 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20  tarting at.  ** 
193d0 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
193e0 6c 20 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e  l header seen an
193f0 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74  d continuing unt
19400 69 6c 20 74 68 65 20 65 66 66 65 63 74 69 76 65  il the effective
19410 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65   end.  ** of the
19420 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
19430 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f  le.  Continue to
19440 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e   skip out-of-ran
19450 67 65 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a  ge pages and.  *
19460 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e  * continue addin
19470 67 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62  g pages rolled b
19480 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20  ack to pDone..  
19490 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  */.  while( rc==
194a0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
194b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
194c0 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69  szJ ){.    u32 i
194d0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
194e0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
194f0 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d  .    u32 nJRec =
19500 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   0;     /* Numbe
19510 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63  r of Journal Rec
19520 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20  ords */.    u32 
19530 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20  dummy;.    rc = 
19540 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
19550 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26  Pager, 0, szJ, &
19560 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a  nJRec, &dummy);.
19570 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
19580 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a  SQLITE_DONE );..
19590 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68      /*.    ** Th
195a0 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e "pPager->journ
195b0 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
195c0 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
195d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
195e0 22 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73  ".    ** test is
195f0 20 72 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b   related to tick
19600 65 74 20 23 32 35 36 35 2e 20 20 53 65 65 20 74  et #2565.  See t
19610 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e  he discussion in
19620 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
19630 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e  r_playback() fun
19640 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69  ction for additi
19650 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
19660 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
19670 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20   nJRec==0 .     
19680 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
19690 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
196a0 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
196b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
196c0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a  .    ){.      nJ
196d0 52 65 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a  Rec = (u32)((szJ
196e0 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
196f0 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50  alOff)/JOURNAL_P
19700 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
19710 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
19720 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
19730 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20   && ii<nJRec && 
19740 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
19750 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20  ff<szJ; ii++){. 
19760 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
19770 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
19780 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
19790 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
197a0 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Done, 1, 1);.   
197b0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
197c0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
197d0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
197e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
197f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
19800 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f  Off>=szJ );..  /
19810 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c  * Finally,  roll
19820 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20  back pages from 
19830 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
19840 20 20 50 61 67 65 20 74 68 61 74 20 77 65 72 65    Page that were
19850 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79  .  ** previously
19860 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74   rolled back out
19870 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
19880 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65  rnal (and are he
19890 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20  nce in pDone).  
198a0 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70  ** will be skipp
198b0 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67  ed.  Out-of-rang
198c0 65 20 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f  e pages are also
198d0 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20   skipped..  */. 
198e0 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20   if( pSavepoint 
198f0 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20  ){.    u32 ii;  
19900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
19910 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
19920 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70 53   i64 offset = pS
19930 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65  avepoint->iSubRe
19940 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  c*(4+pPager->pag
19950 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28  eSize);..    if(
19960 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
19970 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
19980 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76   = sqlite3WalSav
19990 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65  epointUndo(pPage
199a0 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f  r->pWal, pSavepo
199b0 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a  int->aWalData);.
199c0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
199d0 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75  =pSavepoint->iSu
199e0 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45  bRec; rc==SQLITE
199f0 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72  _OK && ii<pPager
19a00 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29  ->nSubRec; ii++)
19a10 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
19a20 6f 66 66 73 65 74 3d 3d 69 69 2a 28 34 2b 70 50  offset==ii*(4+pP
19a30 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
19a40 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
19a50 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
19a60 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f  _page(pPager, &o
19a70 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c  ffset, pDone, 0,
19a80 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
19a90 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
19aa0 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20  E_DONE );.  }.. 
19ab0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
19ac0 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20  stroy(pDone);.  
19ad0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19ae0 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
19af0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
19b00 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  J;.  }..  return
19b10 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
19b20 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
19b30 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
19b40 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
19b50 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a  are allowed..*/.
19b60 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
19b70 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61  rSetCachesize(Pa
19b80 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
19b90 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69   mxPage){.  sqli
19ba0 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63 68  te3PcacheSetCach
19bb0 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  esize(pPager->pP
19bc0 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a  Cache, mxPage);.
19bd0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
19be0 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f  the robustness o
19bf0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
19c00 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  o damage due to 
19c10 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72  OS crashes.** or
19c20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20   power failures 
19c30 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  by changing the 
19c40 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28  number of syncs(
19c50 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a  )s when writing.
19c60 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
19c70 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20  journal.  There 
19c80 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73  are three levels
19c90 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
19ca0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
19cb0 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
19cc0 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
19cd0 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
19ce0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
19cf0 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
19d00 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
19d10 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
19d20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
19d30 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
19d40 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
19d50 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
19d60 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
19d70 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
19d80 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
19d90 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
19da0 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
19db0 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
19dc0 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
19dd0 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
19de0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
19df0 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
19e00 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
19e10 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
19e20 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
19e30 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
19e40 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
19e50 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
19e60 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
19e70 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
19e80 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
19e90 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
19ea0 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
19eb0 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
19ec0 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
19ed0 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
19ee0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
19ef0 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
19f00 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
19f10 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
19f20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
19f30 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
19f40 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
19f50 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
19f60 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
19f70 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
19f80 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
19f90 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
19fa0 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
19fb0 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
19fc0 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
19fd0 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
19fe0 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
19ff0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
1a000 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
1a010 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
1a020 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
1a030 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
1a040 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
1a050 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
1a060 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
1a070 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
1a080 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61  **.** Numeric va
1a090 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  lues associated 
1a0a0 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65  with these state
1a0b0 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f  s are OFF==1, NO
1a0c0 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46  RMAL=2,.** and F
1a0d0 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ULL=3..*/.#ifnde
1a0e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
1a0f0 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64  GER_PRAGMAS.void
1a100 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
1a110 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65  SafetyLevel(Page
1a120 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
1a130 65 76 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46  evel, int bFullF
1a140 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d  sync){.  pPager-
1a150 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65  >noSync =  (leve
1a160 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e  l==1 || pPager->
1a170 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a  tempFile) ?1:0;.
1a180 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
1a190 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26  nc = (level==3 &
1a1a0 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
1a1b0 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61  ile) ?1:0;.  pPa
1a1c0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20  ger->sync_flags 
1a1d0 3d 20 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53 51  = (bFullFsync?SQ
1a1e0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53  LITE_SYNC_FULL:S
1a1f0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
1a200 4c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  L);.  if( pPager
1a210 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65  ->noSync ) pPage
1a220 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
1a230 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1a240 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
1a250 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69  lobal variable i
1a260 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68  s incremented wh
1a270 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61  enever the libra
1a280 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  ry.** attempts t
1a290 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
1a2a0 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  ry file.  This i
1a2b0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
1a2c0 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
1a2d0 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
1a2e0 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66  nly.  .*/.#ifdef
1a2f0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
1a300 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
1a310 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  p_count = 0;.#en
1a320 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  dif../*.** Open 
1a330 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
1a340 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ..**.** Write th
1a350 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1a360 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52  r into *pFile. R
1a370 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1a380 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f  on success .** o
1a390 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
1a3a0 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61  or code if we fa
1a3b0 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20  il. The OS will 
1a3c0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a  automatically .*
1a3d0 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d  * delete the tem
1a3e0 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e  porary file when
1a3f0 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
1a400 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70  *.** The flags p
1a410 61 73 73 65 64 20 74 6f 20 74 68 65 20 56 46 53  assed to the VFS
1a420 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63   layer xOpen() c
1a430 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70  all are those sp
1a440 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61  ecified.** by pa
1a450 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73  rameter vfsFlags
1a460 20 4f 52 65 64 20 77 69 74 68 20 74 68 65 20 66   ORed with the f
1a470 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
1a480 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1a490 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20  READWRITE.**    
1a4a0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
1a4b0 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ATE.**     SQLIT
1a4c0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
1a4d0 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
1a4e0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
1a4f0 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  E.*/.static int 
1a500 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20  pagerOpentemp(. 
1a510 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
1a520 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1a530 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
1a540 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
1a550 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74  ile,  /* Write t
1a560 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
1a570 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  or here */.  int
1a580 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
1a590 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
1a5a0 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ed through to th
1a5b0 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e  e VFS */.){.  in
1a5c0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1a5d0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1a5e0 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  de */..#ifdef SQ
1a5f0 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
1a600 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
1a610 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66  nt++;  /* Used f
1a620 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
1a630 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a  nalysis only */.
1a640 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61  #endif..  vfsFla
1a650 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50  gs |=  SQLITE_OP
1a660 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
1a670 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
1a680 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
1a690 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
1a6a0 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f  USIVE | SQLITE_O
1a6b0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
1a6c0 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  E;.  rc = sqlite
1a6d0 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  3OsOpen(pPager->
1a6e0 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20  pVfs, 0, pFile, 
1a6f0 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  vfsFlags, 0);.  
1a700 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
1a710 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
1a720 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75  pFile) );.  retu
1a730 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1a740 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e  Set the busy han
1a750 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  dler function..*
1a760 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69  *.** The pager i
1a770 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d  nvokes the busy-
1a780 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74  handler if sqlit
1a790 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72  e3OsLock() retur
1a7a0 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ns .** SQLITE_BU
1a7b0 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74  SY when trying t
1a7c0 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e  o upgrade from n
1a7d0 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52  o-lock to a SHAR
1a7e0 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77  ED lock,.** or w
1a7f0 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70  hen trying to up
1a800 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53  grade from a RES
1a810 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e  ERVED lock to an
1a820 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c   EXCLUSIVE .** l
1a830 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f  ock. It does *no
1a840 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  t* invoke the bu
1a850 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20  sy handler when 
1a860 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a  upgrading from.*
1a870 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45  * SHARED to RESE
1a880 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70  RVED, or when up
1a890 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41  grading from SHA
1a8a0 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45  RED to EXCLUSIVE
1a8b0 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72  .** (which occur
1a8c0 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75  s during hot-jou
1a8d0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20  rnal rollback). 
1a8e0 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  Summary:.**.**  
1a8f0 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20   Transition     
1a900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a910 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75     | Invokes xBu
1a920 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d  syHandler.**   -
1a930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a960 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f  -------.**   NO_
1a970 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48  LOCK       -> SH
1a980 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c  ARED_LOCK      |
1a990 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44   Yes.**   SHARED
1a9a0 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52  _LOCK   -> RESER
1a9b0 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f  VED_LOCK    | No
1a9c0 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43  .**   SHARED_LOC
1a9d0 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  K   -> EXCLUSIVE
1a9e0 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20  _LOCK   | No.** 
1a9f0 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20    RESERVED_LOCK 
1aa00 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  -> EXCLUSIVE_LOC
1aa10 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20  K   | Yes.**.** 
1aa20 49 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  If the busy-hand
1aa30 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  ler callback ret
1aa40 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  urns non-zero, t
1aa50 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72  he lock is .** r
1aa60 65 74 72 69 65 64 2e 20 49 66 20 69 74 20 72 65  etried. If it re
1aa70 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e  turns zero, then
1aa80 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59   the SQLITE_BUSY
1aa90 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74   error is.** ret
1aaa0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
1aab0 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 72  ler of the pager
1aac0 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   API function..*
1aad0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
1aae0 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
1aaf0 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
1ab00 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
1ab10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
1ab20 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
1ab30 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
1ab40 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20  r)(void *),     
1ab50 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1ab60 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66  o busy-handler f
1ab70 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  unction */.  voi
1ab80 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41  d *pBusyHandlerA
1ab90 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
1aba0 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
1abb0 20 70 61 73 73 20 74 6f 20 78 42 75 73 79 48 61   pass to xBusyHa
1abc0 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a 20 20  ndler */.){  .  
1abd0 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
1abe0 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64  dler = xBusyHand
1abf0 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  ler;.  pPager->p
1ac00 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d  BusyHandlerArg =
1ac10 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67   pBusyHandlerArg
1ac20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
1ac30 65 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  e the page size 
1ac40 75 73 65 64 20 62 79 20 74 68 65 20 50 61 67 65  used by the Page
1ac50 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65  r object. The ne
1ac60 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20  w page size .** 
1ac70 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50  is passed in *pP
1ac80 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ageSize..**.** I
1ac90 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
1aca0 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
1acb0 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
1acc0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
1acd0 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  it.** is a no-op
1ace0 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  . The value retu
1acf0 72 6e 65 64 20 69 73 20 74 68 65 20 65 72 72 6f  rned is the erro
1ad00 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f  r state error co
1ad10 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65  de (i.e. .** one
1ad20 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   of SQLITE_IOERR
1ad30 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  , SQLITE_CORRUPT
1ad40 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29   or SQLITE_FULL)
1ad50 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
1ad60 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  e, if all of the
1ad70 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
1ad80 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74  rue:.**.**   * t
1ad90 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65  he new page size
1ada0 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67   (value of *pPag
1adb0 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20  eSize) is valid 
1adc0 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20  (a power .**    
1add0 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20   of two between 
1ade0 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d  512 and SQLITE_M
1adf0 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e  AX_PAGE_SIZE, in
1ae00 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a  clusive), and.**
1ae10 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72  .**   * there ar
1ae20 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
1ae30 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73   page references
1ae40 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  , and.**.**   * 
1ae50 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1ae60 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e  either not an in
1ae70 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1ae80 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20   or it is.**    
1ae90 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
1aea0 74 61 62 61 73 65 20 74 68 61 74 20 63 75 72 72  tabase that curr
1aeb0 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f  ently consists o
1aec0 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a  f zero pages..**
1aed0 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67  .** then the pag
1aee0 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73  er object page s
1aef0 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70  ize is set to *p
1af00 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  PageSize..**.** 
1af10 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  If the page size
1af20 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65   is changed, the
1af30 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1af40 75 73 65 73 20 73 71 6c 69 74 65 33 50 61 67 65  uses sqlite3Page
1af50 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f  rMalloc() .** to
1af60 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61   obtain a new Pa
1af70 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75  ger.pTmpSpace bu
1af80 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c  ffer. If this al
1af90 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74  location attempt
1afa0 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49   .** fails, SQLI
1afb0 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
1afc0 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67  rned and the pag
1afd0 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75  e size remains u
1afe0 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e  nchanged. .** In
1aff0 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73   all other cases
1b000 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1b010 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
1b020 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
1b030 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20  is not changed, 
1b040 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 6f  either because o
1b050 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72  ne of the enumer
1b060 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f  ated.** conditio
1b070 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20  ns above is not 
1b080 74 72 75 65 2c 20 74 68 65 20 70 61 67 65 72 20  true, the pager 
1b090 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61  was in error sta
1b0a0 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20  te when this.** 
1b0b0 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
1b0c0 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20  led, or because 
1b0d0 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
1b0e0 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61  ation attempt fa
1b0f0 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a  iled, .** then *
1b100 70 50 61 67 65 53 69 7a 65 20 69 73 20 73 65 74  pPageSize is set
1b110 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74   to the old, ret
1b120 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20  ained page size 
1b130 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1b140 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b150 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
1b160 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1b170 75 31 36 20 2a 70 50 61 67 65 53 69 7a 65 2c 20  u16 *pPageSize, 
1b180 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20  int nReserve){. 
1b190 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72   int rc = pPager
1b1a0 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66  ->errCode;..  if
1b1b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b1c0 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67 65 53  ){.    u16 pageS
1b1d0 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65  ize = *pPageSize
1b1e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61  ;.    assert( pa
1b1f0 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61  geSize==0 || (pa
1b200 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
1b210 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
1b220 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29  MAX_PAGE_SIZE) )
1b230 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61 67 65  ;.    if( (pPage
1b240 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70  r->memDb==0 || p
1b250 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30  Pager->dbSize==0
1b260 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  ).     && sqlite
1b270 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
1b280 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
1b290 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 61 67  ==0 .     && pag
1b2a0 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a  eSize && pageSiz
1b2b0 65 21 3d 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e!=pPager->pageS
1b2c0 69 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ize .    ){.    
1b2d0 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 28    char *pNew = (
1b2e0 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61  char *)sqlite3Pa
1b2f0 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a  geMalloc(pageSiz
1b300 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  e);.      if( !p
1b310 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72  New ){.        r
1b320 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1b330 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1b340 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
1b350 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
1b360 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
1b370 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
1b380 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b390 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d  PageFree(pPager-
1b3a0 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20  >pTmpSpace);.   
1b3b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d       pPager->pTm
1b3c0 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20  pSpace = pNew;. 
1b3d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63         sqlite3Pc
1b3e0 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28  acheSetPageSize(
1b3f0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
1b400 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20   pageSize);.    
1b410 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70    }.    }.    *p
1b420 50 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29  PageSize = (u16)
1b430 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1b440 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65 72  ;.    if( nReser
1b450 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20  ve<0 ) nReserve 
1b460 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72  = pPager->nReser
1b470 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ve;.    assert( 
1b480 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
1b490 52 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a  Reserve<1000 );.
1b4a0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73      pPager->nRes
1b4b0 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73  erve = (i16)nRes
1b4c0 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52  erve;.    pagerR
1b4d0 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72  eportSize(pPager
1b4e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1b4f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1b500 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1b510 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20   the "temporary 
1b520 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c  page" buffer hel
1b530 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  d internally.** 
1b540 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54  by the pager.  T
1b550 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20  his is a buffer 
1b560 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75  that is big enou
1b570 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a  gh to hold the.*
1b580 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  * entire content
1b590 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70   of a database p
1b5a0 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65  age.  This buffe
1b5b0 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e  r is used intern
1b5c0 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72  ally.** during r
1b5d0 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c  ollback and will
1b5e0 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
1b5f0 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62  whenever a rollb
1b600 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20  ack.** occurs.  
1b610 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65  But other module
1b620 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73  s are free to us
1b630 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e  e it too, as lon
1b640 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62  g as.** no rollb
1b650 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69  acks are happeni
1b660 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ng..*/.void *sql
1b670 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
1b680 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ce(Pager *pPager
1b690 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
1b6a0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d  er->pTmpSpace;.}
1b6b0 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
1b6c0 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d  to set the maxim
1b6d0 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65  um database page
1b6e0 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65   count if mxPage
1b6f0 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a   is positive. .*
1b700 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
1b710 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a  s if mxPage is z
1b720 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  ero or negative.
1b730 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75    And never redu
1b740 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75  ce the.** maximu
1b750 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c  m page count bel
1b760 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ow the current s
1b770 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1b780 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72  ase..**.** Regar
1b790 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c  dless of mxPage,
1b7a0 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   return the curr
1b7b0 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  ent maximum page
1b7c0 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
1b7d0 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
1b7e0 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  geCount(Pager *p
1b7f0 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
1b800 65 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b  e){.  int nPage;
1b810 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20  .  if( mxPage>0 
1b820 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
1b830 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a  xPgno = mxPage;.
1b840 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
1b850 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
1b860 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73 71 6c  NLOCK ){.    sql
1b870 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1b880 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67  nt(pPager, &nPag
1b890 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
1b8a0 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6d 78 50  (int)pPager->mxP
1b8b0 67 6e 6f 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20  gno>=nPage );.  
1b8c0 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  }.  return pPage
1b8d0 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  r->mxPgno;.}../*
1b8e0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
1b8f0 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65  g set of routine
1b900 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69  s are used to di
1b910 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61  sable the simula
1b920 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72  ted.** I/O error
1b930 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65   mechanism.  The
1b940 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
1b950 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69  used to avoid si
1b960 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72  mulated.** error
1b970 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72  s in places wher
1b980 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  e we do not care
1b990 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a   about errors..*
1b9a0 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51  *.** Unless -DSQ
1b9b0 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75  LITE_TEST=1 is u
1b9c0 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69  sed, these routi
1b9d0 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f  nes are all no-o
1b9e0 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61  ps.** and genera
1b9f0 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23  te no code..*/.#
1ba00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1ba10 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  T.extern int sql
1ba20 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
1ba30 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e  nding;.extern in
1ba40 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
1ba50 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69  or_hit;.static i
1ba60 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f  nt saved_cnt;.vo
1ba70 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  id disable_simul
1ba80 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76  ated_io_errors(v
1ba90 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e  oid){.  saved_cn
1baa0 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  t = sqlite3_io_e
1bab0 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20  rror_pending;.  
1bac0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
1bad0 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d  _pending = -1;.}
1bae0 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d  .void enable_sim
1baf0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
1bb00 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
1bb10 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
1bb20 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a  ng = saved_cnt;.
1bb30 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
1bb40 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
1bb50 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
1bb60 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73   define enable_s
1bb70 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
1bb80 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  rs().#endif../*.
1bb90 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73  ** Read the firs
1bba0 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74  t N bytes from t
1bbb0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
1bbc0 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65  the file into me
1bbd0 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65  mory.** that pDe
1bbe0 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a  st points to. .*
1bbf0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
1bc00 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
1bc10 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
1bc20 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29   (zFilename=="")
1bc30 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f  , or.** opened o
1bc40 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68  n a file less th
1bc50 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69  an N bytes in si
1bc60 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62  ze, the output b
1bc70 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f  uffer is.** zero
1bc80 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
1bc90 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72   returned. The r
1bca0 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69  ationale for thi
1bcb0 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20 0a  s is that this .
1bcc0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  ** function is u
1bcd0 73 65 64 20 74 6f 20 72 65 61 64 20 64 61 74 61  sed to read data
1bce0 62 61 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e  base headers, an
1bcf0 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e  d a new transien
1bd00 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a  t or.** zero siz
1bd10 65 64 20 64 61 74 61 62 61 73 65 20 68 61 73 20  ed database has 
1bd20 61 20 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f  a header than co
1bd30 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20  nsists entirely 
1bd40 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a  of zeroes..**.**
1bd50 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72   If any IO error
1bd60 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49   apart from SQLI
1bd70 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
1bd80 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  EAD is encounter
1bd90 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  ed,.** the error
1bda0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1bdb0 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  d to the caller 
1bdc0 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  and the contents
1bdd0 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75   of the.** outpu
1bde0 74 20 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e  t buffer undefin
1bdf0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
1be00 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
1be10 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61  eader(Pager *pPa
1be20 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69  ger, int N, unsi
1be30 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74  gned char *pDest
1be40 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1be50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65  LITE_OK;.  memse
1be60 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a  t(pDest, 0, N);.
1be70 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1be80 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
1be90 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1bea0 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72   );..  /* This r
1beb0 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63  outine is only c
1bec0 61 6c 6c 65 64 20 62 79 20 62 74 72 65 65 20 69  alled by btree i
1bed0 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
1bee0 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74   creating.  ** t
1bef0 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e  he Pager object.
1bf00 20 20 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20    There has not 
1bf10 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e  been an opportun
1bf20 69 74 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f  ity to transitio
1bf30 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f  n.  ** to WAL mo
1bf40 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  de yet..  */.  a
1bf50 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
1bf60 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
1bf70 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
1bf80 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
1bf90 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20  IOTRACE(("DBHDR 
1bfa0 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67  %p 0 %d\n", pPag
1bfb0 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d  er, N)).    rc =
1bfc0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
1bfd0 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74  Pager->fd, pDest
1bfe0 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , N, 0);.    if(
1bff0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
1c000 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1c010 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c020 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
1c030 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1c040 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1c050 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
1c060 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
1c070 74 61 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f  tabase file asso
1c080 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20  ciated .** with 
1c090 70 50 61 67 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  pPager. Normally
1c0a0 2c 20 74 68 69 73 20 69 73 20 63 61 6c 63 75 6c  , this is calcul
1c0b0 61 74 65 64 20 61 73 20 28 3c 64 62 20 66 69 6c  ated as (<db fil
1c0c0 65 20 73 69 7a 65 3e 2f 3c 70 61 67 65 2d 73 69  e size>/<page-si
1c0d0 7a 65 3e 29 2e 0a 2a 2a 20 48 6f 77 65 76 65 72  ze>)..** However
1c0e0 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  , if the file is
1c0f0 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c   between 1 and <
1c100 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73  page-size> bytes
1c110 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a   in size, then .
1c120 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69  ** this is consi
1c130 64 65 72 65 64 20 61 20 31 20 70 61 67 65 20 66  dered a 1 page f
1c140 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ile..**.** If th
1c150 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 72  e pager is in er
1c160 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74  ror state when t
1c170 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1c180 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  called, then the
1c190 0a 2a 2a 20 65 72 72 6f 72 20 73 74 61 74 65 20  .** error state 
1c1a0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1c1b0 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61  turned and *pnPa
1c1c0 67 65 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  ge left unchange
1c1d0 64 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20 74 68 65  d. Or,.** if the
1c1e0 20 66 69 6c 65 20 73 79 73 74 65 6d 20 68 61 73   file system has
1c1f0 20 74 6f 20 62 65 20 71 75 65 72 69 65 64 20 66   to be queried f
1c200 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  or the size of t
1c210 68 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74  he file and.** t
1c220 68 65 20 71 75 65 72 79 20 61 74 74 65 6d 70 74  he query attempt
1c230 20 72 65 74 75 72 6e 73 20 61 6e 20 49 4f 20 65   returns an IO e
1c240 72 72 6f 72 2c 20 74 68 65 20 49 4f 20 65 72 72  rror, the IO err
1c250 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1c260 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50 61  ned.** and *pnPa
1c270 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  ge is left uncha
1c280 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  nged..**.** Othe
1c290 72 77 69 73 65 2c 20 69 66 20 65 76 65 72 79 74  rwise, if everyt
1c2a0 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
1c2b0 75 6c 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  ul, then SQLITE_
1c2c0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
1c2d0 2a 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73  * and *pnPage is
1c2e0 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
1c2f0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
1c300 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
1c310 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1c320 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
1c330 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e  *pPager, int *pn
1c340 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50  Page){.  Pgno nP
1c350 61 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  age = 0;        
1c360 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
1c370 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67  eturn via *pnPag
1c380 65 20 2a 2f 0a 0a 20 20 2f 2a 20 44 65 74 65 72  e */..  /* Deter
1c390 6d 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mine the number 
1c3a0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
1c3b0 66 69 6c 65 2e 20 53 74 6f 72 65 20 74 68 69 73  file. Store this
1c3c0 20 69 6e 20 6e 50 61 67 65 2e 20 2a 2f 0a 20 20   in nPage. */.  
1c3d0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
1c3e0 7a 65 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 6e  zeValid ){.    n
1c3f0 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Page = pPager->d
1c400 62 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  bSize;.  }else{.
1c410 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20      int rc;     
1c420 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
1c430 72 72 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79  rror returned by
1c440 20 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f   OsFileSize() */
1c450 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20  .    i64 n = 0; 
1c460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c470 46 69 6c 65 20 73 69 7a 65 20 69 6e 20 62 79 74  File size in byt
1c480 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  es returned by O
1c490 73 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 0a  sFileSize() */..
1c4a0 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
1c4b0 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70  Wal(pPager) && p
1c4c0 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
1c4d0 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
1c4e0 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 44 62      sqlite3WalDb
1c4f0 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61  size(pPager->pWa
1c500 6c 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  l, &nPage);.    
1c510 7d 0a 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65  }..    if( nPage
1c520 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
1c530 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1c540 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
1c550 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
1c560 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28       if( isOpen(
1c570 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
1c580 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
1c590 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
1c5a0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
1c5b0 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 20 29  ager->fd, &n)) )
1c5c0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65  {.          page
1c5d0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
1c5e0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rc);.          r
1c5f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1c600 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1c610 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70    if( n>0 && n<p
1c620 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1c630 29 7b 0a 20 20 20 20 20 20 20 20 6e 50 61 67 65  ){.        nPage
1c640 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
1c650 65 7b 0a 20 20 20 20 20 20 20 20 6e 50 61 67 65  e{.        nPage
1c660 20 3d 20 28 50 67 6e 6f 29 28 6e 20 2f 20 70 50   = (Pgno)(n / pP
1c670 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1c680 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c690 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
1c6a0 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
1c6b0 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
1c6c0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
1c6d0 67 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ge;.      pPager
1c6e0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e  ->dbFileSize = n
1c6f0 50 61 67 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Page;.      pPag
1c700 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
1c710 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
1c720 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72    /* If the curr
1c730 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ent number of pa
1c740 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ges in the file 
1c750 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1c760 74 68 65 20 0a 20 20 2a 2a 20 63 6f 6e 66 69 67  the .  ** config
1c770 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67  ured maximum pag
1c780 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65  er number, incre
1c790 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20  ase the allowed 
1c7a0 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68  limit so.  ** th
1c7b0 61 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20  at the file can 
1c7c0 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20  be read..  */.  
1c7d0 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72  if( nPage>pPager
1c7e0 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
1c7f0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
1c800 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20   (Pgno)nPage;.  
1c810 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
1c820 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20  output variable 
1c830 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
1c840 45 5f 4f 4b 20 2a 2f 0a 20 20 2a 70 6e 50 61 67  E_OK */.  *pnPag
1c850 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74  e = nPage;.  ret
1c860 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1c870 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  .../*.** Try to 
1c880 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66  obtain a lock of
1c890 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f   type locktype o
1c8a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1c8b0 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d  ile. If.** a sim
1c8c0 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72 20  ilar or greater 
1c8d0 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
1c8e0 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74  held, this funct
1c8f0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a  ion is a no-op.*
1c900 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  * (returning SQL
1c910 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65  ITE_OK immediate
1c920 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ly)..**.** Other
1c930 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f  wise, attempt to
1c940 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b   obtain the lock
1c950 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
1c960 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a  Lock(). Invoke .
1c970 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ** the busy call
1c980 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b  back if the lock
1c990 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f   is currently no
1c9a0 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70  t available. Rep
1c9b0 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68  eat .** until th
1c9c0 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
1c9d0 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72  returns false or
1c9e0 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d   until the attem
1c9f0 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e  pt to .** obtain
1ca00 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65   the lock succee
1ca10 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ds..**.** Return
1ca20 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
1ca30 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72  ccess and an err
1ca40 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61  or code if we ca
1ca50 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74  nnot obtain.** t
1ca60 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20  he lock. If the 
1ca70 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
1ca80 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73   successfully, s
1ca90 65 74 20 74 68 65 20 50 61 67 65 72 2e 73 74 61  et the Pager.sta
1caa0 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  te .** variable 
1cab0 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f  to locktype befo
1cac0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
1cad0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1cae0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50  r_wait_on_lock(P
1caf0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
1cb00 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
1cb10 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1cb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb30 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1cb40 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  de */..  /* The 
1cb50 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d  OS lock values m
1cb60 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
1cb70 61 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63  as the Pager loc
1cb80 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73  k values */.  as
1cb90 73 65 72 74 28 20 50 41 47 45 52 5f 53 48 41 52  sert( PAGER_SHAR
1cba0 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ED==SHARED_LOCK 
1cbb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
1cbc0 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53  ER_RESERVED==RES
1cbd0 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
1cbe0 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 45 58  assert( PAGER_EX
1cbf0 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49  CLUSIVE==EXCLUSI
1cc00 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  VE_LOCK );..  /*
1cc10 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
1cc20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b  currently unlock
1cc30 65 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65  ed then the size
1cc40 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e   must be unknown
1cc50 2e 20 49 74 0a 20 20 2a 2a 20 6d 75 73 74 20 6e  . It.  ** must n
1cc60 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64  ot have been mod
1cc70 69 66 69 65 64 20 61 74 20 74 68 69 73 20 70 6f  ified at this po
1cc80 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  int..  */.  asse
1cc90 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1cca0 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
1ccb0 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
1ccc0 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 61  eValid==0 );.  a
1ccd0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1cce0 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
1ccf0 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  ED || pPager->db
1cd00 4d 6f 64 69 66 69 65 64 3d 3d 30 20 29 3b 0a 0a  Modified==0 );..
1cd10 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
1cd20 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61  this is either a
1cd30 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20   no-op (because 
1cd40 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
1cd50 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65  ck is .  ** alre
1cd60 61 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65  ady held, or one
1cd70 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 73 74   of the transist
1cd80 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62 75  ions that the bu
1cd90 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20  sy-handler.  ** 
1cda0 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64  may be invoked d
1cdb0 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67  uring, according
1cdc0 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20   to the comment 
1cdd0 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74  above.  ** sqlit
1cde0 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
1cdf0 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  ndler()..  */.  
1ce00 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
1ce10 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65  >state>=locktype
1ce20 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ).       || (pPa
1ce30 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
1ce40 52 5f 55 4e 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b  R_UNLOCK && lock
1ce50 74 79 70 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  type==PAGER_SHAR
1ce60 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  ED).       || (p
1ce70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
1ce80 47 45 52 5f 52 45 53 45 52 56 45 44 20 26 26 20  GER_RESERVED && 
1ce90 6c 6f 63 6b 74 79 70 65 3d 3d 50 41 47 45 52 5f  locktype==PAGER_
1cea0 45 58 43 4c 55 53 49 56 45 29 0a 20 20 29 3b 0a  EXCLUSIVE).  );.
1ceb0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1cec0 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29  tate>=locktype )
1ced0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1cee0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
1cef0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63     do {.      rc
1cf00 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
1cf10 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63  (pPager->fd, loc
1cf20 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69  ktype);.    }whi
1cf30 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
1cf40 55 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78  USY && pPager->x
1cf50 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67  BusyHandler(pPag
1cf60 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
1cf70 41 72 67 29 20 29 3b 0a 20 20 20 20 69 66 28 20  Arg) );.    if( 
1cf80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1cf90 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
1cfa0 74 61 74 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74  tate = (u8)lockt
1cfb0 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ype;.      IOTRA
1cfc0 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c  CE(("LOCK %p %d\
1cfd0 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b  n", pPager, lock
1cfe0 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d  type)).    }.  }
1cff0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d000 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  ./*.** Function 
1d010 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
1d020 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
1d030 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65   checks that one
1d040 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c   of the .** foll
1d050 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f  owing is true fo
1d060 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  r all dirty page
1d070 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  s currently in t
1d080 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a  he page-cache:.*
1d090 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61  *.**   a) The pa
1d0a0 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge number is les
1d0b0 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
1d0c0 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
1d0d0 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72  he .**      curr
1d0e0 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d 61  ent database ima
1d0f0 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52  ge, in pages, OR
1d100 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74  .**.**   b) if t
1d110 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
1d120 77 65 72 65 20 77 72 69 74 74 65 6e 20 61 74 20  were written at 
1d130 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f  this time, it wo
1d140 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  uld not.**      
1d150 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  be necessary to 
1d160 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
1d170 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f  t content out to
1d180 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
1d190 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65 74  .**      (as det
1d1a0 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74  ermined by funct
1d1b0 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73  ion subjRequires
1d1c0 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49  Page())..**.** I
1d1d0 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  f the condition 
1d1e0 61 73 73 65 72 74 65 64 20 62 79 20 74 68 69 73  asserted by this
1d1f0 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e   function were n
1d200 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65  ot true, and the
1d210 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 77  .** dirty page w
1d220 65 72 65 20 74 6f 20 62 65 20 64 69 73 63 61 72  ere to be discar
1d230 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63  ded from the cac
1d240 68 65 20 76 69 61 20 74 68 65 20 70 61 67 65 72  he via the pager
1d250 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74  Stress().** rout
1d260 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73 73  ine, pagerStress
1d270 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69  () would not wri
1d280 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
1d290 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a  age content to.*
1d2a0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
1d2b0 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f  ile. If a savepo
1d2c0 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  int transaction 
1d2d0 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  were rolled back
1d2e0 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68   after.** this h
1d2f0 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72  appened, the cor
1d300 72 65 63 74 20 62 65 68 61 76 69 6f 75 72 20 77  rect behaviour w
1d310 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f  ould be to resto
1d320 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  re the current.*
1d330 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
1d340 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20   page. However, 
1d350 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65  since this conte
1d360 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  nt is not presen
1d370 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74  t in either.** t
1d380 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d390 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20   or the portion 
1d3a0 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
1d3b0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20  journal and .** 
1d3c0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  sub-journal roll
1d3d0 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74  ed back the cont
1d3e0 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ent could not be
1d3f0 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68   restored and th
1d400 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d  e.** database im
1d410 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65  age would become
1d420 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20   corrupt. It is 
1d430 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e  therefore fortun
1d440 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69  ate that .** thi
1d450 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63  s circumstance c
1d460 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a  annot arise..*/.
1d470 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1d480 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63  TE_DEBUG).static
1d490 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
1d4a0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62  cateConstraintCb
1d4b0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1d4c0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
1d4d0 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
1d4e0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62  ;.  assert( !sub
1d4f0 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
1d500 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c  g) || pPg->pgno<
1d510 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62  =pPg->pPager->db
1d520 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63  Size );.}.static
1d530 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
1d540 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50  cateConstraint(P
1d550 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1d560 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74   sqlite3PcacheIt
1d570 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65  erateDirty(pPage
1d580 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65  r->pPCache, asse
1d590 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
1d5a0 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65  aintCb);.}.#else
1d5b0 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  .# define assert
1d5c0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
1d5d0 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69  nt(pPager).#endi
1d5e0 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  f../*.** Truncat
1d5f0 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
1d600 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d  database file im
1d610 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67  age to nPage pag
1d620 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  es. This .** fun
1d630 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61  ction does not a
1d640 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74  ctually modify t
1d650 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d660 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a   on disk. It .**
1d670 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69   just sets the i
1d680 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66  nternal state of
1d690 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
1d6a0 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a  t so that the .*
1d6b0 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c  * truncation wil
1d6c0 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74  l be done when t
1d6d0 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
1d6e0 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
1d6f0 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
1d700 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
1d710 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50  eImage(Pager *pP
1d720 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
1d730 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
1d740 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
1d750 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1d760 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50  ager->dbSize>=nP
1d770 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
1d780 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
1d790 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
1d7a0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
1d7b0 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 61 73  ze = nPage;.  as
1d7c0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
1d7d0 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 3b 0a  traint(pPager);.
1d7e0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
1d7f0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1d800 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  d before attempt
1d810 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ing a hot-journa
1d820 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a  l rollback. It.*
1d830 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72  * syncs the jour
1d840 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b  nal file to disk
1d850 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50 61 67  , then sets pPag
1d860 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74  er->journalHdr t
1d870 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66  o the.** size of
1d880 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1d890 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61  e so that the pa
1d8a0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72  ger_playback() r
1d8b0 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20  outine knows.** 
1d8c0 74 68 61 74 20 74 68 65 20 65 6e 74 69 72 65 20  that the entire 
1d8d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
1d8e0 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a   been synced..**
1d8f0 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f  .** Syncing a ho
1d900 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73  t-journal to dis
1d910 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  k before attempt
1d920 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ing to roll it b
1d930 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20  ack ensures .** 
1d940 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d  that if a power-
1d950 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64  failure occurs d
1d960 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61  uring the rollba
1d970 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20  ck, the process 
1d980 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73  that.** attempts
1d990 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77   rollback follow
1d9a0 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76  ing system recov
1d9b0 65 72 79 20 73 65 65 73 20 74 68 65 20 73 61 6d  ery sees the sam
1d9c0 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e  e journal.** con
1d9d0 74 65 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f  tent as this pro
1d9e0 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  cess..**.** If e
1d9f0 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61  verything goes a
1da00 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54  s planned, SQLIT
1da10 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1da20 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a  . Otherwise, .**
1da30 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1da40 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
1da50 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f   int pagerSyncHo
1da60 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
1da70 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1da80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1da90 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
1daa0 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
1dab0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
1dac0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49  Pager->jfd, SQLI
1dad0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b  TE_SYNC_NORMAL);
1dae0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1daf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1db00 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1db10 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
1db20 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75  fd, &pPager->jou
1db30 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20  rnalHdr);.  }.  
1db40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1db50 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
1db60 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72   page cache.  Fr
1db70 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e  ee all memory an
1db80 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  d close all file
1db90 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  s..**.** If a tr
1dba0 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e  ansaction was in
1dbb0 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74   progress when t
1dbc0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1dbd0 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74  alled, that.** t
1dbe0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
1dbf0 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20  lled back.  All 
1dc00 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
1dc10 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
1dc20 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d  d.** and their m
1dc30 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20  emory is freed. 
1dc40 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
1dc50 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63  use a page assoc
1dc60 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
1dc70 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66  is page cache af
1dc80 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
1dc90 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c  n returns will l
1dca0 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20  ikely.** result 
1dcb0 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
1dcc0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1dcd0 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  on always succee
1dce0 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  ds. If a transac
1dcf0 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
1dd00 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20  n attempt.** is 
1dd10 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  made to roll it 
1dd20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f  back. If an erro
1dd30 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
1dd40 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a  the rollback .**
1dd50 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d   a hot journal m
1dd60 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68  ay be left in th
1dd70 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74  e filesystem but
1dd80 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74   no error is ret
1dd90 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  urned.** to the 
1dda0 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  caller..*/.int s
1ddb0 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
1ddc0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1ddd0 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28 75  .  u8 *pTmp = (u
1dde0 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  8 *)pPager->pTmp
1ddf0 53 70 61 63 65 3b 0a 0a 20 20 64 69 73 61 62 6c  Space;..  disabl
1de00 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
1de10 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74  rrors();.  sqlit
1de20 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
1de30 6c 6f 63 28 29 3b 0a 20 20 70 50 61 67 65 72 2d  loc();.  pPager-
1de40 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20  >errCode = 0;.  
1de50 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
1de60 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64  eMode = 0;.#ifnd
1de70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1de80 41 4c 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 43  AL.  sqlite3WalC
1de90 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 57 61  lose(pPager->pWa
1dea0 6c 2c 0a 20 20 20 20 28 70 50 61 67 65 72 2d 3e  l,.    (pPager->
1deb0 6e 6f 53 79 6e 63 20 3f 20 30 20 3a 20 70 50 61  noSync ? 0 : pPa
1dec0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
1ded0 2c 20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  , .    pPager->p
1dee0 61 67 65 53 69 7a 65 2c 20 70 54 6d 70 0a 20 20  ageSize, pTmp.  
1def0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 57 61  );.  pPager->pWa
1df00 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  l = 0;.#endif.  
1df10 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
1df20 65 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  er);.  if( MEMDB
1df30 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e   ){.    pager_un
1df40 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
1df50 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65  }else{.    /* Se
1df60 74 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 48  t Pager.journalH
1df70 64 72 20 74 6f 20 2d 31 20 66 6f 72 20 74 68 65  dr to -1 for the
1df80 20 62 65 6e 65 66 69 74 20 6f 66 20 74 68 65 20   benefit of the 
1df90 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
1dfa0 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 68   .    ** call wh
1dfb0 69 63 68 20 6d 61 79 20 62 65 20 6d 61 64 65 20  ich may be made 
1dfc0 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
1dfd0 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
1dfe0 63 6b 28 29 2e 20 49 66 20 69 74 0a 20 20 20 20  ck(). If it.    
1dff0 2a 2a 20 69 73 20 6e 6f 74 20 2d 31 2c 20 74 68  ** is not -1, th
1e000 65 6e 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  en the unsynced 
1e010 70 6f 72 74 69 6f 6e 20 6f 66 20 61 6e 20 6f 70  portion of an op
1e020 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  en journal file 
1e030 6d 61 79 0a 20 20 20 20 2a 2a 20 62 65 20 70 6c  may.    ** be pl
1e040 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74  ayed back into t
1e050 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
1e060 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
1e070 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 20 20 20  occurs while.   
1e080 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70   ** this is happ
1e090 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62  ening, the datab
1e0a0 61 73 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63  ase may become c
1e0b0 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2f 0a 20  orrupt..    */. 
1e0c0 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
1e0d0 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
1e0e0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
1e0f0 6f 64 65 20 3d 20 70 61 67 65 72 53 79 6e 63 48  ode = pagerSyncH
1e100 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
1e110 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  );.    }.    pag
1e120 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
1e130 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
1e140 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e  .  sqlite3EndBen
1e150 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65  ignMalloc();.  e
1e160 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
1e170 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50  io_errors();.  P
1e180 41 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53  AGERTRACE(("CLOS
1e190 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  E %d\n", PAGERID
1e1a0 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f  (pPager)));.  IO
1e1b0 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70  TRACE(("CLOSE %p
1e1c0 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
1e1d0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
1e1e0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73  Pager->jfd);.  s
1e1f0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
1e200 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c  ager->fd);.  sql
1e210 69 74 65 33 50 61 67 65 46 72 65 65 28 70 54 6d  ite3PageFree(pTm
1e220 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  p);.  sqlite3Pca
1e230 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  cheClose(pPager-
1e240 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64  >pPCache);..#ifd
1e250 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
1e260 44 45 43 0a 20 20 69 66 28 20 70 50 61 67 65 72  DEC.  if( pPager
1e270 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20 70  ->xCodecFree ) p
1e280 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65  Pager->xCodecFre
1e290 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63  e(pPager->pCodec
1e2a0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
1e2b0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53  ert( !pPager->aS
1e2c0 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61  avepoint && !pPa
1e2d0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
1e2e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73  );.  assert( !is
1e2f0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
1e300 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61  ) && !isOpen(pPa
1e310 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20  ger->sjfd) );.. 
1e320 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
1e330 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
1e340 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
1e350 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
1e360 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
1e370 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
1e380 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
1e390 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65   number for page
1e3a0 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71   pPg..*/.Pgno sq
1e3b0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
1e3c0 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 50 67  mber(DbPage *pPg
1e3d0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  ){.  return pPg-
1e3e0 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a  >pgno;.}.#endif.
1e3f0 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
1e400 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
1e410 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50  ount for page pP
1e420 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  g..*/.void sqlit
1e430 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67  e3PagerRef(DbPag
1e440 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74  e *pPg){.  sqlit
1e450 65 33 50 63 61 63 68 65 52 65 66 28 70 50 67 29  e3PcacheRef(pPg)
1e460 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
1e470 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20  the journal. In 
1e480 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b  other words, mak
1e490 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70  e sure all the p
1e4a0 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ages that have.*
1e4b0 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  * been written t
1e4c0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  o the journal ha
1e4d0 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63  ve actually reac
1e4e0 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20  hed the surface 
1e4f0 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  of the.** disk a
1e500 6e 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  nd can be restor
1e510 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
1e520 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  of a hot-journal
1e530 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
1e540 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65   If the Pager.ne
1e550 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 6e  edSync flag is n
1e560 6f 74 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69  ot set, then thi
1e570 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 0a  s function is a.
1e580 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77  ** no-op. Otherw
1e590 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73  ise, the actions
1e5a0 20 72 65 71 75 69 72 65 64 20 64 65 70 65 6e 64   required depend
1e5b0 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   on the journal-
1e5c0 6d 6f 64 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20  mode.** and the 
1e5d0 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
1e5e0 69 73 74 69 63 73 20 6f 66 20 74 68 65 20 74 68  istics of the th
1e5f0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61  e file-system, a
1e600 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
1e610 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72     * If the jour
1e620 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69  nal file is an i
1e630 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
1e640 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e   file, no action
1e650 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20   need.**     be 
1e660 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  taken..**.**   *
1e670 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1e680 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e  he device does n
1e690 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53  ot support the S
1e6a0 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65  AFE_APPEND prope
1e6b0 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e  rty,.**     then
1e6c0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
1e6d0 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
1e6e0 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75  ntly written jou
1e6f0 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20  rnal header.**  
1e700 20 20 20 69 73 20 75 70 64 61 74 65 64 20 74 6f     is updated to
1e710 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d   contain the num
1e720 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72  ber of journal r
1e730 65 63 6f 72 64 73 20 74 68 61 74 20 68 61 76 65  ecords that have
1e740 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69  .**     been wri
1e750 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  tten following i
1e760 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  t. If the pager 
1e770 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  is operating in 
1e780 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20  full-sync.**    
1e790 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
1e7a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
1e7b0 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68  synced before th
1e7c0 69 73 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  is field is upda
1e7d0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ted..**.**   * I
1e7e0 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65  f the device doe
1e7f0 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68  s not support th
1e800 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f  e SEQUENTIAL pro
1e810 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20  perty, then .** 
1e820 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65      journal file
1e830 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a   is synced..**.*
1e840 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d  * Or, in pseudo-
1e850 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  code:.**.**   if
1e860 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79  ( NOT <in-memory
1e870 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20   journal> ){.** 
1e880 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45      if( NOT SAFE
1e890 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20  _APPEND ){.**   
1e8a0 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79      if( <full-sy
1e8b0 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63  nc mode> ) xSync
1e8c0 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29  (<journal file>)
1e8d0 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61  ;.**       <upda
1e8e0 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a  te nRec field>.*
1e8f0 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20  *     } .**     
1e900 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49  if( NOT SEQUENTI
1e910 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72  AL ) xSync(<jour
1e920 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20  nal file>);.**  
1e930 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67   }.**.** The Pag
1e940 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
1e950 20 69 73 20 6e 65 76 65 72 20 62 65 20 73 65 74   is never be set
1e960 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
1e970 69 6c 65 73 2c 20 6f 72 20 61 6e 79 0a 2a 2a 20  iles, or any.** 
1e980 66 69 6c 65 20 6f 70 65 72 61 74 69 6e 67 20 69  file operating i
1e990 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 28  n no-sync mode (
1e9a0 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 73 65 74  Pager.noSync set
1e9b0 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 29 2e 0a 2a   to non-zero)..*
1e9c0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
1e9d0 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ul, this routine
1e9e0 20 63 6c 65 61 72 73 20 74 68 65 20 50 47 48 44   clears the PGHD
1e9f0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
1ea00 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61   of every .** pa
1ea10 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  ge currently hel
1ea20 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f  d in memory befo
1ea30 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  re returning SQL
1ea40 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f  ITE_OK. If an IO
1ea50 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63  .** error is enc
1ea60 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74  ountered, then t
1ea70 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
1ea80 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
1ea90 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73  the caller..*/.s
1eaa0 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
1eab0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
1eac0 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
1ead0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  er->needSync ){.
1eae0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
1eaf0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
1eb00 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1eb10 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
1eb20 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
1eb30 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
1eb40 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb60 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1eb70 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  ode */.      con
1eb80 73 74 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c  st int iDc = sql
1eb90 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
1eba0 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
1ebb0 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61  er->fd);.      a
1ebc0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1ebd0 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20  ager->jfd) );.. 
1ebe0 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
1ebf0 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
1ec00 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20  FE_APPEND) ){.  
1ec10 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c        /* This bl
1ec20 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61  ock deals with a
1ec30 6e 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65  n obscure proble
1ec40 6d 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20 63  m. If the last c
1ec50 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20  onnection.      
1ec60 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20    ** that wrote 
1ec70 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
1ec80 20 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69   was operating i
1ec90 6e 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75  n persistent-jou
1eca0 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
1ecb0 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a  mode, then the j
1ecc0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
1ecd0 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63  at this point ac
1ece0 74 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72  tually be larger
1ecf0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e  .        ** than
1ed00 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
1ed10 66 20 62 79 74 65 73 2e 20 49 66 20 74 68 65 20  f bytes. If the 
1ed20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68  next thing in th
1ed30 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  e journal.      
1ed40 20 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e    ** file happen
1ed50 73 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61  s to be a journa
1ed60 6c 2d 68 65 61 64 65 72 20 28 77 72 69 74 74 65  l-header (writte
1ed70 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  n as part of the
1ed80 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76  .        ** prev
1ed90 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27  ious connection'
1eda0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  s transaction), 
1edb0 61 6e 64 20 61 20 63 72 61 73 68 20 6f 72 20 70  and a crash or p
1edc0 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20  ower-failure .  
1edd0 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20        ** occurs 
1ede0 61 66 74 65 72 20 6e 52 65 63 20 69 73 20 75 70  after nRec is up
1edf0 64 61 74 65 64 20 62 75 74 20 62 65 66 6f 72 65  dated but before
1ee00 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
1ee10 20 77 72 69 74 65 73 20 0a 20 20 20 20 20 20 20   writes .       
1ee20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73   ** anything els
1ee30 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
1ee40 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74   file (or commit
1ee50 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73  s/rolls back its
1ee60 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61   .        ** tra
1ee70 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20  nsaction), then 
1ee80 53 51 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d  SQLite may becom
1ee90 65 20 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20  e confused when 
1eea0 64 6f 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20  doing the .     
1eeb0 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61     ** hot-journa
1eec0 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f  l rollback follo
1eed0 77 69 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49  wing recovery. I
1eee0 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20  t may roll back 
1eef0 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  all.        ** o
1ef00 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  f this connectio
1ef10 6e 73 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72  ns data, then pr
1ef20 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67  oceed to rolling
1ef30 20 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20   back the old,. 
1ef40 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66         ** out-of
1ef50 2d 64 61 74 65 20 64 61 74 61 20 74 68 61 74 20  -date data that 
1ef60 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61  follows it. Data
1ef70 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
1ef80 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1ef90 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61      ** To work a
1efa0 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74  round this, if t
1efb0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1efc0 64 6f 65 73 20 61 70 70 65 61 72 20 74 6f 20 63  does appear to c
1efd0 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a  ontain.        *
1efe0 2a 20 61 20 76 61 6c 69 64 20 68 65 61 64 65 72  * a valid header
1eff0 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72   following Pager
1f000 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65  .journalOff, the
1f010 6e 20 77 72 69 74 65 20 61 20 30 78 30 30 0a 20  n write a 0x00. 
1f020 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74         ** byte t
1f030 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69  o the start of i
1f040 74 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20  t to prevent it 
1f050 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67  from being recog
1f060 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  nized..        *
1f070 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72  *.        ** Var
1f080 69 61 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66  iable iNextHdrOf
1f090 66 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74  fset is set to t
1f0a0 68 65 20 6f 66 66 73 65 74 20 61 74 20 77 68 69  he offset at whi
1f0b0 63 68 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  ch this.        
1f0c0 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68  ** problematic h
1f0d0 65 61 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72  eader will occur
1f0e0 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20  , if it exists. 
1f0f0 61 4d 61 67 69 63 20 69 73 20 75 73 65 64 20 0a  aMagic is used .
1f100 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20          ** as a 
1f110 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72  temporary buffer
1f120 20 74 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20   to inspect the 
1f130 66 69 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20  first couple of 
1f140 62 79 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20  bytes of.       
1f150 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61   ** the potentia
1f160 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  l journal header
1f170 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1f180 20 20 20 20 20 69 36 34 20 69 4e 65 78 74 48 64       i64 iNextHd
1f190 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  rOffset;.       
1f1a0 20 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20   u8 aMagic[8];. 
1f1b0 20 20 20 20 20 20 20 75 38 20 7a 48 65 61 64 65         u8 zHeade
1f1c0 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
1f1d0 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20  lMagic)+4];..   
1f1e0 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61       memcpy(zHea
1f1f0 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  der, aJournalMag
1f200 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
1f210 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20  nalMagic));.    
1f220 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
1f230 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
1f240 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70  ournalMagic)], p
1f250 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20  Pager->nRec);.. 
1f260 20 20 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f         iNextHdrO
1f270 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48  ffset = journalH
1f280 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
1f290 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1f2a0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
1f2b0 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
1f2c0 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66  , 8, iNextHdrOff
1f2d0 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  set);.        if
1f2e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f2f0 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61  && 0==memcmp(aMa
1f300 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
1f310 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20  ic, 8) ){.      
1f320 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1f330 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30   u8 zerobyte = 0
1f340 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1f350 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
1f360 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65  pPager->jfd, &ze
1f370 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74  robyte, 1, iNext
1f380 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  HdrOffset);.    
1f390 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1f3a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f3b0 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  && rc!=SQLITE_IO
1f3c0 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1f3d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
1f3e0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
1f3f0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ..        /* Wri
1f400 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  te the nRec valu
1f410 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
1f420 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  al file header. 
1f430 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  If in.        **
1f440 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75   full-synchronou
1f450 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65  s mode, sync the
1f460 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20   journal first. 
1f470 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
1f480 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c  t.        ** all
1f490 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79   data has really
1f4a0 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65   hit the disk be
1f4b0 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64  fore nRec is upd
1f4c0 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20  ated to mark.   
1f4d0 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20       ** it as a 
1f4e0 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f  candidate for ro
1f4f0 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20  llback..        
1f500 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
1f510 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
1f520 65 64 20 69 66 20 74 68 65 20 70 65 72 73 69 73  ed if the persis
1f530 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f  tent media suppo
1f540 72 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  rts the.        
1f550 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70  ** SAFE_APPEND p
1f560 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73 65  roperty. Because
1f570 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   in this case it
1f580 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
1f590 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72   .        ** for
1f5a0 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74 6f   garbage data to
1f5b0 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20   be appended to 
1f5c0 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52  the file, the nR
1f5d0 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20  ec field.       
1f5e0 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64   ** is populated
1f5f0 20 77 69 74 68 20 30 78 46 46 46 46 46 46 46 46   with 0xFFFFFFFF
1f600 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
1f610 6c 20 68 65 61 64 65 72 20 69 73 20 77 72 69 74  l header is writ
1f620 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ten.        ** a
1f630 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74  nd never needs t
1f640 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20  o be updated..  
1f650 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1f660 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
1f670 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63  lSync && 0==(iDc
1f680 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
1f690 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
1f6a0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
1f6b0 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E(("SYNC journal
1f6c0 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
1f6d0 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
1f6e0 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
1f6f0 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  ("JSYNC %p\n", p
1f700 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
1f710 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1f720 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
1f730 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
1f740 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20  lags);.         
1f750 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f760 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1f770 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f780 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
1f790 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61   %p %lld\n", pPa
1f7a0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
1f7b0 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20 20  rnalHdr));.     
1f7c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1f7d0 73 57 72 69 74 65 28 0a 20 20 20 20 20 20 20 20  sWrite(.        
1f7e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c      pPager->jfd,
1f7f0 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66   zHeader, sizeof
1f800 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67 65  (zHeader), pPage
1f810 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20  r->journalHdr.  
1f820 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
1f830 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f840 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1f850 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1f860 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
1f870 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
1f880 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41  L) ){.        PA
1f890 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20  GERTRACE(("SYNC 
1f8a0 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
1f8b0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1f8c0 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54  )));.        IOT
1f8d0 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
1f8e0 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
1f8f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f900 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
1f910 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
1f920 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20  c_flags| .      
1f930 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e      (pPager->syn
1f940 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  c_flags==SQLITE_
1f950 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45  SYNC_FULL?SQLITE
1f960 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30  _SYNC_DATAONLY:0
1f970 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
1f980 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1f990 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1f9a0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1f9b0 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f  }..    /* The jo
1f9c0 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a  urnal file was j
1f9d0 75 73 74 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ust successfully
1f9e0 20 73 79 6e 63 65 64 2e 20 53 65 74 20 50 61 67   synced. Set Pag
1f9f0 65 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20 20  er.needSync .   
1fa00 20 2a 2a 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20   ** to zero and 
1fa10 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f  clear the PGHDR_
1fa20 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f  NEED_SYNC flag o
1fa30 6e 20 61 6c 6c 20 70 61 67 65 73 73 2e 0a 20 20  n all pagess..  
1fa40 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
1fa50 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
1fa60 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1fa70 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20  alStarted = 1;. 
1fa80 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1fa90 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
1faa0 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
1fab0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
1fac0 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67  arSyncFlags(pPag
1fad0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
1fae0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
1faf0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1fb00 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
1fb10 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c  the first in a l
1fb20 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69  inked list of di
1fb30 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63  rty pages connec
1fb40 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67  ted.** by the Pg
1fb50 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74  Hdr.pDirty point
1fb60 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
1fb70 6e 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e  n writes each on
1fb80 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d  e of the.** in-m
1fb90 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74  emory pages in t
1fba0 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64  he list to the d
1fbb0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
1fbc0 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a  e argument may.*
1fbd0 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65  * be NULL, repre
1fbe0 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79  senting an empty
1fbf0 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63   list. In this c
1fc00 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ase this functio
1fc10 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e  n is.** a no-op.
1fc20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
1fc30 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65   must hold at le
1fc40 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  ast a RESERVED l
1fc50 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75  ock when this fu
1fc60 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c  nction.** is cal
1fc70 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74  led. Before writ
1fc80 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20  ing anything to 
1fc90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1fca0 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20  e, this lock.** 
1fcb0 69 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61  is upgraded to a
1fcc0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
1fcd0 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61  . If the lock ca
1fce0 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64  nnot be obtained
1fcf0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ,.** SQLITE_BUSY
1fd00 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1fd10 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74   no data is writ
1fd20 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
1fd30 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
1fd40 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
1fd50 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67   a temp-file pag
1fd60 65 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61  er and the actua
1fd70 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69  l file-system fi
1fd80 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74  le.** is not yet
1fd90 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65   open, it is cre
1fda0 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
1fdb0 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
1fdc0 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f  is .** written o
1fdd0 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  ut..**.** Once t
1fde0 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  he lock has been
1fdf0 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69   upgraded and, i
1fe00 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65  f necessary, the
1fe10 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a   file opened,.**
1fe20 20 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77   the pages are w
1fe30 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
1fe40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1fe50 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57  in list order. W
1fe60 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65  riting.** a page
1fe70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69   is skipped if i
1fe80 74 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f  t meets either o
1fe90 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1fea0 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20  criteria:.**.** 
1feb0 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d    * The page num
1fec0 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
1fed0 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
1fee0 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20  , or.**   * The 
1fef0 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
1ff00 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
1ff10 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
1ff20 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61  If writing out a
1ff30 20 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65   page causes the
1ff40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1ff50 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62  o grow, Pager.db
1ff60 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75  FileSize.** is u
1ff70 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  pdated according
1ff80 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73  ly. If page 1 is
1ff90 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68   written out, th
1ffa0 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63  en the value cac
1ffb0 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e  hed.** in Pager.
1ffc0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
1ffd0 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68  updated to match
1ffe0 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73   the new value s
1fff0 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  tored in.** the 
20000 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
20010 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
20020 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
20030 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
20040 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
20050 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  O error .** occu
20060 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  rs, an IO error 
20070 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
20080 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43  . Or, if the EXC
20090 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e  LUSIVE lock cann
200a0 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65  ot.** be obtaine
200b0 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  d, SQLITE_BUSY i
200c0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
200d0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
200e0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50  write_pagelist(P
200f0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
20100 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  Hdr *pList){.  i
20110 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
20120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20130 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
20140 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 74 20 74  de */..  /* At t
20150 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20  his point there 
20160 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20  may be either a 
20170 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
20180 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
20190 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
201a0 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
201b0 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43  s already an EXC
201c0 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65  LUSIVE lock, the
201d0 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20   following.  ** 
201e0 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
201f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e  .  **.  ** Movin
20200 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20  g the lock from 
20210 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c  RESERVED to EXCL
20220 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69  USIVE actually i
20230 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20  nvolves going.  
20240 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e  ** through an in
20250 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
20260 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45   PENDING.   A PE
20270 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65  NDING lock preve
20280 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61  nts new.  ** rea
20290 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68  ders from attach
202a0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
202b0 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66  ase but is unsuf
202c0 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74  ficient for us t
202d0 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54  o.  ** write.  T
202e0 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e  he idea of a PEN
202f0 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20  DING lock is to 
20300 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64  prevent new read
20310 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f  ers from.  ** co
20320 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65  ming in while we
20330 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69   wait for existi
20340 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c  ng readers to cl
20350 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ear..  **.  ** W
20360 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69  hile the pager i
20370 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45  s in the RESERVE
20380 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69  D state, the ori
20390 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
203a0 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68  ile.  ** is unch
203b0 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e  anged and we can
203c0 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75   rollback withou
203d0 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79  t having to play
203e0 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  back the.  ** jo
203f0 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f  urnal into the o
20400 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
20410 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20   file.  Once we 
20420 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20  transition to.  
20430 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74  ** EXCLUSIVE, it
20440 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
20450 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  ase file has bee
20460 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e  n changed and an
20470 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  y rollback.  ** 
20480 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a  will require a j
20490 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e  ournal playback.
204a0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
204b0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
204c0 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
204d0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
204e0 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
204f0 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  );.  rc = pager_
20500 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
20510 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
20520 4f 43 4b 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  OCK);..  /* If t
20530 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d  he file is a tem
20540 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  p-file has not y
20550 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
20560 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a  open it now. It.
20570 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73    ** is not poss
20580 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62  ible for rc to b
20590 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
205a0 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62  ITE_OK if this b
205b0 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61  ranch.  ** is ta
205c0 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61  ken, as pager_wa
205d0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20  it_on_lock() is 
205e0 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70  a no-op for temp
205f0 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  -files..  */.  i
20600 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
20610 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73  r->fd) ){.    as
20620 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
20630 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51  mpFile && rc==SQ
20640 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72  LITE_OK );.    r
20650 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d  c = pagerOpentem
20660 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  p(pPager, pPager
20670 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66  ->fd, pPager->vf
20680 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20  sFlags);.  }..  
20690 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66 69  /* Before the fi
206a0 72 73 74 20 77 72 69 74 65 2c 20 67 69 76 65 20  rst write, give 
206b0 74 68 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f  the VFS a hint o
206c0 66 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c  f what the final
206d0 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20  .  ** file size 
206e0 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20  will be..  */.  
206f0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
20700 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
20710 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
20720 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20730 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  OK && pPager->db
20740 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 4f  Size>pPager->dbO
20750 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 73  rigSize ){.    s
20760 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46  qlite3_int64 szF
20770 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ile = pPager->pa
20780 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65  geSize * (sqlite
20790 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e  3_int64)pPager->
207a0 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69  dbSize;.    sqli
207b0 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
207c0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
207d0 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
207e0 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20  INT, &szFile);. 
207f0 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   }..  while( rc=
20800 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c  =SQLITE_OK && pL
20810 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  ist ){.    Pgno 
20820 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67  pgno = pList->pg
20830 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  no;..    /* If t
20840 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70  here are dirty p
20850 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65  ages in the page
20860 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65   cache with page
20870 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72   numbers greater
20880 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67  .    ** than Pag
20890 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20  er.dbSize, this 
208a0 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67  means sqlite3Pag
208b0 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
208c0 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a  ) was called to.
208d0 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20      ** make the 
208e0 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72  file smaller (pr
208f0 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f  esumably by auto
20900 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44  -vacuum code). D
20910 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20  o not write.    
20920 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  ** any such page
20930 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20  s to the file.. 
20940 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
20950 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  o, do not write 
20960 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74 68 61  out any page tha
20970 74 20 68 61 73 20 74 68 65 20 50 47 48 44 52 5f  t has the PGHDR_
20980 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a  DONT_WRITE flag.
20990 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20      ** set (set 
209a0 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  by sqlite3PagerD
209b0 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20  ontWrite())..   
209c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
209d0 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
209e0 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66   && 0==(pList->f
209f0 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f  lags&PGHDR_DONT_
20a00 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20  WRITE) ){.      
20a10 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67  i64 offset = (pg
20a20 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
20a30 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f  r->pageSize;   /
20a40 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74  * Offset to writ
20a50 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20  e */.      char 
20a60 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
20a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
20a90 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20  a to write */   
20aa0 20 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f   ..      /* Enco
20ab0 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  de the database 
20ac0 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28  */.      CODEC2(
20ad0 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
20ae0 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72  Data, pgno, 6, r
20af0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
20b00 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20  EM, pData);..   
20b10 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20     /* Write out 
20b20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a  the page data. *
20b30 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
20b40 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
20b50 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70  er->fd, pData, p
20b60 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
20b70 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20   offset);..     
20b80 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77 61   /* If page 1 wa
20b90 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20  s just written, 
20ba0 75 70 64 61 74 65 20 50 61 67 65 72 2e 64 62 46  update Pager.dbF
20bb0 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68  ileVers to match
20bc0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61  .      ** the va
20bd0 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69  lue now stored i
20be0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
20bf0 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20  ile. If writing 
20c00 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70  this .      ** p
20c10 61 67 65 20 63 61 75 73 65 64 20 74 68 65 20 64  age caused the d
20c20 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
20c30 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46  grow, update dbF
20c40 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20  ileSize. .      
20c50 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  */.      if( pgn
20c60 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  o==1 ){.        
20c70 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
20c80 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61  dbFileVers, &pDa
20c90 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70  ta[24], sizeof(p
20ca0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
20cb0 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s));.      }.   
20cc0 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
20cd0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
20ce0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
20cf0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
20d00 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  gno;.      }..  
20d10 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e      /* Update an
20d20 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  y backup objects
20d30 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e   copying the con
20d40 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61  tents of this pa
20d50 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  ger. */.      sq
20d60 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74  lite3BackupUpdat
20d70 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  e(pPager->pBacku
20d80 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c  p, pgno, (u8*)pL
20d90 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20  ist->pData);..  
20da0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
20db0 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  "STORE %d page %
20dc0 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
20dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20de0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
20df0 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
20e00 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
20e10 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
20e20 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c  E(("PGOUT %p %d\
20e30 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
20e40 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  ));.      PAGER_
20e50 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
20e60 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74  er_writedb_count
20e70 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
20e80 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69  NCR(pPager->nWri
20e90 74 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  te);.    }else{.
20ea0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
20eb0 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61  (("NOSTORE %d pa
20ec0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
20ed0 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29  D(pPager), pgno)
20ee0 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
20ef0 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
20f00 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61  ES.    pList->pa
20f10 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
20f20 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a  agehash(pList);.
20f30 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74  #endif.    pList
20f40 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
20f50 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
20f60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73  rc;.}../*.** Ens
20f70 75 72 65 20 74 68 61 74 20 74 68 65 20 73 75 62  ure that the sub
20f80 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
20f90 20 6f 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20   open. If it is 
20fa0 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68  already open, th
20fb0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
20fc0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
20fd0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
20fe0 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79  eturned if every
20ff0 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72  thing goes accor
21000 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e  ding to plan. An
21010 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52   .** SQLITE_IOER
21020 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65  R_XXX error code
21030 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
21040 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
21050 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61  3OsOpen() .** fa
21060 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
21070 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61  nt openSubJourna
21080 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
21090 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
210a0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69  ITE_OK;.  if( !i
210b0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
210c0 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70  fd) ){.    if( p
210d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
210e0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
210f0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20  LMODE_MEMORY || 
21100 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65  pPager->subjInMe
21110 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71  mory ){.      sq
21120 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f  lite3MemJournalO
21130 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
21140 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
21150 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
21160 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
21170 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c  Pager->sjfd, SQL
21180 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
21190 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  NAL);.    }.  }.
211a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
211b0 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72  /*.** Append a r
211c0 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72  ecord of the cur
211d0 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61  rent state of pa
211e0 67 65 20 70 50 67 20 74 6f 20 74 68 65 20 73 75  ge pPg to the su
211f0 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49  b-journal. .** I
21200 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73  t is the callers
21210 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
21220 74 6f 20 75 73 65 20 73 75 62 6a 52 65 71 75 69  to use subjRequi
21230 72 65 73 50 61 67 65 28 29 20 74 6f 20 63 68 65  resPage() to che
21240 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74 20 69  ck .** that it i
21250 73 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65  s really require
21260 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  d before calling
21270 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
21280 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
21290 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74  ful, set the bit
212a0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
212b0 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74  o pPg->pgno in t
212c0 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f  he bitvecs.** fo
212d0 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70  r all open savep
212e0 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74  oints before ret
212f0 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  urning..**.** Th
21300 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
21310 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  rns SQLITE_OK if
21320 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
21330 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f  uccessful, an IO
21340 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
21350 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  f the attempt to
21360 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 73 75   write to the su
21370 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c  b-journal fails,
21380 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e   or .** SQLITE_N
21390 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63  OMEM if a malloc
213a0 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74   fails while set
213b0 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20  ting a bit in a 
213c0 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74  savepoint.** bit
213d0 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vec..*/.static i
213e0 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67  nt subjournalPag
213f0 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
21400 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
21410 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
21420 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
21430 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  er;.  if( pPager
21440 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
21450 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
21460 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  _OFF ){..    /* 
21470 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75  Open the sub-jou
21480 72 6e 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20  rnal, if it has 
21490 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  not already been
214a0 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61   opened */.    a
214b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
214c0 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  seJournal );.   
214d0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
214e0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20  pPager->jfd) || 
214f0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
21500 65 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  er) );.    asser
21510 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
21520 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  ->sjfd) || pPage
21530 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b  r->nSubRec==0 );
21540 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67  .    assert( pag
21550 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
21560 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61   .         || pa
21570 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29  geInJournal(pPg)
21580 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50   .         || pP
21590 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
215a0 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20  dbOrigSize .    
215b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e  );.    rc = open
215c0 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  SubJournal(pPage
215d0 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  r);..    /* If t
215e0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 77  he sub-journal w
215f0 61 73 20 6f 70 65 6e 65 64 20 73 75 63 63 65 73  as opened succes
21600 73 66 75 6c 6c 79 20 28 6f 72 20 77 61 73 20 61  sfully (or was a
21610 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20 20  lready open),.  
21620 20 20 2a 2a 20 77 72 69 74 65 20 74 68 65 20 6a    ** write the j
21630 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 69 6e  ournal record in
21640 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 2a 2f  to the file.  */
21650 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
21660 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21670 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50  void *pData = pP
21680 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20  g->pData;.      
21690 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70 50 61  i64 offset = pPa
216a0 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b  ger->nSubRec*(4+
216b0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
216c0 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  );.      char *p
216d0 44 61 74 61 32 3b 0a 20 20 0a 20 20 20 20 20 20  Data2;.  .      
216e0 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
216f0 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
21700 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   7, return SQLIT
21710 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29  E_NOMEM, pData2)
21720 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  ;.      PAGERTRA
21730 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE(("STMT-JOURNA
21740 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
21750 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
21760 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
21770 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
21780 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a  2bits(pPager->sj
21790 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d  fd, offset, pPg-
217a0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  >pgno);.      if
217b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
217c0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
217d0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
217e0 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61  Pager->sjfd, pDa
217f0 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
21800 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29  eSize, offset+4)
21810 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21820 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
21830 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
21840 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b  Pager->nSubRec++
21850 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
21860 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
21870 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  >0 );.    rc = a
21880 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
21890 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67  vecs(pPager, pPg
218a0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  ->pgno);.  }.  r
218b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
218c0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
218d0 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
218e0 65 20 70 63 61 63 68 65 20 6c 61 79 65 72 20 77  e pcache layer w
218f0 68 65 6e 20 69 74 20 68 61 73 20 72 65 61 63 68  hen it has reach
21900 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20  ed some.** soft 
21910 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68  memory limit. Th
21920 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
21930 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
21940 20 61 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a   a Pager object.
21950 2a 2a 20 28 63 61 73 74 20 61 73 20 61 20 76 6f  ** (cast as a vo
21960 69 64 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20  id*). The pager 
21970 69 73 20 61 6c 77 61 79 73 20 27 70 75 72 67 65  is always 'purge
21980 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e  able' (not an in
21990 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
219a0 61 73 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64  ase). The second
219b0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72   argument is a r
219c0 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61  eference to a pa
219d0 67 65 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63  ge that is .** c
219e0 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62  urrently dirty b
219f0 75 74 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61  ut has no outsta
21a00 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
21a10 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73  . The page.** is
21a20 20 61 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74   always associat
21a30 65 64 20 77 69 74 68 20 74 68 65 20 50 61 67 65  ed with the Page
21a40 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  r object passed 
21a50 61 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a  as the first .**
21a60 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
21a70 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73   The job of this
21a80 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20   function is to 
21a90 6d 61 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62  make pPg clean b
21aa0 79 20 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f  y writing its co
21ab0 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f  ntents.** out to
21ac0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
21ad0 6c 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e  le, if possible.
21ae0 20 54 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76   This may involv
21af0 65 20 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a  e syncing the.**
21b00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a   journal file. .
21b10 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
21b20 66 75 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63  ful, sqlite3Pcac
21b30 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73  heMakeClean() is
21b40 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70   called on the p
21b50 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  age and.** SQLIT
21b60 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
21b70 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
21b80 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
21b90 67 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a  g to make the.**
21ba0 20 70 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65   page clean, the
21bb0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
21bc0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74  s returned. If t
21bd0 68 65 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62  he page cannot b
21be0 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20  e.** made clean 
21bf0 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72  for some other r
21c00 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72  eason, but no er
21c10 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
21c20 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
21c30 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
21c40 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
21c50 65 61 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c  ean() is not cal
21c60 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  led..*/.static i
21c70 6e 74 20 70 61 67 65 72 53 74 72 65 73 73 28 76  nt pagerStress(v
21c80 6f 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70  oid *p, PgHdr *p
21c90 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
21ca0 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29  ager = (Pager *)
21cb0 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  p;.  int rc = SQ
21cc0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
21cd0 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d  rt( pPg->pPager=
21ce0 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73  =pPager );.  ass
21cf0 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26  ert( pPg->flags&
21d00 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a  PGHDR_DIRTY );..
21d10 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79    /* The doNotSy
21d20 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20 69 73 20  ncSpill flag is 
21d30 73 65 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73  set during times
21d40 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79   when doing a sy
21d50 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e  nc of.  ** journ
21d60 61 6c 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61  al (and adding a
21d70 20 6e 65 77 20 68 65 61 64 65 72 29 20 69 73 20   new header) is 
21d80 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68  not allowed.  Th
21d90 69 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64  is occurs.  ** d
21da0 75 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73  uring calls to s
21db0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
21dc0 28 29 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  () while trying 
21dd0 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69  to journal multi
21de0 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62  ple.  ** pages b
21df0 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20  elonging to the 
21e00 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a  same sector..  *
21e10 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74  *.  ** The doNot
21e20 53 70 69 6c 6c 20 66 6c 61 67 20 69 6e 68 69 62  Spill flag inhib
21e30 69 74 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70  its all cache sp
21e40 69 6c 6c 69 6e 67 20 72 65 67 61 72 64 6c 65 73  illing regardles
21e50 73 20 6f 66 20 77 68 65 74 68 65 72 0a 20 20 2a  s of whether.  *
21e60 2a 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20  * or not a sync 
21e70 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 54 68  is required.  Th
21e80 69 73 20 69 73 20 73 65 74 20 64 75 72 69 6e 67  is is set during
21e90 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a   a rollback..  *
21ea0 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20  *.  ** Spilling 
21eb0 69 73 20 61 6c 73 6f 20 69 6e 68 69 62 69 74 65  is also inhibite
21ec0 64 20 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72  d when in an err
21ed0 6f 72 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20  or state..  */. 
21ee0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
21ef0 43 6f 64 65 20 29 20 72 65 74 75 72 6e 20 53 51  Code ) return SQ
21f00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
21f10 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
21f20 6c 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  l ) return SQLIT
21f30 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
21f40 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69  er->doNotSyncSpi
21f50 6c 6c 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67  ll && (pPg->flag
21f60 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  s & PGHDR_NEED_S
21f70 59 4e 43 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  YNC)!=0 ){.    r
21f80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21f90 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69  .  }..  pPg->pDi
21fa0 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rty = 0;.  if( p
21fb0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
21fc0 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69  r) ){.    /* Wri
21fd0 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d  te a single fram
21fe0 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  e for this page 
21ff0 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20  to the log. */. 
22000 20 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69     if( subjRequi
22010 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 20  resPage(pPg) ){ 
22020 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a  .      rc = subj
22030 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b  ournalPage(pPg);
22040 20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20   .    }.    if( 
22050 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22060 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
22070 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65  rWalFrames(pPage
22080 72 2c 20 70 50 67 2c 20 30 2c 20 30 2c 20 30 29  r, pPg, 0, 0, 0)
22090 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
220a0 0a 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20  .  .    /* Sync 
220b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
220c0 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
220d0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c  .    if( pPg->fl
220e0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
220f0 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 61 73 73  YNC ){.      ass
22100 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f  ert( !pPager->no
22110 53 79 6e 63 20 29 3b 0a 20 20 20 20 20 20 72 63  Sync );.      rc
22120 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
22130 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
22140 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22150 26 26 20 0a 20 20 20 20 20 20 20 20 21 28 70 50  && .        !(pP
22160 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
22170 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
22180 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a  MODE_MEMORY) &&.
22190 20 20 20 20 20 20 20 20 21 28 73 71 6c 69 74 65          !(sqlite
221a0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
221b0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
221c0 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  >fd)&SQLITE_IOCA
221d0 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 0a 20  P_SAFE_APPEND). 
221e0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
221f0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
22200 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
22210 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
22220 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Pager);.      }.
22230 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
22240 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  If the page numb
22250 65 72 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  er of this page 
22260 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
22270 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
22280 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  of.    ** the da
22290 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 74  tabase image, it
222a0 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20   may need to be 
222b0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
222c0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  ub-journal..    
222d0 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75  ** This is becau
222e0 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 70  se the call to p
222f0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
22300 69 73 74 28 29 20 62 65 6c 6f 77 20 77 69 6c 6c  ist() below will
22310 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 63 74 75   not.    ** actu
22320 61 6c 6c 79 20 77 72 69 74 65 20 64 61 74 61 20  ally write data 
22330 74 6f 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74  to the file in t
22340 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 2a 2a  his case..    **
22350 0a 20 20 20 20 2a 2a 20 43 6f 6e 73 69 64 65 72  .    ** Consider
22360 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
22370 65 71 75 65 6e 63 65 20 6f 66 20 65 76 65 6e 74  equence of event
22380 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
22390 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 2a 2a     BEGIN;.    **
223a0 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61       <journal pa
223b0 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20  ge X>.    **    
223c0 20 3c 6d 6f 64 69 66 79 20 70 61 67 65 20 58 3e   <modify page X>
223d0 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 41 56 45  .    **     SAVE
223e0 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20 2a 2a  POINT sp;.    **
223f0 20 20 20 20 20 20 20 3c 73 68 72 69 6e 6b 20 64         <shrink d
22400 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
22410 59 20 70 61 67 65 73 3e 0a 20 20 20 20 2a 2a 20  Y pages>.    ** 
22420 20 20 20 20 20 20 70 61 67 65 72 53 74 72 65 73        pagerStres
22430 73 28 70 61 67 65 20 58 29 0a 20 20 20 20 2a 2a  s(page X).    **
22440 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f       ROLLBACK TO
22450 20 73 70 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20   sp;.    **.    
22460 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68 65  ** If (X>Y), the
22470 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74 72 65  n when pagerStre
22480 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67  ss is called pag
22490 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  e X will not be 
224a0 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 6f  written.    ** o
224b0 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
224c0 73 65 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c  se file, but wil
224d0 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f  l be dropped fro
224e0 6d 20 74 68 65 20 63 61 63 68 65 2e 20 54 68 65  m the cache. The
224f0 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  n,.    ** follow
22500 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42 41 43  ing the "ROLLBAC
22510 4b 20 54 4f 20 73 70 22 20 73 74 61 74 65 6d 65  K TO sp" stateme
22520 6e 74 2c 20 72 65 61 64 69 6e 67 20 70 61 67 65  nt, reading page
22530 20 58 20 77 69 6c 6c 20 72 65 61 64 0a 20 20 20   X will read.   
22540 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68   ** data from th
22550 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
22560 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68   This will be th
22570 65 20 63 6f 70 79 20 6f 66 20 70 61 67 65 20 58  e copy of page X
22580 20 61 73 20 69 74 0a 20 20 20 20 2a 2a 20 77 61   as it.    ** wa
22590 73 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  s when the trans
225a0 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20  action started, 
225b0 6e 6f 74 20 61 73 20 69 74 20 77 61 73 20 77 68  not as it was wh
225c0 65 6e 20 22 53 41 56 45 50 4f 49 4e 54 20 73 70  en "SAVEPOINT sp
225d0 22 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 78 65  ".    ** was exe
225e0 63 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  cuted..    **.  
225f0 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f    ** The solutio
22600 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20 74 68  n is to write th
22610 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 20 66  e current data f
22620 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f 20 74  or page X into t
22630 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d 6a  he .    ** sub-j
22640 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20  ournal file now 
22650 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
22660 72 65 61 64 79 20 74 68 65 72 65 29 2c 20 73 6f  ready there), so
22670 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20 20   that it will.  
22680 20 20 2a 2a 20 62 65 20 72 65 73 74 6f 72 65 64    ** be restored
22690 20 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20   to its current 
226a0 76 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20 22  value when the "
226b0 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20  ROLLBACK TO sp" 
226c0 69 73 20 0a 20 20 20 20 2a 2a 20 65 78 65 63 75  is .    ** execu
226d0 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
226e0 69 66 28 20 4e 45 56 45 52 28 0a 20 20 20 20 20  if( NEVER(.     
226f0 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
22700 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   && pPg->pgno>pP
22710 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20  ager->dbSize && 
22720 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
22730 28 70 50 67 29 0a 20 20 20 20 29 20 29 7b 0a 20  (pPg).    ) ){. 
22740 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75       rc = subjou
22750 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20  rnalPage(pPg);. 
22760 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57     }.  .    /* W
22770 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  rite the content
22780 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75  s of the page ou
22790 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
227a0 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  e file. */.    i
227b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
227c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
227d0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
227e0 69 73 74 28 70 50 61 67 65 72 2c 20 70 50 67 29  ist(pPager, pPg)
227f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
22800 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
22810 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69  as clean. */.  i
22820 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22830 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41   ){.    PAGERTRA
22840 43 45 28 28 22 53 54 52 45 53 53 20 25 64 20 70  CE(("STRESS %d p
22850 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
22860 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
22870 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c  >pgno));.    sql
22880 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
22890 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  ean(pPg);.  }.. 
228a0 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
228b0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
228c0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  .}.../*.** Alloc
228d0 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
228e0 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f  ze a new Pager o
228f0 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61 20  bject and put a 
22900 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a  pointer to it.**
22910 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68   in *ppPager. Th
22920 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65  e pager should e
22930 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65  ventually be fre
22940 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 69 74  ed by passing it
22950 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
22960 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a  gerClose()..**.*
22970 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  * The zFilename 
22980 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
22990 70 61 74 68 20 74 6f 20 74 68 65 20 64 61 74 61  path to the data
229a0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
229b0 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  n..** If zFilena
229c0 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
229d0 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64  a randomly-named
229e0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
229f0 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
22a00 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69  d used as the fi
22a10 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e  le to be cached.
22a20 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   Temporary files
22a30 20 61 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a   are be deleted.
22a40 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
22a50 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 63   when they are c
22a60 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e  losed. If zFilen
22a70 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
22a80 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69  " then .** all i
22a90 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65  nformation is he
22aa0 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20  ld in cache. It 
22ab0 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
22ac0 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68   to disk. .** Th
22ad0 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
22ae0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69  o implement an i
22af0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
22b00 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78  e..**.** The nEx
22b10 74 72 61 20 70 61 72 61 6d 65 74 65 72 20 73 70  tra parameter sp
22b20 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62  ecifies the numb
22b30 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
22b40 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  pace allocated.*
22b50 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63  * along with eac
22b60 68 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  h page reference
22b70 2e 20 54 68 69 73 20 73 70 61 63 65 20 69 73 20  . This space is 
22b80 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65  available to the
22b90 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65   user.** via the
22ba0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
22bb0 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a  Extra() API..**.
22bc0 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72 67  ** The flags arg
22bd0 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f  ument is used to
22be0 20 73 70 65 63 69 66 79 20 70 72 6f 70 65 72 74   specify propert
22bf0 69 65 73 20 74 68 61 74 20 61 66 66 65 63 74 20  ies that affect 
22c00 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  the.** operation
22c10 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20 49   of the pager. I
22c20 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73  t should be pass
22c30 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20  ed some bitwise 
22c40 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f  combination.** o
22c50 66 20 74 68 65 20 50 41 47 45 52 5f 4f 4d 49 54  f the PAGER_OMIT
22c60 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41 47  _JOURNAL and PAG
22c70 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66  ER_NO_READLOCK f
22c80 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lags..**.** The 
22c90 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74  vfsFlags paramet
22ca0 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20  er is a bitmask 
22cb0 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20 66  to pass to the f
22cc0 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a  lags parameter.*
22cd0 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29  * of the xOpen()
22ce0 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73   method of the s
22cf0 75 70 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e  upplied VFS when
22d00 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20   opening files. 
22d10 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
22d20 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  ger object is al
22d30 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
22d40 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f  specified file o
22d50 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73  pened .** succes
22d60 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f  sfully, SQLITE_O
22d70 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  K is returned an
22d80 64 20 2a 70 70 50 61 67 65 72 20 73 65 74 20 74  d *ppPager set t
22d90 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68  o point to.** th
22da0 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65  e new pager obje
22db0 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ct. If an error 
22dc0 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72  occurs, *ppPager
22dd0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a   is set to NULL.
22de0 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64  ** and error cod
22df0 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  e returned. This
22e00 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65   function may re
22e10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
22e20 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c  M.** (sqlite3Mal
22e30 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20 74 6f  loc() is used to
22e40 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
22e50 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  ), SQLITE_CANTOP
22e60 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75  EN or .** variou
22e70 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20  s SQLITE_IO_XXX 
22e80 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  errors..*/.int s
22e90 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
22ea0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
22eb0 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54  pVfs,       /* T
22ec0 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20  he virtual file 
22ed0 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f  system to use */
22ee0 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67  .  Pager **ppPag
22ef0 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  er,         /* O
22f00 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50  UT: Return the P
22f10 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68  ager structure h
22f20 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
22f30 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
22f40 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
22f50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
22f60 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
22f70 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
22f80 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79       /* Extra by
22f90 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61  tes append to ea
22fa0 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
22fb0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
22fc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22fd0 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c  /* flags control
22fe0 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a  ling this file *
22ff0 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
23000 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
23010 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  flags passed thr
23020 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
23030 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20  vfs.xOpen() */. 
23040 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29   void (*xReinit)
23050 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e  (DbPage*) /* Fun
23060 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69  ction to reiniti
23070 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29  alize pages */.)
23080 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20  {.  u8 *pPtr;.  
23090 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
230a0 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  0;       /* Page
230b0 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f  r object to allo
230c0 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  cate and return 
230d0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
230e0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a  LITE_OK;      /*
230f0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
23100 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d    int tempFile =
23110 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
23120 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65  ue for temp file
23130 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f  s (incl. in-memo
23140 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69  ry files) */.  i
23150 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20  nt memDb = 0;   
23160 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
23170 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  if this is an in
23180 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
23190 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d    int readOnly =
231a0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
231b0 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
231c0 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a  read-only file *
231d0 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46  /.  int journalF
231e0 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20  ileSize;     /* 
231f0 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  Bytes to allocat
23200 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e  e for each journ
23210 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20  al fd */.  char 
23220 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20  *zPathname = 0; 
23230 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68      /* Full path
23240 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c   to database fil
23250 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68  e */.  int nPath
23260 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  name = 0;       
23270 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
23280 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20  es in zPathname 
23290 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72  */.  int useJour
232a0 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50  nal = (flags & P
232b0 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
232c0 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20  L)==0; /* False 
232d0 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20  to omit journal 
232e0 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c  */.  int noReadl
232f0 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50  ock = (flags & P
23300 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
23310 29 21 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74  )!=0;  /* True t
23320 6f 20 6f 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b  o omit read-lock
23330 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65   */.  int pcache
23340 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63  Size = sqlite3Pc
23350 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20  acheSize();     
23360 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
23370 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63 68  locate for PCach
23380 65 20 2a 2f 0a 20 20 75 31 36 20 73 7a 50 61 67  e */.  u16 szPag
23390 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44  eDflt = SQLITE_D
233a0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
233b0 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61  ;  /* Default pa
233c0 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a  ge size */..  /*
233d0 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
233e0 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65  much space is re
233f0 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20  quired for each 
23400 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e  journal file-han
23410 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20  dle.  ** (there 
23420 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c  are two of them,
23430 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
23440 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f  l and the sub-jo
23450 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a  urnal). This.  *
23460 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  * is the maximum
23470 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
23480 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
23490 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
234a0 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61  ndle .  ** and a
234b0 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c   regular journal
234c0 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f   file-handle. No
234d0 74 65 20 74 68 61 74 20 61 20 22 72 65 67 75 6c  te that a "regul
234e0 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c  ar journal-handl
234f0 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61  e".  ** may be a
23500 20 77 72 61 70 70 65 72 20 63 61 70 61 62 6c 65   wrapper capable
23510 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68 65 20   of caching the 
23520 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66  first portion of
23530 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
23540 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79  * file in memory
23550 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
23560 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
23570 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65  ptimization (see
23580 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69   .  ** source fi
23590 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20  le journal.c).. 
235a0 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
235b0 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
235c0 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75  s)>sqlite3MemJou
235d0 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20  rnalSize() ){.  
235e0 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
235f0 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74  e = ROUND8(sqlit
23600 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56  e3JournalSize(pV
23610 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fs));.  }else{. 
23620 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
23630 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69  ze = ROUND8(sqli
23640 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a  te3MemJournalSiz
23650 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e());.  }..  /* 
23660 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76  Set the output v
23670 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20  ariable to NULL 
23680 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72  in case an error
23690 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70   occurs. */.  *p
236a0 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f  pPager = 0;..  /
236b0 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74  * Compute and st
236c0 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74  ore the full pat
236d0 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f  hname in an allo
236e0 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69  cated buffer poi
236f0 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20  nted.  ** to by 
23700 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74  zPathname, lengt
23710 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c  h nPathname. Or,
23720 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65   if this is a te
23730 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20  mporary file,.  
23740 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50  ** leave both nP
23750 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74  athname and zPat
23760 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a  hname set to 0..
23770 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
23780 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
23790 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74  e[0] ){.    nPat
237a0 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
237b0 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
237c0 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  zPathname = sqli
237d0 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e  te3Malloc(nPathn
237e0 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20  ame*2);.    if( 
237f0 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a  zPathname==0 ){.
23800 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
23810 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
23820 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23830 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
23840 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69    if( strcmp(zFi
23850 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a  lename,":memory:
23860 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  ")==0 ){.      m
23870 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20  emDb = 1;.      
23880 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30  zPathname[0] = 0
23890 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
238a0 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a  if.    {.      z
238b0 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b  Pathname[0] = 0;
238c0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e   /* Make sure in
238d0 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69  itialized even i
238e0 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29  f FullPathname()
238f0 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20   fails */.      
23900 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  rc = sqlite3OsFu
23910 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
23920 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74   zFilename, nPat
23930 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  hname, zPathname
23940 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 50  );.    }..    nP
23950 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
23960 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e  3Strlen30(zPathn
23970 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
23980 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
23990 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d  Pathname+8>pVfs-
239a0 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  >mxPathname ){. 
239b0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
239c0 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
239d0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  n the journal pa
239e0 74 68 20 72 65 71 75 69 72 65 64 20 62 79 0a 20  th required by. 
239f0 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
23a00 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  base being opene
23a10 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74  d will be more t
23a20 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  han pVfs->mxPath
23a30 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79  name.      ** by
23a40 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54  tes in length. T
23a50 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61  his means the da
23a60 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65  tabase cannot be
23a70 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a   opened,.      *
23a80 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74  * as it will not
23a90 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
23aa0 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
23ab0 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20   file or even.  
23ac0 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72      ** check for
23ad0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62   a hot-journal b
23ae0 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20  efore reading.. 
23af0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
23b00 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
23b10 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
23b20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
23b30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
23b40 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68  lite3_free(zPath
23b50 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  name);.      ret
23b60 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
23b70 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
23b80 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20   memory for the 
23b90 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  Pager structure,
23ba0 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20   PCache object, 
23bb0 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66  the.  ** three f
23bc0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c  ile descriptors,
23bd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23be0 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
23bf0 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
23c00 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79  le name. The lay
23c10 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73  out in memory is
23c20 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
23c30 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72  *.  **     Pager
23c40 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
23c50 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65             (size
23c60 6f 66 28 50 61 67 65 72 29 20 62 79 74 65 73 29  of(Pager) bytes)
23c70 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65  .  **     PCache
23c80 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
23c90 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
23ca0 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 20 62  e3PcacheSize() b
23cb0 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44  ytes).  **     D
23cc0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e  atabase file han
23cd0 64 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 28  dle            (
23ce0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62  pVfs->szOsFile b
23cf0 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53  ytes).  **     S
23d00 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
23d10 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28  handle         (
23d20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
23d30 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
23d40 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  Main journal fil
23d50 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
23d60 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
23d70 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
23d80 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   Database file n
23d90 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
23da0 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79   (nPathname+1 by
23db0 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f  tes).  **     Jo
23dc0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
23dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
23de0 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74  Pathname+8+1 byt
23df0 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20  es).  */.  pPtr 
23e00 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d  = (u8 *)sqlite3M
23e10 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52  allocZero(.    R
23e20 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50  OUND8(sizeof(*pP
23e30 61 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a  ager)) +      /*
23e40 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
23e50 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
23e60 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20  cacheSize) +    
23e70 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65         /* PCache
23e80 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52   object */.    R
23e90 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73  OUND8(pVfs->szOs
23ea0 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a  File) +       /*
23eb0 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c   The main db fil
23ec0 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  e */.    journal
23ed0 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20  FileSize * 2 +  
23ee0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
23ef0 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  wo journal files
23f00 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61   */ .    nPathna
23f10 6d 65 20 2b 20 31 20 2b 20 20 20 20 20 20 20 20  me + 1 +        
23f20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65          /* zFile
23f30 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74  name */.    nPat
23f40 68 6e 61 6d 65 20 2b 20 38 20 2b 20 31 20 20 20  hname + 8 + 1   
23f50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a             /* zJ
23f60 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
23f70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
23f80 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d  L.    + nPathnam
23f90 65 20 2b 20 34 20 2b 20 31 20 20 20 20 20 20 20  e + 4 + 1       
23fa0 20 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a         /* zWal *
23fb0 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20  /.#endif.  );.  
23fc0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
23fd0 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c  TE_ALIGNMENT(SQL
23fe0 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a  ITE_INT_TO_PTR(j
23ff0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29  ournalFileSize))
24000 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72 20   );.  if( !pPtr 
24010 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
24020 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
24030 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24040 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
24050 50 61 67 65 72 20 3d 20 20 20 20 20 20 20 20 20  Pager =         
24060 20 20 20 20 20 28 50 61 67 65 72 2a 29 28 70 50       (Pager*)(pP
24070 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  tr);.  pPager->p
24080 50 43 61 63 68 65 20 3d 20 20 20 20 28 50 43 61  PCache =    (PCa
24090 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  che*)(pPtr += RO
240a0 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61  UND8(sizeof(*pPa
240b0 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72  ger)));.  pPager
240c0 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65  ->fd =   (sqlite
240d0 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
240e0 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69   ROUND8(pcacheSi
240f0 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ze));.  pPager->
24100 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  sjfd = (sqlite3_
24110 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  file*)(pPtr += R
24120 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73  OUND8(pVfs->szOs
24130 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72  File));.  pPager
24140 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65  ->jfd =  (sqlite
24150 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
24160 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
24170 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69  );.  pPager->zFi
24180 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61  lename =    (cha
24190 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72  r*)(pPtr += jour
241a0 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20  nalFileSize);.  
241b0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
241c0 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61  TE_ALIGNMENT(pPa
241d0 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  ger->jfd) );..  
241e0 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50  /* Fill in the P
241f0 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61  ager.zFilename a
24200 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61  nd Pager.zJourna
24210 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20 72 65  l buffers, if re
24220 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28  quired. */.  if(
24230 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20   zPathname ){.  
24240 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e    pPager->zJourn
24250 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70  al =   (char*)(p
24260 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65  Ptr += nPathname
24270 20 2b 20 31 29 3b 0a 20 20 20 20 6d 65 6d 63 70   + 1);.    memcp
24280 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  y(pPager->zFilen
24290 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  ame, zPathname, 
242a0 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
242b0 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
242c0 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61  Journal, zPathna
242d0 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
242e0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
242f0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
24300 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e  thname], "-journ
24310 61 6c 22 2c 20 38 29 3b 0a 20 20 20 20 69 66 28  al", 8);.    if(
24320 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
24330 6d 65 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  me[0]==0 ){.    
24340 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e    pPager->zJourn
24350 61 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  al[0] = 0;.    }
24360 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24370 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 65 6c 73  OMIT_WAL.    els
24380 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e{.      pPager-
24390 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d  >zWal = &pPager-
243a0 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e  >zJournal[nPathn
243b0 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 20 20  ame+8+1];.      
243c0 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
243d0 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  Wal, zPathname, 
243e0 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
243f0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
24400 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ->zWal[nPathname
24410 5d 2c 20 22 2d 77 61 6c 22 2c 20 34 29 3b 0a 20  ], "-wal", 4);. 
24420 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
24430 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
24440 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70  thname);.  }.  p
24450 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56  Pager->pVfs = pV
24460 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66  fs;.  pPager->vf
24470 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67  sFlags = vfsFlag
24480 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  s;..  /* Open th
24490 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20  e pager file..  
244a0 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
244b0 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
244c0 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a  0] && !memDb ){.
244d0 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30      int fout = 0
244e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
244f0 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67       /* VFS flag
24500 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f  s returned by xO
24510 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20  pen() */.    rc 
24520 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
24530 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46  pVfs, pPager->zF
24540 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
24550 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26  >fd, vfsFlags, &
24560 66 6f 75 74 29 3b 0a 20 20 20 20 72 65 61 64 4f  fout);.    readO
24570 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49  nly = (fout&SQLI
24580 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
24590 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
245a0 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65  e file was succe
245b0 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66  ssfully opened f
245c0 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
245d0 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f  cess,.    ** cho
245e0 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61  ose a default pa
245f0 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20  ge size in case 
24600 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74  we have to creat
24610 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
24620 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
24630 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
24640 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  e is the maximum
24650 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
24660 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44  **    + SQLITE_D
24670 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
24680 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  ,.    **    + Th
24690 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
246a0 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
246b0 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
246c0 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73      + The larges
246d0 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74  t page size that
246e0 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
246f0 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20  atomically..    
24700 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
24710 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61  QLITE_OK && !rea
24720 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 73  dOnly ){.      s
24730 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
24740 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ger);.      asse
24750 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  rt(SQLITE_DEFAUL
24760 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c  T_PAGE_SIZE<=SQL
24770 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
24780 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
24790 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74    if( szPageDflt
247a0 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  <pPager->sectorS
247b0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ize ){.        i
247c0 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  f( pPager->secto
247d0 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  rSize>SQLITE_MAX
247e0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
247f0 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ZE ){.          
24800 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
24810 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
24820 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20  PAGE_SIZE;.     
24830 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24840 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
24850 20 28 75 31 36 29 70 50 61 67 65 72 2d 3e 73 65   (u16)pPager->se
24860 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  ctorSize;.      
24870 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64    }.      }.#ifd
24880 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
24890 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
248a0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e      {.        in
248b0 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
248c0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
248d0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
248e0 64 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  d);.        int 
248f0 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ii;.        asse
24900 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
24910 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
24920 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >8));.        as
24930 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
24940 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
24950 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  536>>8));.      
24960 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
24970 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
24980 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20  _SIZE<=65536);. 
24990 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a         for(ii=sz
249a0 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51  PageDflt; ii<=SQ
249b0 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
249c0 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69  _PAGE_SIZE; ii=i
249d0 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i*2){.          
249e0 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f  if( iDc&(SQLITE_
249f0 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69  IOCAP_ATOMIC|(ii
24a00 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20  >>8)) ){.       
24a10 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20       szPageDflt 
24a20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20  = ii;.          
24a30 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
24a40 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
24a50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
24a60 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   If a temporary 
24a70 66 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65  file is requeste
24a80 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  d, it is not ope
24a90 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ned immediately.
24aa0 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  .    ** In this 
24ab0 63 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74  case we accept t
24ac0 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
24ad0 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61  size and delay a
24ae0 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f  ctually.    ** o
24af0 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20  pening the file 
24b00 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
24b10 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28  call to OsWrite(
24b20 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
24b30 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
24b40 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20  also run for an 
24b50 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
24b60 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79  se. An in-memory
24b70 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
24b80 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
24b90 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74  a temp-file that
24ba0 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65   is never writte
24bb0 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20  n out to.    ** 
24bc0 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e  disk and uses an
24bd0 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62   in-memory rollb
24be0 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ack journal..   
24bf0 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c   */ .    tempFil
24c00 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
24c10 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
24c20 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
24c30 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46  readOnly = (vfsF
24c40 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
24c50 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a  _READONLY);.  }.
24c60 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
24c70 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65  ing call to Page
24c80 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73  rSetPagesize() s
24c90 65 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65  erves to set the
24ca0 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20   value of .  ** 
24cb0 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61  Pager.pageSize a
24cc0 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74  nd to allocate t
24cd0 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  he Pager.pTmpSpa
24ce0 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a  ce buffer..  */.
24cf0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24d00 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
24d10 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  t( pPager->memDb
24d20 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
24d30 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
24d40 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
24d50 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29  &szPageDflt, -1)
24d60 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
24d70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
24d80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
24d90 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
24da0 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  in either of the
24db0 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66   blocks above, f
24dc0 72 65 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ree the .  ** Pa
24dd0 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
24de0 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  d close the file
24df0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21  ..  */.  if( rc!
24e00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24e10 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
24e20 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 3b 0a  r->pTmpSpace );.
24e30 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
24e40 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
24e50 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24e60 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
24e70 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
24e80 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
24e90 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e  e PCache object.
24ea0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 45   */.  assert( nE
24eb0 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 6e  xtra<1000 );.  n
24ec0 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e  Extra = ROUND8(n
24ed0 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65  Extra);.  sqlite
24ee0 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61  3PcacheOpen(szPa
24ef0 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20  geDflt, nExtra, 
24f00 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20  !memDb,.        
24f10 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d              !mem
24f20 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30  Db?pagerStress:0
24f30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72  , (void *)pPager
24f40 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  , pPager->pPCach
24f50 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43  e);..  PAGERTRAC
24f60 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e  E(("OPEN %d %s\n
24f70 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ", FILEHANDLEID(
24f80 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61  pPager->fd), pPa
24f90 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29  ger->zFilename))
24fa0 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50  ;.  IOTRACE(("OP
24fb0 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61  EN %p %s\n", pPa
24fc0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  ger, pPager->zFi
24fd0 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67  lename))..  pPag
24fe0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  er->useJournal =
24ff0 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b   (u8)useJournal;
25000 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  .  pPager->noRea
25010 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64 6c  dlock = (noReadl
25020 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 29  ock && readOnly)
25030 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61 67   ?1:0;.  /* pPag
25040 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30  er->stmtOpen = 0
25050 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
25060 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
25070 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
25080 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20  >nRef = 0; */.  
25090 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
250a0 6c 69 64 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b  lid = (u8)memDb;
250b0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
250c0 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  mtSize = 0; */. 
250d0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
250e0 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  JSize = 0; */.  
250f0 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  /* pPager->nPage
25100 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
25110 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49  r->mxPgno = SQLI
25120 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e  TE_MAX_PAGE_COUN
25130 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  T;.  /* pPager->
25140 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
25150 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72  LOCK; */.  asser
25160 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
25170 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20   == (tempFile ? 
25180 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
25190 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20  : PAGER_UNLOCK) 
251a0 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  );.  /* pPager->
251b0 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a  errMask = 0; */.
251c0 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
251d0 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c  le = (u8)tempFil
251e0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d  e;.  assert( tem
251f0 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
25200 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
25210 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65  .          || te
25220 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
25230 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
25240 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
25250 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
25260 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20  DE_EXCLUSIVE==1 
25270 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  );.  pPager->exc
25280 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38  lusiveMode = (u8
25290 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50  )tempFile; .  pP
252a0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
252b0 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
252c0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
252d0 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29  er->memDb = (u8)
252e0 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
252f0 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29  >readOnly = (u8)
25300 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70  readOnly;.  /* p
25310 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
25320 3d 20 30 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74  = 0; */.  assert
25330 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20  ( useJournal || 
25340 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
25350 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   );.  pPager->no
25360 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74  Sync = pPager->t
25370 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
25380 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 70 50  r->fullSync = pP
25390 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30 3a  ager->noSync ?0:
253a0 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  1;.  pPager->syn
253b0 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  c_flags = SQLITE
253c0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
253d0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
253e0 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  t = 0; */.  /* p
253f0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
25400 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ced = 0; */.  /*
25410 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
25420 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
25430 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e  >nExtra = (u16)n
25440 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d  Extra;.  pPager-
25450 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
25460 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  t = SQLITE_DEFAU
25470 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f  LT_JOURNAL_SIZE_
25480 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28  LIMIT;.  assert(
25490 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
254a0 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20  fd) || tempFile 
254b0 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69  );.  setSectorSi
254c0 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ze(pPager);.  if
254d0 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b  ( !useJournal ){
254e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
254f0 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
25500 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
25510 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65  ;.  }else if( me
25520 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65  mDb ){.    pPage
25530 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
25540 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
25550 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  DE_MEMORY;.  }. 
25560 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73   /* pPager->xBus
25570 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f  yHandler = 0; */
25580 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42  .  /* pPager->pB
25590 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20  usyHandlerArg = 
255a0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
255b0 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69  xReiniter = xRei
255c0 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74  nit;.  /* memset
255d0 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
255e0 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
255f0 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 0a 20  ->aHash)); */.. 
25600 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67   *ppPager = pPag
25610 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  er;.  return SQL
25620 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a  ITE_OK;.}..../*.
25630 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
25640 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
25650 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66   transitioning f
25660 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  rom PAGER_UNLOCK
25670 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41   to.** PAGER_SHA
25680 52 45 44 20 73 74 61 74 65 2e 20 49 74 20 74 65  RED state. It te
25690 73 74 73 20 69 66 20 74 68 65 72 65 20 69 73 20  sts if there is 
256a0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72  a hot journal pr
256b0 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20  esent in.** the 
256c0 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20  file-system for 
256d0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e  the given pager.
256e0 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69   A hot journal i
256f0 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e  s one that .** n
25700 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
25710 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e  d back. Accordin
25720 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  g to this functi
25730 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  on, a hot-journa
25740 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73  l.** file exists
25750 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
25760 67 20 63 72 69 74 65 72 69 61 20 61 72 65 20 6d  g criteria are m
25770 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  et:.**.**   * Th
25780 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
25790 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c  xists in the fil
257a0 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a  e system, and.**
257b0 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20     * No process 
257c0 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44  holds a RESERVED
257d0 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
257e0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
257f0 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20   file, and.**   
25800 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
25810 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67 72  ile itself is gr
25820 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
25830 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a  es in size, and.
25840 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73 74  **   * The first
25850 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75   byte of the jou
25860 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
25870 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30   and is not 0x00
25880 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
25890 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
258a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
258b0 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72   is 0 but a jour
258c0 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73  nal file.** exis
258d0 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62  ts, that is prob
258e0 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  ably an old jour
258f0 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72  nal left over fr
25900 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61  om a prior.** da
25910 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
25920 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68  same name. In th
25930 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72  is case the jour
25940 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a  nal file is.** j
25950 75 73 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e  ust deleted usin
25960 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78  g OsDelete, *pEx
25970 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 30  ists is set to 0
25980 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a   and SQLITE_OK.*
25990 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
259a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
259b0 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b  e does not check
259c0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6d   if there is a m
259d0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
259e0 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65  lename.** at the
259f0 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
25a00 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61  . If there is, a
25a10 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a  nd that master j
25a20 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64  ournal file.** d
25a30 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74  oes not exist, t
25a40 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
25a50 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  file is not real
25a60 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a  ly hot. In this.
25a70 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f 75  ** case this rou
25a80 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
25a90 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76   a false-positiv
25aa0 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61  e. The pager_pla
25ab0 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  yback().** routi
25ac0 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72  ne will discover
25ad0 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
25ae0 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65  l file is not re
25af0 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a  ally hot and .**
25b00 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69   will not roll i
25b10 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49  t back. .**.** I
25b20 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  f a hot-journal 
25b30 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f  file is found to
25b40 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73   exist, *pExists
25b50 20 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64   is set to 1 and
25b60 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72   .** SQLITE_OK r
25b70 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68  eturned. If no h
25b80 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
25b90 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78  is present, *pEx
25ba0 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74  ists is.** set t
25bb0 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  o 0 and SQLITE_O
25bc0 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  K returned. If a
25bd0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
25be0 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a  s while trying.*
25bf0 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  * to determine w
25c00 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
25c10 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
25c20 20 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20   exists, the IO 
25c30 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73  error.** code is
25c40 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
25c50 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69  e value of *pExi
25c60 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64  sts is undefined
25c70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25c80 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  hasHotJournal(Pa
25c90 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
25ca0 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71   *pExists){.  sq
25cb0 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
25cc0 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
25cd0 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20  >pVfs;.  int rc 
25ce0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
25cf0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
25d00 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65   code */.  int e
25d10 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20  xists = 1;      
25d20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
25d30 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   if a journal fi
25d40 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  le is present */
25d50 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20  .  int jrnlOpen 
25d60 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65  = !!isOpen(pPage
25d70 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65  r->jfd);..  asse
25d80 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
25d90 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
25da0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
25db0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
25dc0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
25dd0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
25de0 72 2d 3e 73 74 61 74 65 20 3c 3d 20 50 41 47 45  r->state <= PAGE
25df0 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 61 73  R_SHARED );.  as
25e00 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d  sert( jrnlOpen==
25e10 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73  0 || ( sqlite3Os
25e20 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
25e30 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66  stics(pPager->jf
25e40 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f  d) &.    SQLITE_
25e50 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c  IOCAP_UNDELETABL
25e60 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29  E_WHEN_OPEN.  ))
25e70 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20  ;..  *pExists = 
25e80 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70  0;.  if( !jrnlOp
25e90 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  en ){.    rc = s
25ea0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
25eb0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
25ec0 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
25ed0 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78  CESS_EXISTS, &ex
25ee0 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ists);.  }.  if(
25ef0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
25f00 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  & exists ){.    
25f10 69 6e 74 20 6c 6f 63 6b 65 64 3b 20 20 20 20 20  int locked;     
25f20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25f30 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63  rue if some proc
25f40 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45  ess holds a RESE
25f50 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20  RVED lock */..  
25f60 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74    /* Race condit
25f70 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68  ion here:  Anoth
25f80 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
25f90 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69   have been holdi
25fa0 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68  ng the.    ** th
25fb0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
25fc0 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e  and have a journ
25fd0 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73  al open at the s
25fe0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
25ff0 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62   .    ** call ab
26000 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65  ove, but then de
26010 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
26020 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f   and drop the lo
26030 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ck before.    **
26040 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20 66   we get to the f
26050 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33  ollowing sqlite3
26060 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
26070 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20  ock() call.  If 
26080 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74  that.    ** is t
26090 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f  he case, this ro
260a0 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e  utine might thin
260b0 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  k there is a hot
260c0 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20   journal when.  
260d0 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65    ** in fact the
260e0 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69  re is none.  Thi
260f0 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66  s results in a f
26100 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68  alse-positive wh
26110 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ich will.    ** 
26120 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79  be dealt with by
26130 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f   the playback ro
26140 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23  utine.  Ticket #
26150 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  3883..    */.   
26160 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43   rc = sqlite3OsC
26170 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
26180 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f  (pPager->fd, &lo
26190 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  cked);.    if( r
261a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
261b0 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20  !locked ){.     
261c0 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 20   int nPage;..   
261d0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20     /* Check the 
261e0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
261f0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74  base file. If it
26200 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 30 20 70   consists of 0 p
26210 61 67 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74  ages,.      ** t
26220 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a  hen delete the j
26230 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65  ournal file. See
26240 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
26250 65 6e 74 20 61 62 6f 76 65 20 66 6f 72 20 0a 20  ent above for . 
26260 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 61 73       ** the reas
26270 6f 6e 69 6e 67 20 68 65 72 65 2e 20 20 44 65 6c  oning here.  Del
26280 65 74 65 20 74 68 65 20 6f 62 73 6f 6c 65 74 65  ete the obsolete
26290 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e   journal file un
262a0 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 52  der.      ** a R
262b0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20  ESERVED lock to 
262c0 61 76 6f 69 64 20 72 61 63 65 20 63 6f 6e 64 69  avoid race condi
262d0 74 69 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f  tions and to avo
262e0 69 64 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20  id violating.   
262f0 20 20 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a     ** [H33020]..
26300 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
26310 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
26320 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
26330 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
26340 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26350 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
26360 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ( nPage==0 ){.  
26370 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
26380 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
26390 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ();.          if
263a0 28 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  ( sqlite3OsLock(
263b0 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45  pPager->fd, RESE
263c0 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49  RVED_LOCK)==SQLI
263d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
263e0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
263f0 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65  lete(pVfs, pPage
26400 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
26410 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
26420 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
26430 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
26440 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
26450 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
26460 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
26470 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d  loc();.        }
26480 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26490 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  /* The journal f
264a0 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e  ile exists and n
264b0 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
264c0 6f 6e 20 68 61 73 20 61 20 72 65 73 65 72 76 65  on has a reserve
264d0 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  d.          ** o
264e0 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
264f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26500 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74  ile. Now check t
26510 68 61 74 20 74 68 65 72 65 20 69 73 0a 20 20 20  hat there is.   
26520 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61         ** at lea
26530 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20  st one non-zero 
26540 62 79 74 65 73 20 61 74 20 74 68 65 20 73 74 61  bytes at the sta
26550 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
26560 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
26570 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73    ** If there is
26580 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64  , then we consid
26590 65 72 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  er this journal 
265a0 74 6f 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f  to be hot. If no
265b0 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  t, .          **
265c0 20 69 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72   it can be ignor
265d0 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ed..          */
265e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
265f0 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
26600 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
26610 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
26620 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
26630 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  _MAIN_JOURNAL;. 
26640 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
26650 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
26660 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
26670 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
26680 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20  d, f, &f);.     
26690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
266a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
266b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
266c0 20 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a    u8 first = 0;.
266d0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
266e0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
266f0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69  Pager->jfd, (voi
26700 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30  d *)&first, 1, 0
26710 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
26720 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
26730 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
26740 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
26750 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
26760 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
26770 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a            if( !j
26780 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  rnlOpen ){.     
26790 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
267a0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
267b0 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
267c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
267d0 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69 72 73  *pExists = (firs
267e0 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t!=0);.         
267f0 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
26800 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29  QLITE_CANTOPEN )
26810 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
26820 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70   If we cannot op
26830 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
26840 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
26850 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a  order to see if.
26860 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
26870 74 73 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65  ts has a zero he
26880 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74  ader, that might
26890 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f   be due to an I/
268a0 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20  O error, or.    
268b0 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69          ** it mi
268c0 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 74 68  ght be due to th
268d0 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  e race condition
268e0 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
268f0 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20   and in.        
26900 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33      ** ticket #3
26910 38 38 33 2e 20 20 45 69 74 68 65 72 20 77 61 79  883.  Either way
26920 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
26930 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74  e journal is hot
26940 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
26950 20 54 68 69 73 20 6d 69 67 68 74 20 62 65 20 61   This might be a
26960 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e   false positive.
26970 20 20 42 75 74 20 69 66 20 69 74 20 69 73 2c 20    But if it is, 
26980 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20  then the.       
26990 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69       ** automati
269a0 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61  c journal playba
269b0 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20  ck and recovery 
269c0 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64  mechanism will d
269d0 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  eal.            
269e0 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64 65 72  ** with it under
269f0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
26a00 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  ck where we do n
26a10 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20  ot need to.     
26a20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20         ** worry 
26a30 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72 61 63  so much with rac
26a40 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20  e conditions..  
26a50 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
26a60 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74           *pExist
26a70 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  s = 1;.         
26a80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
26a90 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
26aa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
26ab0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
26ac0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
26ad0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
26ae0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74  is called to obt
26af0 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ain a shared loc
26b00 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
26b10 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73  e file..** It is
26b20 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c   illegal to call
26b30 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
26b40 75 69 72 65 28 29 20 75 6e 74 69 6c 20 61 66 74  uire() until aft
26b50 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
26b60 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63  .** has been suc
26b70 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64  cessfully called
26b80 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f  . If a shared-lo
26b90 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
26ba0 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20  ld when.** this 
26bb0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
26bc0 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
26bd0 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  p..**.** The fol
26be0 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  lowing operation
26bf0 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f  s are also perfo
26c00 72 6d 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rmed by this fun
26c10 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31  ction..**.**   1
26c20 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  ) If the pager i
26c30 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50  s currently in P
26c40 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74  AGER_UNLOCK stat
26c50 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a  e (no lock held.
26c60 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64  **      on the d
26c70 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74  atabase file), t
26c80 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
26c90 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e  s made to obtain
26ca0 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45   a.**      SHARE
26cb0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
26cc0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d  tabase file. Imm
26cd0 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f  ediately after o
26ce0 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  btaining.**     
26cf0 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
26d00 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  , the file-syste
26d10 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72  m is checked for
26d20 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a   a hot-journal,.
26d30 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73  **      which is
26d40 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20   played back if 
26d50 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69  present. Followi
26d60 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e  ng any hot-journ
26d70 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c  al .**      roll
26d80 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e  back, the conten
26d90 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  ts of the cache 
26da0 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79  are validated by
26db0 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20   checking.**    
26dc0 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f    the 'change-co
26dd0 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20  unter' field of 
26de0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26df0 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20  e header and.** 
26e00 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69       discarded i
26e10 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64  f they are found
26e20 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a   to be invalid..
26e30 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68  **.**   2) If th
26e40 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
26e50 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ng in exclusive-
26e60 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20  mode, and there 
26e70 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  are currently.**
26e80 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e        no outstan
26e90 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
26ea0 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e  to any pages, an
26eb0 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  d is in the erro
26ec0 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20  r state,.**     
26ed0 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
26ee0 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61   is made to clea
26ef0 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
26f00 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a  e by discarding.
26f10 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74  **      the cont
26f20 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
26f30 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69   cache and rolli
26f40 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e  ng back any open
26f50 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
26f60 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
26f70 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 65  the operation de
26f80 73 63 72 69 62 65 64 20 62 79 20 28 32 29 20 61  scribed by (2) a
26f90 62 6f 76 65 20 69 73 20 6e 6f 74 20 61 74 74 65  bove is not atte
26fa0 6d 70 74 65 64 2c 20 61 6e 64 20 69 66 20 74 68  mpted, and if th
26fb0 65 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e  e.** pager is in
26fc0 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   an error state 
26fd0 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
26fe0 45 5f 46 55 4c 4c 20 77 68 65 6e 20 74 68 69 73  E_FULL when this
26ff0 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 74   is called,.** t
27000 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65  he error state e
27010 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
27020 75 72 6e 65 64 2e 20 49 74 20 69 73 20 70 65 72  urned. It is per
27030 6d 69 74 74 65 64 20 74 6f 20 72 65 61 64 20 74  mitted to read t
27040 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77  he.** database w
27050 68 65 6e 20 69 6e 20 53 51 4c 49 54 45 5f 46 55  hen in SQLITE_FU
27060 4c 4c 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a  LL error state..
27070 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
27080 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
27090 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  s successful, SQ
270a0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
270b0 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 49 4f  ned. If an.** IO
270c0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
270d0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20  ile locking the 
270e0 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69  database, checki
270f0 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ng for a hot-jou
27100 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72 20  rnal.** file or 
27110 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a  rolling back a j
27120 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
27130 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
27140 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
27150 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
27160 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20  haredLock(Pager 
27170 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
27180 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
27190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
271a0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
271b0 0a 20 20 69 6e 74 20 69 73 45 72 72 6f 72 52 65  .  int isErrorRe
271c0 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  set = 0;        
271d0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
271e0 20 72 65 63 6f 76 65 72 69 6e 67 20 66 72 6f 6d   recovering from
271f0 20 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a   error state */.
27200 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
27210 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
27220 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e  d from b-tree an
27230 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72  d only when ther
27240 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75  e are no.  ** ou
27250 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
27260 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
27270 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
27280 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
27290 68 65 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  he)==0 );.  if( 
272a0 4e 45 56 45 52 28 4d 45 4d 44 42 20 26 26 20 70  NEVER(MEMDB && p
272b0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
272c0 29 7b 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  ){ return pPager
272d0 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20  ->errCode; }..  
272e0 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62  /* If this datab
272f0 61 73 65 20 69 73 20 69 6e 20 61 6e 20 65 72 72  ase is in an err
27300 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69 73  or-state, now is
27310 20 61 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65   a chance to cle
27320 61 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72 6f  ar.  ** the erro
27330 72 2e 20 44 69 73 63 61 72 64 20 74 68 65 20 63  r. Discard the c
27340 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
27350 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 72  ager-cache and r
27360 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 61 6e 79  ollback.  ** any
27370 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 6e 20   hot journal in 
27380 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
27390 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
273a0 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
273b0 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
273c0 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50  ager->jfd) || pP
273d0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 29  ager->zJournal )
273e0 7b 0a 20 20 20 20 20 20 69 73 45 72 72 6f 72 52  {.      isErrorR
273f0 65 73 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  eset = 1;.    }.
27400 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
27410 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ode = SQLITE_OK;
27420 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
27430 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
27440 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
27450 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
27460 72 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e 52  rc = pagerBeginR
27470 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
27480 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20  Pager);.  }else 
27490 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
274a0 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
274b0 7c 7c 20 69 73 45 72 72 6f 72 52 65 73 65 74 20  || isErrorReset 
274c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
274d0 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
274e0 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
274f0 20 20 20 20 69 6e 74 20 69 73 48 6f 74 4a 6f 75      int isHotJou
27500 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73  rnal = 0;.    as
27510 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
27520 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
27530 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
27540 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
27550 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  e)==0 );.    if(
27560 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
27570 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ock ){.      ass
27580 65 72 74 28 20 70 50 61 67 65 72 2d 3e 72 65 61  ert( pPager->rea
27590 64 4f 6e 6c 79 20 29 3b 0a 20 20 20 20 20 20 70  dOnly );.      p
275a0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
275b0 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
275c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
275d0 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
275e0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
275f0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
27600 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27610 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
27620 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
27630 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
27640 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  CK );.        re
27650 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
27660 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
27670 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
27680 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27690 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f  state>=SHARED_LO
276a0 43 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  CK );..    /* If
276b0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
276c0 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72  exists, and ther
276d0 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44  e is no RESERVED
276e0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
276f0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
27700 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65  e, then it eithe
27710 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  r needs to be pl
27720 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c  ayed back or del
27730 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
27740 20 69 66 28 20 21 69 73 45 72 72 6f 72 52 65 73   if( !isErrorRes
27750 65 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  et ){.      asse
27760 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
27770 65 20 3c 3d 20 50 41 47 45 52 5f 53 48 41 52 45  e <= PAGER_SHARE
27780 44 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  D );.      rc = 
27790 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  hasHotJournal(pP
277a0 61 67 65 72 2c 20 26 69 73 48 6f 74 4a 6f 75 72  ager, &isHotJour
277b0 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nal);.      if( 
277c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
277d0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
277e0 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iled;.      }.  
277f0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 45 72    }.    if( isEr
27800 72 6f 72 52 65 73 65 74 20 7c 7c 20 69 73 48 6f  rorReset || isHo
27810 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  tJournal ){.    
27820 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c    /* Get an EXCL
27830 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
27840 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
27850 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
27860 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d  t is.      ** im
27870 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52  portant that a R
27880 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
27890 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20  not obtained on 
278a0 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20  the way to the. 
278b0 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56       ** EXCLUSIV
278c0 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65  E lock. If it we
278d0 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63  re, another proc
278e0 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74  ess might open t
278f0 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
27900 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63  base file, detec
27910 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  t the RESERVED l
27920 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64  ock, and conclud
27930 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
27940 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
27950 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69  safe to read whi
27960 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
27970 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67  is still rolling
27980 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68   the .      ** h
27990 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e  ot-journal back.
279a0 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
279b0 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   ** Because the 
279c0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53  intermediate RES
279d0 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
279e0 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79  t requested, any
279f0 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
27a00 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69  process attempti
27a10 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ng to access the
27a20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
27a30 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20  ill get to .    
27a40 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20    ** this point 
27a50 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20  in the code and 
27a60 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69  fail to obtain i
27a70 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45  ts own EXCLUSIVE
27a80 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20   lock .      ** 
27a90 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
27aa0 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  file..      */. 
27ab0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
27ac0 3e 73 74 61 74 65 3c 45 58 43 4c 55 53 49 56 45  >state<EXCLUSIVE
27ad0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  _LOCK ){.       
27ae0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
27af0 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
27b00 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
27b10 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
27b20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27b30 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
27b40 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
27b50 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20   rc);.          
27b60 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
27b70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
27b80 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
27b90 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
27ba0 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
27bb0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
27bc0 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69  nal for read/wri
27bd0 74 65 20 61 63 63 65 73 73 2e 20 54 68 69 73 20  te access. This 
27be0 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a 20  is because in . 
27bf0 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76       ** exclusiv
27c00 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68  e-access mode th
27c10 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
27c20 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f  r will be kept o
27c30 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  pen and.      **
27c40 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66   possibly used f
27c50 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
27c60 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f   later on. On so
27c70 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a  me systems, the.
27c80 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63        ** OsTrunc
27c90 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20  ate() call used 
27ca0 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
27cb0 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65  ess mode also re
27cc0 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20  quires.      ** 
27cd0 61 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 6c  a read/write fil
27ce0 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20  e handle..      
27cf0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  */.      if( !is
27d00 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
27d10 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
27d20 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63   res;.        rc
27d30 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
27d40 73 73 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e  ss(pVfs,pPager->
27d50 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f  zJournal,SQLITE_
27d60 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 26 72  ACCESS_EXISTS,&r
27d70 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  es);.        if(
27d80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27d90 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
27da0 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  res ){.         
27db0 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
27dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
27dd0 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e   f = SQLITE_OPEN
27de0 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
27df0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
27e00 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  NAL;.           
27e10 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
27e20 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
27e30 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
27e40 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
27e50 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
27e60 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
27e70 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  , f, &fout);.   
27e80 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
27e90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
27ea0 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
27eb0 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20  >jfd) );.       
27ec0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
27ed0 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53  ITE_OK && fout&S
27ee0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
27ef0 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NLY ){.         
27f00 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
27f10 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
27f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
27f30 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
27f40 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
27f50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27f60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27f70 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
27f80 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
27f90 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c   exist, it usual
27fa0 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f  ly means that so
27fb0 6d 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  me .            
27fc0 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
27fd0 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67  ion managed to g
27fe0 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69  et in and roll i
27ff0 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20  t back before . 
28000 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
28010 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62  is connection ob
28020 74 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75  tained the exclu
28030 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e  sive lock above.
28040 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20 20   Or, it .       
28050 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e       ** may mean
28060 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
28070 77 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72  was in the error
28080 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73  -state when this
28090 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
280a0 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
280b0 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  led and the jour
280c0 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
280d0 74 20 65 78 69 73 74 2e 20 20 2a 2f 0a 20 20 20  t exist.  */.   
280e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
280f0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
28100 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ion(pPager, 0);.
28110 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28120 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
28130 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28140 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28150 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
28160 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
28170 52 65 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61  Reset the journa
28180 6c 20 73 74 61 74 75 73 20 66 69 65 6c 64 73 20  l status fields 
28190 74 6f 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  to indicates tha
281a0 74 20 77 65 20 68 61 76 65 20 6e 6f 0a 20 20 20  t we have no.   
281b0 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a     ** rollback j
281c0 6f 75 72 6e 61 6c 20 61 74 20 74 68 69 73 20 74  ournal at this t
281d0 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50  ime. */.      pP
281e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
281f0 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rted = 0;.      
28200 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
28210 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
28220 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
28230 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
28240 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
28250 30 3b 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4d 61  0;. .      /* Ma
28260 6b 65 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72  ke sure the jour
28270 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65  nal file has bee
28280 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  n synced to disk
28290 2e 20 2a 2f 0a 20 0a 20 20 20 20 20 20 2f 2a 20  . */. .      /* 
282a0 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c  Playback and del
282b0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
282c0 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62    Drop the datab
282d0 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20  ase write.      
282e0 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63  ** lock and reac
282f0 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c  quire the read l
28300 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63  ock. Purge the c
28310 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20  ache before.    
28320 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63    ** playing bac
28330 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61  k the hot-journa
28340 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e  l so that we don
28350 27 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20  't end up with. 
28360 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e       ** an incon
28370 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20  sistent cache.  
28380 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75  Sync the hot jou
28390 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79  rnal before play
283a0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  ing.      ** it 
283b0 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70  back since the p
283c0 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 61 73  rocess that cras
283d0 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65  hed and left the
283e0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   hot journal.   
283f0 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64     ** probably d
28400 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61  id not sync it a
28410 6e 64 20 77 65 20 61 72 65 20 72 65 71 75 69 72  nd we are requir
28420 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e  ed to always syn
28430 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a  c.      ** the j
28440 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c  ournal before pl
28450 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20  aying it back.. 
28460 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
28470 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
28480 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
28490 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48   rc = pagerSyncH
284a0 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
284b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
284c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
284d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
284e0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
284f0 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  ager, 1);.      
28500 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
28510 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
28520 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
28530 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
28540 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
28550 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
28560 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28570 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
28580 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d  (pPager->state==
28590 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20  PAGER_SHARED).  
285a0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61           || (pPa
285b0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
285c0 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74  de && pPager->st
285d0 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44  ate>PAGER_SHARED
285e0 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  ).      );.    }
285f0 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ..    if( pPager
28600 2d 3e 70 42 61 63 6b 75 70 20 7c 7c 20 73 71 6c  ->pBackup || sql
28610 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f  ite3PcachePageco
28620 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
28630 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  che)>0 ){.      
28640 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f  /* The shared-lo
28650 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ck has just been
28660 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65   acquired on the
28670 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
28680 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72       ** and ther
28690 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61  e are already pa
286a0 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
286b0 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75   (from a previou
286c0 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20  s.      ** read 
286d0 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
286e0 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f  tion).  Check to
286f0 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61   see if the data
28700 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61  base.      ** ha
28710 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e  s been modified.
28720 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
28730 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66  e has changed, f
28740 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a  lush the.      *
28750 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a  * cache..      *
28760 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62  *.      ** Datab
28770 61 73 65 20 63 68 61 6e 67 65 73 20 69 73 20 64  ase changes is d
28780 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69  etected by looki
28790 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62  ng at 15 bytes b
287a0 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a  eginning.      *
287b0 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69  * at offset 24 i
287c0 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54  nto the file.  T
287d0 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68  he first 4 of th
287e0 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65  ese 16 bytes are
287f0 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62  .      ** a 32-b
28800 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20  it counter that 
28810 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
28820 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e  ith each change.
28830 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f    The.      ** o
28840 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67  ther bytes chang
28850 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20  e randomly with 
28860 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65  each file change
28870 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61   when.      ** a
28880 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65   codec is in use
28890 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
288a0 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20    ** There is a 
288b0 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
288c0 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20  l chance that a 
288d0 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20  change will not 
288e0 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74  be .      ** det
288f0 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e  ected.  The chan
28900 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63  ce of an undetec
28910 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f  ted change is so
28920 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20   small that.    
28930 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e    ** it can be n
28940 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20  eglected..      
28950 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61  */.      int nPa
28960 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68  ge = 0;.      ch
28970 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69  ar dbFileVers[si
28980 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
28990 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20 20 20  ileVers)];.     
289a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
289b0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
289c0 6e 50 61 67 65 29 3b 0a 0a 20 20 20 20 20 20 69  nPage);..      i
289d0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
289e0 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  de ){.        rc
289f0 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
28a00 64 65 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  de;.        goto
28a10 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
28a20 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67  ..      if( nPag
28a30 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 49  e>0 ){.        I
28a40 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53 20  OTRACE(("CKVERS 
28a50 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
28a60 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
28a70 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ers)));.        
28a80 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
28a90 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ad(pPager->fd, &
28aa0 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
28ab0 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20  of(dbFileVers), 
28ac0 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  24);.        if(
28ad0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28ae0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
28af0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20   failed;.       
28b00 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
28b10 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64          memset(d
28b20 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69  bFileVers, 0, si
28b30 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
28b40 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
28b50 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61    if( memcmp(pPa
28b60 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
28b70 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a   dbFileVers, siz
28b80 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
28b90 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
28ba0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
28bb0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
28bc0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
28bd0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
28be0 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ode || pPager->s
28bf0 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
28c00 45 44 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ED );..    /* If
28c10 20 74 68 65 72 65 20 69 73 20 61 20 57 41 4c 20   there is a WAL 
28c20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65  file in the file
28c30 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68  -system, open th
28c40 69 73 20 64 61 74 61 62 61 73 65 20 69 6e 20 57  is database in W
28c50 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20  AL.    ** mode. 
28c60 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 66  Otherwise, the f
28c70 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
28c80 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  n call is a no-o
28c90 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  p..    */.    rc
28ca0 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49   = pagerOpenWalI
28cb0 66 50 72 65 73 65 6e 74 28 70 50 61 67 65 72 29  fPresent(pPager)
28cc0 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a  ;.  }.. failed:.
28cd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28ce0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61  _OK ){.    /* pa
28cf0 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20  ger_unlock() is 
28d00 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 65 78 63 6c  a no-op for excl
28d10 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69  usive mode and i
28d20 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
28d30 65 73 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72  es. */.    pager
28d40 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
28d50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
28d60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
28d70 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
28d80 74 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65  t has reached ze
28d90 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79  ro, rollback any
28da0 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73   active.** trans
28db0 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63  action and unloc
28dc0 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a  k the pager..**.
28dd0 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f  ** Except, in lo
28de0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
28df0 53 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20  SIVE when there 
28e00 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e  is nothing to in
28e10 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
28e20 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e   journal, the un
28e30 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66  lock is not perf
28e40 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20  ormed and there 
28e50 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f  is.** nothing to
28e60 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68   rollback, so th
28e70 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
28e80 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69  no-op..*/ .stati
28e90 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
28ea0 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72  ckIfUnused(Pager
28eb0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
28ec0 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52   (sqlite3PcacheR
28ed0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
28ee0 70 50 43 61 63 68 65 29 3d 3d 30 29 0a 20 20 20  pPCache)==0).   
28ef0 26 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78 63  && (!pPager->exc
28f00 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50  lusiveMode || pP
28f10 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
28f20 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 61  >0) .  ){.    pa
28f30 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
28f40 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
28f50 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  }.}../*.** Acqui
28f60 72 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  re a reference t
28f70 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67  o page number pg
28f80 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61 67  no in pager pPag
28f90 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65  er (a page.** re
28fa0 66 65 72 65 6e 63 65 20 68 61 73 20 74 79 70 65  ference has type
28fb0 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68   DbPage*). If th
28fc0 65 20 72 65 71 75 65 73 74 65 64 20 72 65 66 65  e requested refe
28fd0 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63  rence is .** suc
28fe0 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e  cessfully obtain
28ff0 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64  ed, it is copied
29000 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20   to *ppPage and 
29010 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
29020 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
29030 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
29040 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
29050 65 20 63 61 63 68 65 2c 20 69 74 20 69 73 20 72  e cache, it is r
29060 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68  eturned. .** Oth
29070 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61  erwise, a new pa
29080 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c  ge object is all
29090 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c  ocated and popul
290a0 61 74 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a  ated with data.*
290b0 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  * read from the 
290c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
290d0 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68  n some cases, th
290e0 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20  e pcache module 
290f0 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f  may.** choose no
29100 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20  t to allocate a 
29110 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20  new page object 
29120 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e  and may reuse an
29130 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a   existing.** obj
29140 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73  ect with no outs
29150 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
29160 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78  es..**.** The ex
29170 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65  tra data appende
29180 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61  d to a page is a
29190 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65  lways initialize
291a0 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a  d to zeros the .
291b0 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61 20  ** first time a 
291c0 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69  page is loaded i
291d0 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74  nto memory. If t
291e0 68 65 20 70 61 67 65 20 72 65 71 75 65 73 74 65  he page requeste
291f0 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79  d is .** already
29200 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 77 68   in the cache wh
29210 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
29220 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e   is called, then
29230 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61   the extra.** da
29240 74 61 20 69 73 20 6c 65 66 74 20 61 73 20 69 74  ta is left as it
29250 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 70 61   was when the pa
29260 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61  ge object was la
29270 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  st used..**.** I
29280 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
29290 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20  mage is smaller 
292a0 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
292b0 65 64 20 70 61 67 65 20 6f 72 20 69 66 20 61 20  ed page or if a 
292c0 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  .** non-zero val
292d0 75 65 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ue is passed as 
292e0 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61  the noContent pa
292f0 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20  rameter and the 
29300 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70 61  .** requested pa
29310 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
29320 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  y stored in the 
29330 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a  cache, then no .
29340 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72  ** actual disk r
29350 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74  ead occurs. In t
29360 68 69 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d  his case the mem
29370 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
29380 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69   .** page is ini
29390 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20  tialized to all 
293a0 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  zeros. .**.** If
293b0 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72   noContent is tr
293c0 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ue, it means tha
293d0 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
293e0 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65   about the conte
293f0 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  nts.** of the pa
29400 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20  ge. This occurs 
29410 69 6e 20 74 77 6f 20 73 65 70 65 72 61 74 65 20  in two seperate 
29420 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a  scenarios:.**.**
29430 20 20 20 61 29 20 57 68 65 6e 20 72 65 61 64 69     a) When readi
29440 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  ng a free-list l
29450 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68  eaf page from th
29460 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a  e database, and.
29470 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20  **.**   b) When 
29480 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62  a savepoint is b
29490 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
294a0 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20   and we need to 
294b0 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e  load.**      a n
294c0 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ew page into the
294d0 20 63 61 63 68 65 20 74 6f 20 62 65 20 66 69 6c   cache to be fil
294e0 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  led with the dat
294f0 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66  a read.**      f
29500 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e  rom the savepoin
29510 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
29520 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73   If noContent is
29530 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
29540 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 69 73  data returned is
29550 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20   zeroed instead 
29560 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64  of.** being read
29570 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
29580 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  se. Additionally
29590 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72 72 65  , the bits corre
295a0 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70  sponding.** to p
295b0 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e  gno in Pager.pIn
295c0 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20  Journal (bitvec 
295d0 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79  of pages already
295e0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
295f0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  ** journal file)
29600 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61   and the PagerSa
29610 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
29620 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20  oint bitvecs of 
29630 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65  any open.** save
29640 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20  points are set. 
29650 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68  This means if th
29660 65 20 70 61 67 65 20 69 73 20 6d 61 64 65 20 77  e page is made w
29670 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a  ritable at any.*
29680 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  * point in the f
29690 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63  uture, using a c
296a0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61  all to sqlite3Pa
296b0 67 65 72 57 72 69 74 65 28 29 2c 20 69 74 73 20  gerWrite(), its 
296c0 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c  contents.** will
296d0 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65   not be journale
296e0 64 2e 20 54 68 69 73 20 73 61 76 65 73 20 49 4f  d. This saves IO
296f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75  ..**.** The acqu
29700 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61  isition might fa
29710 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72  il for several r
29720 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20  easons.  In all 
29730 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70  cases,.** an app
29740 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
29750 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
29760 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73  and *ppPage is s
29770 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
29780 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
29790 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e  e3PagerLookup().
297a0 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74    Both this rout
297b0 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29  ine and Lookup()
297c0 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66   attempt.** to f
297d0 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
297e0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
297f0 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65  e first.  If the
29800 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
29810 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  eady.** in memor
29820 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
29830 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20  goes to disk to 
29840 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65  read it in where
29850 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a  as Lookup().** j
29860 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20  ust returns 0.  
29870 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71  This routine acq
29880 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  uires a read-loc
29890 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
298a0 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f   it.** has to go
298b0 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f   to disk, and co
298c0 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63  uld also playbac
298d0 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  k an old journal
298e0 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
298f0 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29  * Since Lookup()
29900 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64   never goes to d
29910 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61  isk, it never ha
29920 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c  s to deal with l
29930 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e  ocks.** or journ
29940 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  al files..*/.int
29950 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
29960 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70  uire(.  Pager *p
29970 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54  Pager,      /* T
29980 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e  he pager open on
29990 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
299a0 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
299b0 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  o,          /* P
299c0 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65  age number to fe
299d0 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  tch */.  DbPage 
299e0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
299f0 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20  Write a pointer 
29a00 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65  to the page here
29a10 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74   */.  int noCont
29a20 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  ent       /* Do 
29a30 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69  not bother readi
29a40 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ng content from 
29a50 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a  disk if true */.
29a60 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
29a70 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73  gHdr *pPg;..  as
29a80 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
29a90 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
29aa0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
29ab0 61 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45  ager->state>PAGE
29ac0 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69  R_UNLOCK );..  i
29ad0 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  f( pgno==0 ){.  
29ae0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29af0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
29b00 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
29b10 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65  ager is in the e
29b20 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75  rror state, retu
29b30 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65  rn an error imme
29b40 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f  diately. .  ** O
29b50 74 68 65 72 77 69 73 65 2c 20 72 65 71 75 65 73  therwise, reques
29b60 74 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  t the page from 
29b70 74 68 65 20 50 43 61 63 68 65 20 6c 61 79 65 72  the PCache layer
29b80 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  . */.  if( pPage
29b90 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
29ba0 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
29bb0 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
29bc0 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20  _FULL ){.    rc 
29bd0 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
29be0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
29bf0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
29c00 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
29c10 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31  pPCache, pgno, 1
29c20 2c 20 70 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  , ppPage);.  }..
29c30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29c40 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69  _OK ){.    /* Ei
29c50 74 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f  ther the call to
29c60 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
29c70 74 63 68 28 29 20 72 65 74 75 72 6e 65 64 20 61  tch() returned a
29c80 6e 20 65 72 72 6f 72 20 6f 72 20 74 68 65 0a 20  n error or the. 
29c90 20 20 20 2a 2a 20 70 61 67 65 72 20 77 61 73 20     ** pager was 
29ca0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65  already in the e
29cb0 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20  rror-state when 
29cc0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61  this function wa
29cd0 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a  s called..    **
29ce0 20 53 65 74 20 70 50 67 20 74 6f 20 30 20 61 6e   Set pPg to 0 an
29cf0 64 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 78  d jump to the ex
29d00 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e  ception handler.
29d10 20 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 30    */.    pPg = 0
29d20 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72  ;.    goto pager
29d30 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
29d40 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  }.  assert( (*pp
29d50 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e  Page)->pgno==pgn
29d60 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  o );.  assert( (
29d70 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72  *ppPage)->pPager
29d80 3d 3d 70 50 61 67 65 72 20 7c 7c 20 28 2a 70 70  ==pPager || (*pp
29d90 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 30  Page)->pPager==0
29da0 20 29 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70 50   );..  if( (*ppP
29db0 61 67 65 29 2d 3e 70 50 61 67 65 72 20 26 26 20  age)->pPager && 
29dc0 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  !noContent ){.  
29dd0 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
29de0 65 20 74 68 65 20 70 63 61 63 68 65 20 61 6c 72  e the pcache alr
29df0 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e  eady contains an
29e00 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70   initialized cop
29e10 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  y of.    ** the 
29e20 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74  page. Return wit
29e30 68 6f 75 74 20 66 75 72 74 68 65 72 20 61 64 6f  hout further ado
29e40 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
29e50 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41  ( pgno<=PAGER_MA
29e60 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d  X_PGNO && pgno!=
29e70 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
29e80 61 67 65 72 29 20 29 3b 0a 20 20 20 20 50 41 47  ager) );.    PAG
29e90 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
29ea0 6e 48 69 74 29 3b 0a 20 20 20 20 72 65 74 75 72  nHit);.    retur
29eb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
29ec0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
29ed0 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61  e pager cache ha
29ee0 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20  s created a new 
29ef0 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e  page. Its conten
29f00 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20  t needs to .    
29f10 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ** be initialize
29f20 64 2e 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  d.  */.    int n
29f30 4d 61 78 3b 0a 0a 20 20 20 20 50 41 47 45 52 5f  Max;..    PAGER_
29f40 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69  INCR(pPager->nMi
29f50 73 73 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 2a  ss);.    pPg = *
29f60 70 70 50 61 67 65 3b 0a 20 20 20 20 70 50 67 2d  ppPage;.    pPg-
29f70 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
29f80 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61  ;..    /* The ma
29f90 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65  ximum page numbe
29fa0 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72  r is 2^31. Retur
29fb0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
29fc0 20 69 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a   if a page.    *
29fd0 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  * number greater
29fe0 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74   than this, or t
29ff0 68 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e  he unused lockin
2a000 67 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75 65  g-page, is reque
2a010 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  sted. */.    if(
2a020 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
2a030 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  PGNO || pgno==PA
2a040 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
2a050 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
2a060 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2a070 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
2a080 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
2a090 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
2a0a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2a0b0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
2a0c0 72 2c 20 26 6e 4d 61 78 29 3b 0a 20 20 20 20 69  r, &nMax);.    i
2a0d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2a0e0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
2a0f0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
2a100 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
2a110 20 4d 45 4d 44 42 20 7c 7c 20 6e 4d 61 78 3c 28   MEMDB || nMax<(
2a120 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f  int)pgno || noCo
2a130 6e 74 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e  ntent || !isOpen
2a140 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
2a150 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
2a160 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
2a170 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2a180 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  LITE_FULL;.     
2a190 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
2a1a0 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
2a1b0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43   }.      if( noC
2a1c0 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
2a1d0 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20    /* Failure to 
2a1e0 73 65 74 20 74 68 65 20 62 69 74 73 20 69 6e 20  set the bits in 
2a1f0 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  the InJournal bi
2a200 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e  t-vectors is ben
2a210 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ign..        ** 
2a220 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20  It merely means 
2a230 74 68 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f  that we might do
2a240 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b   some extra work
2a250 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20   to journal a . 
2a260 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74         ** page t
2a270 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
2a280 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65  d to be journale
2a290 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73  d.  Nevertheless
2a2a0 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20 20 20  , be sure .     
2a2b0 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68     ** to test th
2a2c0 65 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d  e case where a m
2a2d0 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75  alloc error occu
2a2e0 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
2a2f0 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20 20  to set .        
2a300 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62 69  ** a bit in a bi
2a310 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20  t vector..      
2a320 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c    */.        sql
2a330 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
2a340 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
2a350 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65   if( pgno<=pPage
2a360 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b  r->dbOrigSize ){
2a370 0a 20 20 20 20 20 20 20 20 20 20 54 45 53 54 4f  .          TESTO
2a380 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69  NLY( rc = ) sqli
2a390 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
2a3a0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
2a3b0 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
2a3c0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
2a3d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
2a3e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a3f0 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d    TESTONLY( rc =
2a400 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e   ) addToSavepoin
2a410 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c  tBitvecs(pPager,
2a420 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
2a430 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
2a440 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
2a450 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
2a460 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
2a470 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
2a480 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c  mset(pPg->pData,
2a490 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
2a4a0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54  Size);.      IOT
2a4b0 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25  RACE(("ZERO %p %
2a4c0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
2a4d0 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  no));.    }else{
2a4e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2a4f0 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
2a500 65 72 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  er );.      rc =
2a510 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29   readDbPage(pPg)
2a520 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2a530 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a540 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
2a550 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
2a560 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65     }.    }.#ifde
2a570 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
2a580 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
2a590 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
2a5a0 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
2a5b0 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ndif.  }..  retu
2a5c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
2a5d0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
2a5e0 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  :.  assert( rc!=
2a5f0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
2a600 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71  f( pPg ){.    sq
2a610 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
2a620 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  pPg);.  }.  page
2a630 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
2a640 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50  pPager);..  *ppP
2a650 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  age = 0;.  retur
2a660 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
2a670 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
2a680 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
2a690 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
2a6a0 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
2a6b0 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
2a6c0 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
2a6d0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
2a6e0 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
2a6f0 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
2a700 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 41   not in cache. A
2a710 6c 73 6f 2c 20 72 65 74 75 72 6e 20 30 20 69 66  lso, return 0 if
2a720 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 72 20 69   the .** pager i
2a730 73 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43  s in PAGER_UNLOC
2a740 4b 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  K state when thi
2a750 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2a760 6c 6c 65 64 2c 0a 2a 2a 20 6f 72 20 69 66 20 74  lled,.** or if t
2a770 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 61  he pager is in a
2a780 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74  n error state ot
2a790 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
2a7a0 46 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  FULL..**.** See 
2a7b0 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
2a7c0 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  rGet().  The dif
2a7d0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
2a7e0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
2a7f0 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
2a800 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67  Get() is that _g
2a810 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20  et() will go to 
2a820 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61  the disk and rea
2a830 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65  d.** in the page
2a840 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
2a850 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63  not already in c
2a860 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
2a870 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e  ine.** returns N
2a880 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20  ULL if the page 
2a890 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
2a8a0 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f  or if a disk I/O
2a8b0 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65   error .** has e
2a8c0 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f  ver happened..*/
2a8d0 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33  .DbPage *sqlite3
2a8e0 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65  PagerLookup(Page
2a8f0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
2a900 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
2a910 70 50 67 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  pPg = 0;.  asser
2a920 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
2a930 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
2a940 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2a950 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d  Pager->pPCache!=
2a960 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2a970 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3e 20 50  Pager->state > P
2a980 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
2a990 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
2a9a0 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
2a9b0 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70  che, pgno, 0, &p
2a9c0 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg);.  return pP
2a9d0 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  g;.}../*.** Rele
2a9e0 61 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72  ase a page refer
2a9f0 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ence..**.** If t
2aa00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
2aa10 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
2aa20 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f  age drop to zero
2aa30 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61  , then the.** pa
2aa40 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ge is added to t
2aa50 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68  he LRU list.  Wh
2aa60 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  en all reference
2aa70 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a  s to all pages.*
2aa80 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20  * are released, 
2aa90 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
2aaa0 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  s and the lock o
2aab0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
2aac0 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f  s.** removed..*/
2aad0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
2aae0 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a  erUnref(DbPage *
2aaf0 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20  pPg){.  if( pPg 
2ab00 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
2ab10 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
2ab20 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  er;.    sqlite3P
2ab30 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
2ab40 29 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  );.    pagerUnlo
2ab50 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
2ab60 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
2ab70 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2ab80 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20  s called at the 
2ab90 73 74 61 72 74 20 6f 66 20 65 76 65 72 79 20 77  start of every w
2aba0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
2abb0 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  ..** There must 
2abc0 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53  already be a RES
2abd0 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
2abe0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
2abf0 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65  atabase .** file
2ac00 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
2ac10 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
2ac20 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75  .** Open the jou
2ac30 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
2ac40 67 65 72 20 70 50 61 67 65 72 20 61 6e 64 20 77  ger pPager and w
2ac50 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68  rite a journal h
2ac60 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  eader.** to the 
2ac70 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20  start of it. If 
2ac80 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
2ac90 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65   savepoints, ope
2aca0 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  n the sub-journa
2acb0 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68  l.** as well. Th
2acc0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
2acd0 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74 68  nly used when th
2ace0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2acf0 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e  s being .** open
2ad00 65 64 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f  ed to write a ro
2ad10 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61  llback log for a
2ad20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74   transaction. It
2ad30 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a   is not used .**
2ad40 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   when opening a 
2ad50 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot journal file
2ad60 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
2ad70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
2ad80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61  ournal file is a
2ad90 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20  lready open (as 
2ada0 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63  it may be in exc
2adb0 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a  lusive mode),.**
2adc0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
2add0 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20  ion just writes 
2ade0 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  a journal header
2adf0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
2ae00 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20   the.** already 
2ae10 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  open file. .**.*
2ae20 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
2ae30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2ae40 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74  e is opened by t
2ae50 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  his function, th
2ae60 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f  e.** Pager.pInJo
2ae70 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72  urnal bitvec str
2ae80 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61  ucture is alloca
2ae90 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ted..**.** Retur
2aea0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
2aeb0 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
2aec0 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69  cessful. Otherwi
2aed0 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  se, return .** S
2aee0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74  QLITE_NOMEM if t
2aef0 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c  he attempt to al
2af00 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e  locate Pager.pIn
2af10 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  Journal fails, o
2af20 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f  r .** an IO erro
2af30 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e  r code if openin
2af40 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  g or writing the
2af50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61   journal file fa
2af60 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
2af70 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f  nt pager_open_jo
2af80 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
2af90 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
2afa0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2afb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afc0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2afd0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
2afe0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2aff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b000 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74    /* Size of dat
2b010 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2b020 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
2b030 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
2b040 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f  r->pVfs;   /* Lo
2b050 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73  cal cache of vfs
2b060 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   pointer */..  a
2b070 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2b080 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
2b090 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  RVED );.  assert
2b0a0 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
2b0b0 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
2b0c0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
2b0d0 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
2b0e0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a  RNALMODE_OFF );.
2b0f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2b100 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
2b110 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c  );.  .  /* If al
2b120 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72  ready in the err
2b130 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73 20 66  or state, this f
2b140 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
2b150 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a  op.  But on.  **
2b160 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
2b170 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
2b180 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66   never called if
2b190 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
2b1a0 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  in.  ** an error
2b1b0 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28   state. */.  if(
2b1c0 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
2b1d0 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e  rrCode) ) return
2b1e0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2b1f0 3b 0a 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  ;..  testcase( p
2b200 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
2b210 69 64 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  id==0 );.  rc = 
2b220 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
2b230 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
2b240 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
2b250 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
2b260 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
2b270 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  l = sqlite3Bitve
2b280 63 43 72 65 61 74 65 28 6e 50 61 67 65 29 3b 0a  cCreate(nPage);.
2b290 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
2b2a0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20  nJournal==0 ){. 
2b2b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2b2c0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  _NOMEM;.  }..  /
2b2d0 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
2b2e0 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  al file if it is
2b2f0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
2b300 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f  n. */.  if( !isO
2b310 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2b320 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
2b330 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
2b340 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2b350 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  DE_MEMORY ){.   
2b360 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75     sqlite3MemJou
2b370 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
2b380 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  >jfd);.    }else
2b390 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  {.      const in
2b3a0 74 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20  t flags =       
2b3b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
2b3c0 46 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e  FS flags to open
2b3d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
2b3e0 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
2b3f0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
2b400 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
2b410 45 7c 0a 20 20 20 20 20 20 20 20 28 70 50 61 67  E|.        (pPag
2b420 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a  er->tempFile ? .
2b430 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54            (SQLIT
2b440 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
2b450 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  LOSE|SQLITE_OPEN
2b460 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a  _TEMP_JOURNAL):.
2b470 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54            (SQLIT
2b480 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
2b490 4e 41 4c 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  NAL).        );.
2b4a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2b4b0 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
2b4c0 45 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  E.      rc = sql
2b4d0 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  ite3JournalOpen(
2b4e0 0a 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c  .          pVfs,
2b4f0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2b500 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
2b510 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65  flags, jrnlBuffe
2b520 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20  rSize(pPager).  
2b530 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20      );.#else.   
2b540 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2b550 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
2b560 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
2b570 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73  ager->jfd, flags
2b580 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
2b590 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
2b5a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
2b5b0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2b5c0 66 64 29 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  fd) );.  }...  /
2b5d0 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 72 73  * Write the firs
2b5e0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
2b5f0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
2b600 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20  file and open . 
2b610 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
2b620 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
2b630 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
2b640 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b650 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b    /* TODO: Check
2b660 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65   if all of these
2b670 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75   are really requ
2b680 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 70 50 61  ired. */.    pPa
2b690 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
2b6a0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
2b6b0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
2b6c0 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
2b6d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  ;.    pPager->ne
2b6e0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
2b6f0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
2b700 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
2b710 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
2b720 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
2b730 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ter = 0;.    pPa
2b740 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
2b750 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 72  = 0;.    rc = wr
2b760 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
2b770 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ager);.  }..  if
2b780 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2b790 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
2b7a0 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
2b7b0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
2b7c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
2b7d0 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d  Journal = 0;.  }
2b7e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2b7f0 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77  ./*.** Begin a w
2b800 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
2b810 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
2b820 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  d pager object. 
2b830 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74  If a .** write-t
2b840 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
2b850 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e  lready been open
2b860 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
2b870 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
2b880 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61  .** If the exFla
2b890 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61  g argument is fa
2b8a0 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72  lse, then acquir
2b8b0 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  e at least a RES
2b8c0 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e  ERVED.** lock on
2b8d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b8e0 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73  le. If exFlag is
2b8f0 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75   true, then acqu
2b900 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  ire at least.** 
2b910 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
2b920 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  k. If such a loc
2b930 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
2b940 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a  d, no locking .*
2b950 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64  * functions need
2b960 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   be called..**.*
2b970 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  * If this is not
2b980 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
2b990 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 61  in-memory file a
2b9a0 6e 64 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nd, the journal 
2b9b0 66 69 6c 65 20 69 73 20 0a 2a 2a 20 6f 70 65 6e  file is .** open
2b9c0 65 64 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74  ed if it has not
2b9d0 20 62 65 65 6e 20 61 6c 72 65 61 64 79 2e 20 46   been already. F
2b9e0 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  or a temporary f
2b9f0 69 6c 65 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67  ile, the opening
2ba00 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 75 72   .** of the jour
2ba10 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65  nal file is defe
2ba20 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65  rred until there
2ba30 20 69 73 20 61 6e 20 61 63 74 75 61 6c 20 6e 65   is an actual ne
2ba40 65 64 20 74 6f 20 0a 2a 2a 20 77 72 69 74 65 20  ed to .** write 
2ba50 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  to the journal. 
2ba60 54 4f 44 4f 3a 20 57 68 79 20 68 61 6e 64 6c 65  TODO: Why handle
2ba70 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
2ba80 20 64 69 66 66 65 72 65 6e 74 6c 79 3f 0a 2a 2a   differently?.**
2ba90 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
2baa0 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  al file is opene
2bab0 64 20 28 6f 72 20 69 66 20 69 74 20 69 73 20 61  d (or if it is a
2bac0 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 20 74 68  lready open), th
2bad0 65 6e 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d  en a.** journal-
2bae0 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
2baf0 6e 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  n to the start o
2bb00 66 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  f it..**.** If t
2bb10 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  he subjInMemory 
2bb20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d  argument is non-
2bb30 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73  zero, then any s
2bb40 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65  ub-journal opene
2bb50 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73  d.** within this
2bb60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
2bb70 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61  l be opened as a
2bb80 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  n in-memory file
2bb90 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f  . This.** has no
2bba0 20 65 66 66 65 63 74 20 69 66 20 74 68 65 20 73   effect if the s
2bbb0 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c  ub-journal is al
2bbc0 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73  ready opened (as
2bbd0 20 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a   it may be when.
2bbe0 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  ** running in ex
2bbf0 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72  clusive mode) or
2bc00 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
2bc10 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  ion does not req
2bc20 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f  uire a.** sub-jo
2bc30 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75  urnal. If the su
2bc40 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d  bjInMemory argum
2bc50 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65  ent is zero, the
2bc60 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a  n any required.*
2bc70 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  * sub-journal is
2bc80 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d   implemented in-
2bc90 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72  memory if pPager
2bca0 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
2bcb0 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f   database, .** o
2bcc0 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72  r using a tempor
2bcd0 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69  ary file otherwi
2bce0 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
2bcf0 65 33 50 61 67 65 72 42 65 67 69 6e 28 50 61 67  e3PagerBegin(Pag
2bd00 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
2bd10 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a  exFlag, int subj
2bd20 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74  InMemory){.  int
2bd30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2bd40 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2bd50 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
2bd60 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 70 50 61 67  UNLOCK );.  pPag
2bd70 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  er->subjInMemory
2bd80 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d   = (u8)subjInMem
2bd90 6f 72 79 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  ory;..  if( pPag
2bda0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
2bdb0 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61  _SHARED ){.    a
2bdc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
2bdd0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
2bde0 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
2bdf0 44 42 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  DB && !pPager->t
2be00 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 20 20  empFile );..    
2be10 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
2be20 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
2be30 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
2be40 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74   is configured t
2be50 6f 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  o use locking_mo
2be60 64 65 3d 65 78 63 6c 75 73 69 76 65 2c 20 61 6e  de=exclusive, an
2be70 64 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78  d an.      ** ex
2be80 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
2be90 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
2bea0 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64  not already held
2beb0 2c 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e  , obtain it now.
2bec0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2bed0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  if( pPager->excl
2bee0 75 73 69 76 65 4d 6f 64 65 20 26 26 20 73 71 6c  usiveMode && sql
2bef0 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65  ite3WalExclusive
2bf00 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61  Mode(pPager->pWa
2bf10 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  l, -1) ){.      
2bf20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2bf30 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
2bf40 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
2bf50 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
2bf60 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
2bf70 53 48 41 52 45 44 3b 0a 20 20 20 20 20 20 20 20  SHARED;.        
2bf80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2bf90 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
2bfa0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2bfb0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
2bfc0 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
2bfd0 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
2bfe0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 1);.      }.. 
2bff0 20 20 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65       /* Grab the
2c000 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
2c010 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20  he log file. If 
2c020 73 75 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72  successful, upgr
2c030 61 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ade to.      ** 
2c040 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73  PAGER_RESERVED s
2c050 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tate. Otherwise,
2c060 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
2c070 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
2c080 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  ler..      ** Th
2c090 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69  e busy-handler i
2c0a0 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66  s not invoked if
2c0b0 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   another connect
2c0c0 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20  ion already.    
2c0d0 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77    ** holds the w
2c0e0 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f  rite-lock. If po
2c0f0 73 73 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65  ssible, the uppe
2c100 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c  r layer will cal
2c110 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  l it..      **. 
2c120 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65       ** WAL mode
2c130 20 73 65 74 73 20 50 61 67 65 72 2e 73 74 61 74   sets Pager.stat
2c140 65 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  e to PAGER_RESER
2c150 56 45 44 20 77 68 65 6e 20 69 74 20 68 61 73 20  VED when it has 
2c160 61 6e 20 6f 70 65 6e 0a 20 20 20 20 20 20 2a 2a  an open.      **
2c170 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75   transaction, bu
2c180 74 20 6e 65 76 65 72 20 74 6f 20 50 41 47 45 52  t never to PAGER
2c190 5f 45 58 43 4c 55 53 49 56 45 2e 20 54 68 69 73  _EXCLUSIVE. This
2c1a0 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a   is because in .
2c1b0 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45        ** PAGER_E
2c1c0 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 20 74  XCLUSIVE state t
2c1d0 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 20  he code to roll 
2c1e0 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 74  back savepoint t
2c1f0 72 61 6e 73 61 63 74 69 6f 6e 73 0a 20 20 20 20  ransactions.    
2c200 20 20 2a 2a 20 6d 61 79 20 63 6f 70 79 20 64 61    ** may copy da
2c210 74 61 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ta from the sub-
2c220 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65  journal into the
2c230 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
2c240 73 20 77 65 6c 6c 0a 20 20 20 20 20 20 2a 2a 20  s well.      ** 
2c250 61 73 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  as into the page
2c260 20 63 61 63 68 65 2e 20 57 68 69 63 68 20 77 6f   cache. Which wo
2c270 75 6c 64 20 62 65 20 69 6e 63 6f 72 72 65 63 74  uld be incorrect
2c280 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20   in WAL mode..  
2c290 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2c2a0 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  = sqlite3WalBegi
2c2b0 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
2c2c0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
2c2d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2c2e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c2f0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72      pPager->dbOr
2c300 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  igSize = pPager-
2c310 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  >dbSize;.       
2c320 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
2c330 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b   PAGER_RESERVED;
2c340 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
2c350 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
2c360 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2c370 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
2c380 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
2c390 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  >state==PAGER_RE
2c3a0 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 20 20  SERVED );.      
2c3b0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
2c3c0 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
2c3d0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
2c3e0 41 52 45 44 20 29 3b 0a 20 20 20 20 7d 65 6c 73  ARED );.    }els
2c3f0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61  e{.      /* Obta
2c400 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
2c410 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2c420 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  se file. If the 
2c430 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72  exFlag parameter
2c440 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75  .      ** is tru
2c450 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74  e, then immediat
2c460 65 6c 79 20 75 70 67 72 61 64 65 20 74 68 69 73  ely upgrade this
2c470 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
2c480 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20   lock. The.     
2c490 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72   ** busy-handler
2c4a0 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65   callback can be
2c4b0 20 75 73 65 64 20 77 68 65 6e 20 75 70 67 72 61   used when upgra
2c4c0 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c  ding to the EXCL
2c4d0 55 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c  USIVE.      ** l
2c4e0 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65  ock, but not whe
2c4f0 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20  n obtaining the 
2c500 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20  RESERVED lock.. 
2c510 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
2c520 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
2c530 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53  (pPager->fd, RES
2c540 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  ERVED_LOCK);.   
2c550 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2c560 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2c570 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
2c580 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a  PAGER_RESERVED;.
2c590 20 20 20 20 20 20 20 20 69 66 28 20 65 78 46 6c          if( exFl
2c5a0 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
2c5b0 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
2c5c0 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
2c5d0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
2c5e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c5f0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2c600 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6f 70 65 6e   No need to open
2c610 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2c620 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  e at this time. 
2c630 20 49 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20   It will be.    
2c640 2a 2a 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  ** opened before
2c650 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 20 74   it is written t
2c660 6f 2e 20 20 49 66 20 77 65 20 64 65 66 65 72 20  o.  If we defer 
2c670 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72  opening the jour
2c680 6e 61 6c 2c 0a 20 20 20 20 2a 2a 20 77 65 20 6d  nal,.    ** we m
2c690 69 67 68 74 20 73 61 76 65 20 74 68 65 20 77 6f  ight save the wo
2c6a0 72 6b 20 6f 66 20 63 72 65 61 74 69 6e 67 20 61  rk of creating a
2c6b0 20 66 69 6c 65 20 69 66 20 74 68 65 20 74 72 61   file if the tra
2c6c0 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nsaction.    ** 
2c6d0 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 61 20  ends up being a 
2c6e0 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 0a 20  no-op..    */.. 
2c6f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2c700 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
2c710 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 64  sert( !pPager->d
2c720 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a 20 20 20  bModified );.   
2c730 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 61 6e 79     /* Ignore any
2c740 20 49 4f 20 65 72 72 6f 72 20 74 68 61 74 20 6f   IO error that o
2c750 63 63 75 72 73 20 77 69 74 68 69 6e 20 70 61 67  ccurs within pag
2c760 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
2c770 6f 6e 28 29 2e 20 54 68 65 0a 20 20 20 20 20 20  on(). The.      
2c780 2a 2a 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68  ** purpose of th
2c790 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 72 65  is call is to re
2c7a0 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  set the internal
2c7b0 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
2c7c0 67 65 72 0a 20 20 20 20 20 20 2a 2a 20 73 75 62  ger.      ** sub
2c7d0 2d 73 79 73 74 65 6d 2e 20 49 74 20 64 6f 65 73  -system. It does
2c7e0 6e 27 74 20 6d 61 74 74 65 72 20 69 66 20 74 68  n't matter if th
2c7f0 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69  e journal-file i
2c800 73 20 6e 6f 74 20 70 72 6f 70 65 72 6c 79 0a 20  s not properly. 
2c810 20 20 20 20 20 2a 2a 20 66 69 6e 61 6c 69 7a 65       ** finalize
2c820 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  d at this point 
2c830 28 73 69 6e 63 65 20 69 74 20 69 73 20 6e 6f 74  (since it is not
2c840 20 61 20 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c   a valid journal
2c850 20 66 69 6c 65 20 61 6e 79 77 61 79 29 2e 0a 20   file anyway).. 
2c860 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 61       */.      pa
2c870 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
2c880 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ion(pPager, 0);.
2c890 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 50 41 47      }.  }..  PAG
2c8a0 45 52 54 52 41 43 45 28 28 22 54 52 41 4e 53 41  ERTRACE(("TRANSA
2c8b0 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
2c8c0 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
2c8d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2c8e0 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e  /*.** Mark a sin
2c8f0 67 6c 65 20 64 61 74 61 20 70 61 67 65 20 61 73  gle data page as
2c900 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20   writeable. The 
2c910 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
2c920 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69  into the .** mai
2c930 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62  n journal or sub
2c940 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75  -journal as requ
2c950 69 72 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  ired. If the pag
2c960 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
2c970 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20  o.** one of the 
2c980 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f  journals, the co
2c990 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
2c9a0 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a  is set in the .*
2c9b0 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  * Pager.pInJourn
2c9c0 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20 74 68  al bitvec and th
2c9d0 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
2c9e0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69  .pInSavepoint bi
2c9f0 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20  tvecs.** of any 
2ca00 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
2ca10 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  as appropriate..
2ca20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
2ca30 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20  ger_write(PgHdr 
2ca40 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70  *pPg){.  void *p
2ca50 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
2ca60 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  a;.  Pager *pPag
2ca70 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
2ca80 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2ca90 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68  ITE_OK;..  /* Th
2caa0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f  is routine is no
2cab0 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20  t called unless 
2cac0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  a transaction ha
2cad0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20  s already been. 
2cae0 20 2a 2a 20 73 74 61 72 74 65 64 2e 0a 20 20 2a   ** started..  *
2caf0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
2cb00 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
2cb10 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 0a 20 20  _RESERVED );..  
2cb20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  /* If an error h
2cb30 61 73 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73  as been previous
2cb40 6c 79 20 64 65 74 65 63 74 65 64 2c 20 72 65 70  ly detected, rep
2cb50 6f 72 74 20 74 68 65 20 73 61 6d 65 20 65 72 72  ort the same err
2cb60 6f 72 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 0a 20  or.  ** again.. 
2cb70 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
2cb80 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
2cb90 20 29 20 20 72 65 74 75 72 6e 20 70 50 61 67 65   )  return pPage
2cba0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f  r->errCode;..  /
2cbb0 2a 20 48 69 67 68 65 72 2d 6c 65 76 65 6c 20 72  * Higher-level r
2cbc0 6f 75 74 69 6e 65 73 20 6e 65 76 65 72 20 63 61  outines never ca
2cbd0 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
2cbe0 20 69 66 20 64 61 74 61 62 61 73 65 20 69 73 20   if database is 
2cbf0 6e 6f 74 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c  not.  ** writabl
2cc00 65 2e 20 20 42 75 74 20 63 68 65 63 6b 20 61 6e  e.  But check an
2cc10 79 77 61 79 2c 20 6a 75 73 74 20 66 6f 72 20 72  yway, just for r
2cc20 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20  obustness. */.  
2cc30 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
2cc40 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 20 72 65  ->readOnly) ) re
2cc50 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
2cc60 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  ;..  assert( !pP
2cc70 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
2cc80 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45  );..  CHECK_PAGE
2cc90 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72  (pPg);..  /* Mar
2cca0 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
2ccb0 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67  rty.  If the pag
2ccc0 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
2ccd0 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  en written.  ** 
2cce0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  to the journal t
2ccf0 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72  hen we can retur
2cd00 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  n right away..  
2cd10 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  */.  sqlite3Pcac
2cd20 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29  heMakeDirty(pPg)
2cd30 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e 4a 6f  ;.  if( pageInJo
2cd40 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21 73  urnal(pPg) && !s
2cd50 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
2cd60 70 50 67 29 20 29 7b 0a 20 20 20 20 61 73 73 65  pPg) ){.    asse
2cd70 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
2cd80 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
2cd90 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
2cda0 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ed = 1;.  }else{
2cdb0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67  ..    /* If we g
2cdc0 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20  et this far, it 
2cdd0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
2cde0 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  age needs to be.
2cdf0 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74      ** written t
2ce00 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
2ce10 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65  n journal or the
2ce20 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   ckeckpoint jour
2ce30 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f  nal.    ** or bo
2ce40 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  th..    **.    *
2ce50 2a 20 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72  * Higher level r
2ce60 6f 75 74 69 6e 65 73 20 73 68 6f 75 6c 64 20 68  outines should h
2ce70 61 76 65 20 61 6c 72 65 61 64 79 20 73 74 61 72  ave already star
2ce80 74 65 64 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ted a transactio
2ce90 6e 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20  n,.    ** which 
2cea0 6d 65 61 6e 73 20 74 68 65 79 20 68 61 76 65 20  means they have 
2ceb0 61 63 71 75 69 72 65 64 20 74 68 65 20 6e 65 63  acquired the nec
2cec0 65 73 73 61 72 79 20 6c 6f 63 6b 73 20 62 75 74  essary locks but
2ced0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 20 20   the rollback.  
2cee0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6d 69 67    ** journal mig
2cef0 68 74 20 6e 6f 74 20 79 65 74 20 62 65 20 6f 70  ht not yet be op
2cf00 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  en..    */.    a
2cf10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2cf20 74 61 74 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c  tate>=RESERVED_L
2cf30 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 70  OCK );.    if( p
2cf40 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
2cf50 6c 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 50 61  l==0.     && pPa
2cf60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2cf70 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
2cf80 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 26 26  ODE_OFF .     &&
2cf90 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
2cfa0 61 67 65 72 29 0a 20 20 20 20 29 7b 0a 20 20 20  ager).    ){.   
2cfb0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2cfc0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
2cfd0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2cfe0 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
2cff0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
2d000 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d010 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2d020 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64   }.    pPager->d
2d030 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20  bModified = 1;. 
2d040 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61   .    /* The tra
2d050 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
2d060 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20   now exists and 
2d070 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56  we have a RESERV
2d080 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20  ED or an.    ** 
2d090 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2d0a0 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
2d0b0 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65  ase file.  Write
2d0c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
2d0d0 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  e to.    ** the 
2d0e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
2d0f0 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  nal if it is not
2d100 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
2d110 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
2d120 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
2d130 67 29 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  g) && isOpen(pPa
2d140 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
2d150 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
2d160 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2d170 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  );.      if( pPg
2d180 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
2d190 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20  dbOrigSize ){.  
2d1a0 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b        u32 cksum;
2d1b0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
2d1c0 44 61 74 61 32 3b 0a 0a 20 20 20 20 20 20 20 20  Data2;..        
2d1d0 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76  /* We should nev
2d1e0 65 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  er write to the 
2d1f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
2d200 20 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20   page that.     
2d210 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74     ** contains t
2d220 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
2d230 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
2d240 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65  g assert verifie
2d250 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  s.        ** tha
2d260 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a  t we do not. */.
2d270 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2d280 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52  pPg->pgno!=PAGER
2d290 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
2d2a0 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73   );..        ass
2d2b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
2d2c0 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65  rnalHdr <= pPage
2d2d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b  r->journalOff );
2d2e0 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 32 28  .        CODEC2(
2d2f0 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
2d300 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74  Pg->pgno, 7, ret
2d310 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2d320 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  , pData2);.     
2d330 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72     cksum = pager
2d340 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28  _cksum(pPager, (
2d350 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20  u8*)pData2);.   
2d360 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
2d370 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
2d380 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
2d390 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f  alOff, pPg->pgno
2d3a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2d3b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2d3c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2d3d0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
2d3e0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61  ager->jfd, pData
2d3f0 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
2d400 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
2d410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d420 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2d430 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20 20  alOff + 4);.    
2d440 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
2d450 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67  urnalOff += pPag
2d460 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b 0a  er->pageSize+4;.
2d470 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d480 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2d490 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2d4a0 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
2d4b0 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  s(pPager->jfd, p
2d4c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2d4d0 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20  f, cksum);.     
2d4e0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
2d4f0 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20  rnalOff += 4;.  
2d500 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d510 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25  IOTRACE(("JOUT %
2d520 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  p %d %lld %d\n",
2d530 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
2d540 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  no, .           
2d550 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
2d560 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72  urnalOff, pPager
2d570 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20  ->pageSize));.  
2d580 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
2d590 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
2d5a0 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20  ritej_count);.  
2d5b0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
2d5c0 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  (("JOURNAL %d pa
2d5d0 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
2d5e0 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
2d5f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41  .             PA
2d600 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
2d610 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20  Pg->pgno, .     
2d620 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66          ((pPg->f
2d630 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
2d640 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65  SYNC)?1:0), page
2d650 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
2d660 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  );..        /* E
2d670 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20  ven if an IO or 
2d680 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f  diskfull error o
2d690 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 6a 6f  ccurred while jo
2d6a0 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20  urnalling the.  
2d6b0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
2d6c0 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65   the block above
2d6d0 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73  , set the need-s
2d6e0 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65  ync flag for the
2d6f0 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a   page..        *
2d700 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65  * Otherwise, whe
2d710 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
2d720 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
2d730 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20  , the logic in. 
2d740 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62 61         ** playba
2d750 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69  ck_one_page() wi
2d760 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68  ll think that th
2d770 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
2d780 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20 20  be restored.    
2d790 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61      ** in the da
2d7a0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64  tabase file. And
2d7b0 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   if an IO error 
2d7c0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69  occurs while doi
2d7d0 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a  ng so,.        *
2d7e0 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f  * then corruptio
2d7f0 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20  n may follow..  
2d800 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2d810 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
2d820 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
2d830 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
2d840 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
2d850 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
2d860 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
2d870 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
2d880 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20      /* An error 
2d890 68 61 73 20 6f 63 63 75 72 72 65 64 20 77 72 69  has occurred wri
2d8a0 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72  ting to the jour
2d8b0 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20  nal file. The . 
2d8c0 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61         ** transa
2d8d0 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f  ction will be ro
2d8e0 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68 65  lled back by the
2d8f0 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20   layer above..  
2d900 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2d910 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2d920 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2d930 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2d940 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 50     }..        pP
2d950 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20  ager->nRec++;.  
2d960 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2d970 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
2d980 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  !=0 );.        r
2d990 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
2d9a0 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
2d9b0 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
2d9c0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  no);.        tes
2d9d0 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
2d9e0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
2d9f0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
2da00 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  QLITE_OK || rc==
2da10 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
2da20 20 20 20 20 20 20 20 20 72 63 20 7c 3d 20 61 64          rc |= ad
2da30 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
2da40 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
2da50 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
2da60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2da70 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  K ){.          a
2da80 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
2da90 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
2daa0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2dab0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2dac0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
2dad0 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
2dae0 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21 70  nalStarted && !p
2daf0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
2db00 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
2db10 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
2db20 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
2db30 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
2db40 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
2db50 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45    }.        PAGE
2db60 52 54 52 41 43 45 28 28 22 41 50 50 45 4e 44 20  RTRACE(("APPEND 
2db70 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
2db80 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
2db90 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
2dba0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
2dbb0 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  >pgno,.         
2dbc0 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
2dbd0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
2dbe0 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20  NC)?1:0)));.    
2dbf0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
2dc00 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
2dc10 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ment journal is 
2dc20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
2dc30 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a  e is not in it,.
2dc40 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74      ** then writ
2dc50 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
2dc60 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  ge to the statem
2dc70 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f  ent journal.  No
2dc80 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  te that.    ** t
2dc90 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
2dca0 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66  rnal format diff
2dcb0 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ers from the sta
2dcc0 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f  ndard journal fo
2dcd0 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74  rmat.    ** in t
2dce0 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65  hat it omits the
2dcf0 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74   checksums and t
2dd00 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a  he header..    *
2dd10 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52 65  /.    if( subjRe
2dd20 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
2dd30 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75  ){.      rc = su
2dd40 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
2dd50 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
2dd60 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61  /* Update the da
2dd70 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20  tabase size and 
2dd80 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61  return..  */.  a
2dd90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2dda0 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
2ddb0 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ED );.  if( pPag
2ddc0 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e  er->dbSize<pPg->
2ddd0 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  pgno ){.    pPag
2dde0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67  er->dbSize = pPg
2ddf0 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65  ->pgno;.  }.  re
2de00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2de10 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61  * Mark a data pa
2de20 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e  ge as writeable.
2de30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   This routine mu
2de40 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  st be called bef
2de50 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63  ore .** making c
2de60 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65  hanges to a page
2de70 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  . The caller mus
2de80 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75  t check the retu
2de90 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20  rn value .** of 
2dea0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
2deb0 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74  d be careful not
2dec0 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 79 20 70   to change any p
2ded0 61 67 65 20 64 61 74 61 20 75 6e 6c 65 73 73 20  age data unless 
2dee0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
2def0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
2df00 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  OK..**.** The di
2df10 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
2df20 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
2df30 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65 28 29  nd pager_write()
2df40 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a   is that this.**
2df50 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64   function also d
2df60 65 61 6c 73 20 77 69 74 68 20 74 68 65 20 73 70  eals with the sp
2df70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65  ecial case where
2df80 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73   2 or more pages
2df90 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e  .** fit on a sin
2dfa0 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  gle disk sector.
2dfb0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c   In this case al
2dfc0 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61  l co-resident pa
2dfd0 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65  ges.** must have
2dfe0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
2dff0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2e000 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
2e010 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
2e020 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51  error occurs, SQ
2e030 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e  LITE_NOMEM or an
2e040 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
2e050 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 73  s returned.** as
2e060 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 4f 74   appropriate. Ot
2e070 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
2e080 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
2e090 65 33 50 61 67 65 72 57 72 69 74 65 28 44 62 50  e3PagerWrite(DbP
2e0a0 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20  age *pDbPage){. 
2e0b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2e0c0 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70  _OK;..  PgHdr *p
2e0d0 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  Pg = pDbPage;.  
2e0e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2e0f0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50  pPg->pPager;.  P
2e100 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74  gno nPagePerSect
2e110 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65  or = (pPager->se
2e120 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d  ctorSize/pPager-
2e130 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69  >pageSize);..  i
2e140 66 28 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f  f( nPagePerSecto
2e150 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  r>1 ){.    Pgno 
2e160 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20  nPageCount;     
2e170 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
2e180 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
2e190 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2e1a0 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20  /.    Pgno pg1; 
2e1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1c0 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66  /* First page of
2e1d0 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
2e1e0 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a  is located on. *
2e1f0 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20  /.    int nPage 
2e200 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2e210 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
2e220 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  es starting at p
2e230 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f  g1 to journal */
2e240 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20  .    int ii;    
2e250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e260 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
2e270 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  /.    int needSy
2e280 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nc = 0;         
2e290 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 70  /* True if any p
2e2a0 61 67 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45  age has PGHDR_NE
2e2b0 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20  ED_SYNC */..    
2e2c0 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74  /* Set the doNot
2e2d0 53 79 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20 74  SyncSpill flag t
2e2e0 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63  o 1. This is bec
2e2f0 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61  ause we cannot a
2e300 6c 6c 6f 77 0a 20 20 20 20 2a 2a 20 61 20 6a 6f  llow.    ** a jo
2e310 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
2e320 62 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65  be written betwe
2e330 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75  en the pages jou
2e340 72 6e 61 6c 65 64 20 62 79 0a 20 20 20 20 2a 2a  rnaled by.    **
2e350 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
2e360 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
2e370 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
2e380 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2e390 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d  >doNotSyncSpill=
2e3a0 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
2e3b0 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  ->doNotSyncSpill
2e3c0 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  ++;..    /* This
2e3d0 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74   trick assumes t
2e3e0 68 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67  hat both the pag
2e3f0 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
2e400 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a  r-size are.    *
2e410 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77  * an integer pow
2e420 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73  er of 2. It sets
2e430 20 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f   variable pg1 to
2e440 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a   the identifier.
2e450 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
2e460 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
2e470 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f  sector pPg is lo
2e480 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f  cated on..    */
2e490 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67  .    pg1 = ((pPg
2e4a0 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50  ->pgno-1) & ~(nP
2e4b0 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29  agePerSector-1))
2e4c0 20 2b 20 31 3b 0a 0a 20 20 20 20 72 63 20 3d 20   + 1;..    rc = 
2e4d0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
2e4e0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 28 69  count(pPager, (i
2e4f0 6e 74 20 2a 29 26 6e 50 61 67 65 43 6f 75 6e 74  nt *)&nPageCount
2e500 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2e510 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e520 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e    if( pPg->pgno>
2e530 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
2e540 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70        nPage = (p
2e550 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b  Pg->pgno - pg1)+
2e560 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
2e570 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72  f( (pg1+nPagePer
2e580 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43  Sector-1)>nPageC
2e590 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ount ){.        
2e5a0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75  nPage = nPageCou
2e5b0 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 20 20  nt+1-pg1;.      
2e5c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
2e5d0 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53  Page = nPagePerS
2e5e0 65 63 74 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20  ector;.      }. 
2e5f0 20 20 20 20 20 61 73 73 65 72 74 28 6e 50 61 67       assert(nPag
2e600 65 3e 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e>0);.      asse
2e610 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e  rt(pg1<=pPg->pgn
2e620 6f 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  o);.      assert
2e630 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67  ((pg1+nPage)>pPg
2e640 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a  ->pgno);.    }..
2e650 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
2e660 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51  <nPage && rc==SQ
2e670 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a  LITE_OK; ii++){.
2e680 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20        Pgno pg = 
2e690 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67  pg1+ii;.      Pg
2e6a0 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  Hdr *pPage;.    
2e6b0 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70    if( pg==pPg->p
2e6c0 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42  gno || !sqlite3B
2e6d0 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
2e6e0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
2e6f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
2e700 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47   pg!=PAGER_MJ_PG
2e710 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
2e720 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2e730 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
2e740 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29  ger, pg, &pPage)
2e750 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2e760 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2e770 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2e780 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  = pager_write(pP
2e790 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2e7a0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61    if( pPage->fla
2e7b0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
2e7c0 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NC ){.          
2e7d0 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
2e7e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2e7f0 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
2e800 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20  eedSync);.      
2e810 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e820 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
2e830 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
2e840 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e850 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
2e860 69 66 28 20 28 70 50 61 67 65 20 3d 20 70 61 67  if( (pPage = pag
2e870 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
2e880 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20  , pg))!=0 ){.   
2e890 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
2e8a0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
2e8b0 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20  _SYNC ){.       
2e8c0 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
2e8d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e8e0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
2e8f0 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
2e900 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2e910 2f 2a 20 49 66 20 74 68 65 20 50 47 48 44 52 5f  /* If the PGHDR_
2e920 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69  NEED_SYNC flag i
2e930 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66  s set for any of
2e940 20 74 68 65 20 6e 50 61 67 65 20 70 61 67 65 73   the nPage pages
2e950 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e   .    ** startin
2e960 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69  g at pg1, then i
2e970 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65  t needs to be se
2e980 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  t for all of the
2e990 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a  m. Because.    *
2e9a0 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79  * writing to any
2e9b0 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65 20   of these nPage 
2e9c0 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65  pages may damage
2e9d0 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65   the others, the
2e9e0 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
2e9f0 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69  file must contai
2ea00 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65  n sync()ed copie
2ea10 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d  s of all of them
2ea20 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61  .    ** before a
2ea30 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62  ny of them can b
2ea40 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
2ea50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2ea60 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
2ea70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ea80 20 26 26 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a   && needSync ){.
2ea90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 4d        assert( !M
2eaa0 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
2eab0 6e 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  noSync==0 );.   
2eac0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
2ead0 6e 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20  nPage; ii++){.  
2eae0 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
2eaf0 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ge = pager_looku
2eb00 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69  p(pPager, pg1+ii
2eb10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2eb20 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
2eb30 20 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c    pPage->flags |
2eb40 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
2eb50 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  C;.          sql
2eb60 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2eb70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
2eb80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
2eb90 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65  ssert(pPager->ne
2eba0 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a  edSync);.    }..
2ebb0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2ebc0 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69  er->doNotSyncSpi
2ebd0 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61  ll==1 );.    pPa
2ebe0 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70  ger->doNotSyncSp
2ebf0 69 6c 6c 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ill--;.  }else{.
2ec00 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
2ec10 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
2ec20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2ec30 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2ec40 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65  TRUE if the page
2ec50 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
2ec60 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69  gument was previ
2ec70 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20  ously passed.** 
2ec80 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
2ec90 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65  rite().  In othe
2eca0 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
2ecb0 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b  TRUE if it is ok
2ecc0 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
2ecd0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
2ece0 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65   page..*/.#ifnde
2ecf0 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  f NDEBUG.int sql
2ed00 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2ed10 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67  able(DbPage *pPg
2ed20 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  ){.  return pPg-
2ed30 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
2ed40 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TY;.}.#endif../*
2ed50 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
2ed60 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
2ed70 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
2ed80 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
2ed90 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20  ary to.** write 
2eda0 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
2edb0 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63 6b  on page pPg back
2edc0 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76   to the disk, ev
2edd0 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61  en though.** tha
2ede0 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20  t page might be 
2edf0 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
2ee00 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20    This happens, 
2ee10 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
2ee20 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 68 61  n.** the page ha
2ee30 73 20 62 65 65 6e 20 61 64 64 65 64 20 61 73 20  s been added as 
2ee40 61 20 6c 65 61 66 20 6f 66 20 74 68 65 20 66 72  a leaf of the fr
2ee50 65 65 6c 69 73 74 20 61 6e 64 20 73 6f 20 69 74  eelist and so it
2ee60 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20  s.** content no 
2ee70 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72 73 2e 0a  longer matters..
2ee80 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79  **.** The overly
2ee90 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79  ing software lay
2eea0 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
2eeb0 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f  utine when all o
2eec0 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e  f the data.** on
2eed0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
2eee0 69 73 20 75 6e 75 73 65 64 2e 20 54 68 65 20 70  is unused. The p
2eef0 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70  ager marks the p
2ef00 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a  age as clean so.
2ef10 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  ** that it does 
2ef20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20  not get written 
2ef30 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54  to disk..**.** T
2ef40 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74  ests show that t
2ef50 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
2ef60 20 63 61 6e 20 71 75 61 64 72 75 70 6c 65 20 74   can quadruple t
2ef70 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67  he speed of larg
2ef80 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20 6f 70 65  e .** DELETE ope
2ef90 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64  rations..*/.void
2efa0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
2efb0 74 57 72 69 74 65 28 50 67 48 64 72 20 2a 70 50  tWrite(PgHdr *pP
2efc0 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
2efd0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
2efe0 72 3b 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66  r;.  if( (pPg->f
2eff0 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
2f000 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53 61  ) && pPager->nSa
2f010 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20 20  vepoint==0 ){.  
2f020 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 44    PAGERTRACE(("D
2f030 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25  ONT_WRITE page %
2f040 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d  d of %d\n", pPg-
2f050 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
2f060 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 49 4f  Pager)));.    IO
2f070 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70  TRACE(("CLEAN %p
2f080 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
2f090 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20  pPg->pgno)).    
2f0a0 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
2f0b0 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b 0a  HDR_DONT_WRITE;.
2f0c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
2f0d0 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
2f0e0 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
2f0f0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
2f100 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a  );.#endif.  }.}.
2f110 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2f120 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
2f130 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   increment the v
2f140 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61  alue of the data
2f150 62 61 73 65 20 66 69 6c 65 20 0a 2a 2a 20 63 68  base file .** ch
2f160 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 20 73 74  ange-counter, st
2f170 6f 72 65 64 20 61 73 20 61 20 34 2d 62 79 74 65  ored as a 4-byte
2f180 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
2f190 67 65 72 20 73 74 61 72 74 69 6e 67 20 61 74 20  ger starting at 
2f1a0 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73 65 74 20  .** byte offset 
2f1b0 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  24 of the pager 
2f1c0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  file..**.** If t
2f1d0 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20  he isDirectMode 
2f1e0 66 6c 61 67 20 69 73 20 7a 65 72 6f 2c 20 74 68  flag is zero, th
2f1f0 65 6e 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20  en this is done 
2f200 62 79 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73  by calling .** s
2f210 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2f220 28 29 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68  () on page 1, th
2f230 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  en modifying the
2f240 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2f250 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 20 49  .** page data. I
2f260 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
2f270 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 70 64  file will be upd
2f280 61 74 65 64 20 77 68 65 6e 20 74 68 65 20 63 75  ated when the cu
2f290 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  rrent.** transac
2f2a0 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
2f2b0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44  d..**.** The isD
2f2c0 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 6d  irectMode flag m
2f2d0 61 79 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a  ay only be non-z
2f2e0 65 72 6f 20 69 66 20 74 68 65 20 6c 69 62 72 61  ero if the libra
2f2f0 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a  ry was compiled.
2f300 2a 2a 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ** with the SQLI
2f310 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
2f320 5f 57 52 49 54 45 20 6d 61 63 72 6f 20 64 65 66  _WRITE macro def
2f330 69 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ined. In this ca
2f340 73 65 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72 65  se,.** if isDire
2f350 63 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ct is non-zero, 
2f360 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  then the databas
2f370 65 20 66 69 6c 65 20 69 73 20 75 70 64 61 74 65  e file is update
2f380 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79  d directly.** by
2f390 20 77 72 69 74 69 6e 67 20 61 6e 20 75 70 64 61   writing an upda
2f3a0 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70  ted version of p
2f3b0 61 67 65 20 31 20 75 73 69 6e 67 20 61 20 63 61  age 1 using a ca
2f3c0 6c 6c 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71  ll to the .** sq
2f3d0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 66  lite3OsWrite() f
2f3e0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
2f3f0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63  ic int pager_inc
2f400 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
2f410 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
2f420 6e 74 20 69 73 44 69 72 65 63 74 4d 6f 64 65 29  nt isDirectMode)
2f430 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2f440 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 44 65  ITE_OK;..  /* De
2f450 63 6c 61 72 65 20 61 6e 64 20 69 6e 69 74 69 61  clare and initia
2f460 6c 69 7a 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e  lize constant in
2f470 74 65 67 65 72 20 27 69 73 44 69 72 65 63 74 27  teger 'isDirect'
2f480 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 61 74  . If the.  ** at
2f490 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
2f4a0 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c  ization is enabl
2f4b0 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  ed in this build
2f4c0 2c 20 74 68 65 6e 20 69 73 44 69 72 65 63 74 0a  , then isDirect.
2f4d0 20 20 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 69    ** is initiali
2f4e0 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65  zed to the value
2f4f0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 69   passed as the i
2f500 73 44 69 72 65 63 74 4d 6f 64 65 20 70 61 72 61  sDirectMode para
2f510 6d 65 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68  meter.  ** to th
2f520 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68  is function. Oth
2f530 65 72 77 69 73 65 2c 20 69 74 20 69 73 20 61 6c  erwise, it is al
2f540 77 61 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  ways set to zero
2f550 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
2f560 69 64 65 61 20 69 73 20 74 68 61 74 20 69 66 20  idea is that if 
2f570 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
2f580 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
2f590 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61 62 6c 65   not.  ** enable
2f5a0 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  d at compile tim
2f5b0 65 2c 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  e, the compiler 
2f5c0 63 61 6e 20 6f 6d 69 74 20 74 68 65 20 74 65 73  can omit the tes
2f5d0 74 73 20 6f 66 0a 20 20 2a 2a 20 27 69 73 44 69  ts of.  ** 'isDi
2f5e0 72 65 63 74 27 20 62 65 6c 6f 77 2c 20 61 73 20  rect' below, as 
2f5f0 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6c 6f 63  well as the bloc
2f600 6b 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 74 68  k enclosed in th
2f610 65 0a 20 20 2a 2a 20 22 69 66 28 20 69 73 44 69  e.  ** "if( isDi
2f620 72 65 63 74 20 29 22 20 63 6f 6e 64 69 74 69 6f  rect )" conditio
2f630 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  n..  */.#ifndef 
2f640 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
2f650 4f 4d 49 43 5f 57 52 49 54 45 0a 23 20 64 65 66  OMIC_WRITE.# def
2f660 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20  ine DIRECT_MODE 
2f670 30 0a 20 20 61 73 73 65 72 74 28 20 69 73 44 69  0.  assert( isDi
2f680 72 65 63 74 4d 6f 64 65 3d 3d 30 20 29 3b 0a 20  rectMode==0 );. 
2f690 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2f6a0 52 28 69 73 44 69 72 65 63 74 4d 6f 64 65 29 3b  R(isDirectMode);
2f6b0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
2f6c0 44 49 52 45 43 54 5f 4d 4f 44 45 20 69 73 44 69  DIRECT_MODE isDi
2f6d0 72 65 63 74 4d 6f 64 65 0a 23 65 6e 64 69 66 0a  rectMode.#endif.
2f6e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2f6f0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
2f700 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 69 66  RESERVED );.  if
2f710 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  ( !pPager->chang
2f720 65 43 6f 75 6e 74 44 6f 6e 65 20 26 26 20 70 50  eCountDone && pP
2f730 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29  ager->dbSize>0 )
2f740 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
2f750 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Hdr;            
2f760 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65      /* Reference
2f770 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20   to page 1 */.  
2f780 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
2f790 6e 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  nter;           
2f7a0 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65  /* Initial value
2f7b0 20 6f 66 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74   of change-count
2f7c0 65 72 20 66 69 65 6c 64 20 2a 2f 0a 0a 20 20 20  er field */..   
2f7d0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
2f7e0 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 69 73  ->tempFile && is
2f7f0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2f800 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e   );..    /* Open
2f810 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66   page 1 of the f
2f820 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ile for writing.
2f830 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2f840 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
2f850 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29  ger, 1, &pPgHdr)
2f860 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2f870 67 48 64 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  gHdr==0 || rc==S
2f880 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20  QLITE_OK );..   
2f890 20 2f 2a 20 49 66 20 70 61 67 65 20 6f 6e 65 20   /* If page one 
2f8a0 77 61 73 20 66 65 74 63 68 65 64 20 73 75 63 63  was fetched succ
2f8b0 65 73 73 66 75 6c 6c 79 2c 20 61 6e 64 20 74 68  essfully, and th
2f8c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  is function is n
2f8d0 6f 74 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  ot.    ** operat
2f8e0 69 6e 67 20 69 6e 20 64 69 72 65 63 74 2d 6d 6f  ing in direct-mo
2f8f0 64 65 2c 20 6d 61 6b 65 20 70 61 67 65 20 31 20  de, make page 1 
2f900 77 72 69 74 61 62 6c 65 2e 20 20 57 68 65 6e 20  writable.  When 
2f910 6e 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 64  not in .    ** d
2f920 69 72 65 63 74 20 6d 6f 64 65 2c 20 70 61 67 65  irect mode, page
2f930 20 31 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c   1 is always hel
2f940 64 20 69 6e 20 63 61 63 68 65 20 61 6e 64 20 68  d in cache and h
2f950 65 6e 63 65 20 74 68 65 20 50 61 67 65 72 47 65  ence the PagerGe
2f960 74 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  t().    ** above
2f970 20 69 73 20 61 6c 77 61 79 73 20 73 75 63 63 65   is always succe
2f980 73 73 66 75 6c 20 2d 20 68 65 6e 63 65 20 74 68  ssful - hence th
2f990 65 20 41 4c 57 41 59 53 20 6f 6e 20 72 63 3d 3d  e ALWAYS on rc==
2f9a0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 20 20 2a  SQLITE_OK..    *
2f9b0 2f 0a 20 20 20 20 69 66 28 20 21 44 49 52 45 43  /.    if( !DIREC
2f9c0 54 5f 4d 4f 44 45 20 26 26 20 41 4c 57 41 59 53  T_MODE && ALWAYS
2f9d0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  (rc==SQLITE_OK) 
2f9e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
2f9f0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2fa00 70 50 67 48 64 72 29 3b 0a 20 20 20 20 7d 0a 0a  pPgHdr);.    }..
2fa10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2fa20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
2fa30 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
2fa40 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20  value just read 
2fa50 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63  and write it bac
2fa60 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f  k to byte 24. */
2fa70 0a 20 20 20 20 20 20 63 68 61 6e 67 65 5f 63 6f  .      change_co
2fa80 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47  unter = sqlite3G
2fa90 65 74 34 62 79 74 65 28 28 75 38 2a 29 70 50 61  et4byte((u8*)pPa
2faa0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
2fab0 3b 0a 20 20 20 20 20 20 63 68 61 6e 67 65 5f 63  ;.      change_c
2fac0 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20  ounter++;.      
2fad0 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
2fae0 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29  *)pPgHdr->pData)
2faf0 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e  +24, change_coun
2fb00 74 65 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ter);..      /* 
2fb10 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65 20 53  Also store the S
2fb20 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75  QLite version nu
2fb30 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20 39 36  mber in bytes 96
2fb40 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20 20 20  ..99 and in.    
2fb50 20 20 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39    ** bytes 92..9
2fb60 35 20 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e  5 store the chan
2fb70 67 65 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77  ge counter for w
2fb80 68 69 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e  hich the version
2fb90 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a   number.      **
2fba0 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20   is valid. */.  
2fbb0 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28      put32bits(((
2fbc0 63 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44  char*)pPgHdr->pD
2fbd0 61 74 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f  ata)+92, change_
2fbe0 63 6f 75 6e 74 65 72 29 3b 0a 20 20 20 20 20 20  counter);.      
2fbf0 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
2fc00 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29  *)pPgHdr->pData)
2fc10 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56 45 52 53  +96, SQLITE_VERS
2fc20 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 0a 20 20  ION_NUMBER);..  
2fc30 20 20 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e      /* If runnin
2fc40 67 20 69 6e 20 64 69 72 65 63 74 20 6d 6f 64 65  g in direct mode
2fc50 2c 20 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74  , write the cont
2fc60 65 6e 74 73 20 6f 66 20 70 61 67 65 20 31 20 74  ents of page 1 t
2fc70 6f 20 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  o the file. */. 
2fc80 20 20 20 20 20 69 66 28 20 44 49 52 45 43 54 5f       if( DIRECT_
2fc90 4d 4f 44 45 20 29 7b 0a 20 20 20 20 20 20 20 20  MODE ){.        
2fca0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66  const void *zBuf
2fcb0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2fcc0 28 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  ( pPager->dbFile
2fcd0 53 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20  Size>0 );.      
2fce0 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
2fcf0 20 70 50 67 48 64 72 2d 3e 70 44 61 74 61 2c 20   pPgHdr->pData, 
2fd00 31 2c 20 36 2c 20 72 63 3d 53 51 4c 49 54 45 5f  1, 6, rc=SQLITE_
2fd10 4e 4f 4d 45 4d 2c 20 7a 42 75 66 29 3b 0a 20 20  NOMEM, zBuf);.  
2fd20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2fd30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2fd40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2fd50 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
2fd60 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65  >fd, zBuf, pPage
2fd70 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b  r->pageSize, 0);
2fd80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2fd90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2fda0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2fdb0 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
2fdc0 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20  CountDone = 1;. 
2fdd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2fde0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50  else{.        pP
2fdf0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
2fe00 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  tDone = 1;.     
2fe10 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2fe20 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61 67   Release the pag
2fe30 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a  e reference. */.
2fe40 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
2fe50 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
2fe60 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2fe70 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
2fe80 65 20 70 61 67 65 72 20 66 69 6c 65 20 74 6f 20  e pager file to 
2fe90 64 69 73 6b 2e 20 54 68 69 73 20 69 73 20 61 20  disk. This is a 
2fea0 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d 65 6d  no-op for in-mem
2feb0 6f 72 79 20 66 69 6c 65 73 0a 2a 2a 20 6f 72 20  ory files.** or 
2fec0 70 61 67 65 73 20 77 69 74 68 20 74 68 65 20 50  pages with the P
2fed0 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67  ager.noSync flag
2fee0 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73   set..**.** If s
2fef0 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 63 61  uccessful, or ca
2ff00 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67 65 72 20  lled on a pager 
2ff10 66 6f 72 20 77 68 69 63 68 20 69 74 20 69 73 20  for which it is 
2ff20 61 20 6e 6f 2d 6f 70 2c 20 74 68 69 73 0a 2a 2a  a no-op, this.**
2ff30 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2ff40 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68  s SQLITE_OK. Oth
2ff50 65 72 77 69 73 65 2c 20 61 6e 20 49 4f 20 65 72  erwise, an IO er
2ff60 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2ff70 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
2ff80 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 50 61  ite3PagerSync(Pa
2ff90 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2ffa0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
2ffb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ffc0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2ffd0 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ode */.  assert(
2ffe0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28   !MEMDB );.  if(
2fff0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
30000 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
30010 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
30020 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
30030 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  OsSync(pPager->f
30040 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
30050 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 72 65  flags);.  }.  re
30060 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
30070 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
30080 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
30090 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a   pager pPager. z
300a0 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
300b0 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20   the name.** of 
300c0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
300d0 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
300e0 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
300f0 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  o the individual
30100 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
30110 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65  . zMaster may be
30120 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20   NULL, which is 
30130 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e  interpreted as n
30140 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  o master.** jour
30150 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61  nal (a single da
30160 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
30170 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  on)..**.** This 
30180 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
30190 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  that:.**.**   * 
301a0 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
301b0 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
301c0 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20   is updated,.** 
301d0 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20    * the journal 
301e0 69 73 20 73 79 6e 63 65 64 20 28 75 6e 6c 65 73  is synced (unles
301f0 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  s the atomic-wri
30200 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
30210 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20 20 20 2a  is used),.**   *
30220 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
30230 20 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f 20   are written to 
30240 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30250 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64  e, .**   * the d
30260 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
30270 74 72 75 6e 63 61 74 65 64 20 28 69 66 20 72 65  truncated (if re
30280 71 75 69 72 65 64 29 2c 20 61 6e 64 0a 2a 2a 20  quired), and.** 
30290 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65    * the database
302a0 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 0a 2a   file synced. .*
302b0 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68  *.** The only th
302c0 69 6e 67 20 74 68 61 74 20 72 65 6d 61 69 6e 73  ing that remains
302d0 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74   to commit the t
302e0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f  ransaction is to
302f0 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20 28 64   finalize .** (d
30300 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74 65 20  elete, truncate 
30310 6f 72 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73  or zero the firs
30320 74 20 70 61 72 74 20 6f 66 29 20 74 68 65 20 6a  t part of) the j
30330 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20  ournal file (or 
30340 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 6d  .** delete the m
30350 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
30360 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29  le if specified)
30370 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
30380 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55  t if zMaster==NU
30390 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f  LL, this does no
303a0 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72  t overwrite a pr
303b0 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20  evious value.** 
303c0 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c  passed to an sql
303d0 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
303e0 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a  haseOne() call..
303f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6e  **.** If the fin
30400 61 6c 20 70 61 72 61 6d 65 74 65 72 20 2d 20 6e  al parameter - n
30410 6f 53 79 6e 63 20 2d 20 69 73 20 74 72 75 65 2c  oSync - is true,
30420 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   then the databa
30430 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 0a 2a  se file itself.*
30440 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 2e  * is not synced.
30450 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
30460 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
30470 65 72 53 79 6e 63 28 29 20 64 69 72 65 63 74 6c  erSync() directl
30480 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68 65  y to.** sync the
30490 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
304a0 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43 6f  efore calling Co
304b0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 74  mmitPhaseTwo() t
304c0 6f 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20  o delete the.** 
304d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
304e0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e  this case..*/.in
304f0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  t sqlite3PagerCo
30500 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a 20 20  mmitPhaseOne(.  
30510 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
30520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30530 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
30540 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
30550 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20 20 20 20  *zMaster,       
30560 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
30570 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74 65 72 20  ULL, the master 
30580 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
30590 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20 20 20 20    int noSync    
305a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
305b0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69    /* True to omi
305c0 74 20 74 68 65 20 78 53 79 6e 63 20 6f 6e 20 74  t the xSync on t
305d0 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a 29 7b  he db file */.){
305e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
305f0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
30600 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
30610 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 64  e */..  /* The d
30620 62 4f 72 69 67 53 69 7a 65 20 69 73 20 6e 65 76  bOrigSize is nev
30630 65 72 20 73 65 74 20 69 66 20 6a 6f 75 72 6e 61  er set if journa
30640 6c 5f 6d 6f 64 65 3d 4f 46 46 20 2a 2f 0a 20 20  l_mode=OFF */.  
30650 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
30660 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
30670 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
30680 46 46 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  FF || pPager->db
30690 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29 3b 0a 0a  OrigSize==0 );..
306a0 20 20 2f 2a 20 49 66 20 61 20 70 72 69 6f 72 20    /* If a prior 
306b0 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20  error occurred, 
306c0 72 65 70 6f 72 74 20 74 68 61 74 20 65 72 72 6f  report that erro
306d0 72 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 69 66  r again. */.  if
306e0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
306f0 65 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  e ) return pPage
30700 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 50  r->errCode;..  P
30710 41 47 45 52 54 52 41 43 45 28 28 22 44 41 54 41  AGERTRACE(("DATA
30720 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d  BASE SYNC: File=
30730 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 53  %s zMaster=%s nS
30740 69 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  ize=%d\n", .    
30750 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
30760 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  ame, zMaster, pP
30770 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 29 3b 0a  ager->dbSize));.
30780 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20  .  if( MEMDB && 
30790 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
307a0 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ed ){.    /* If 
307b0 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
307c0 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70  mory db, or no p
307d0 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77  ages have been w
307e0 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68  ritten to, or th
307f0 69 73 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  is.    ** functi
30800 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
30810 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69  een called, it i
30820 73 20 6d 6f 73 74 6c 79 20 61 20 6e 6f 2d 6f 70  s mostly a no-op
30830 2e 20 20 48 6f 77 65 76 65 72 2c 20 61 6e 79 0a  .  However, any.
30840 20 20 20 20 2a 2a 20 62 61 63 6b 75 70 20 69 6e      ** backup in
30850 20 70 72 6f 67 72 65 73 73 20 6e 65 65 64 73 20   progress needs 
30860 74 6f 20 62 65 20 72 65 73 74 61 72 74 65 64 2e  to be restarted.
30870 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
30880 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
30890 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
308a0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
308b0 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
308c0 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 70 50  GER_SYNCED && pP
308d0 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
308e0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 61 67 65   ){.    if( page
308f0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
30900 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  ){.      PgHdr *
30910 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pList = sqlite3P
30920 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
30930 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
30940 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
30950 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
30960 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
30970 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2c 20 70  pPager, pList, p
30980 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2c 20 31  Pager->dbSize, 1
30990 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  , .            (
309a0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
309b0 20 3f 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f   ? pPager->sync_
309c0 66 6c 61 67 73 20 3a 20 30 29 0a 20 20 20 20 20  flags : 0).     
309d0 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
309e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
309f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30a00 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
30a10 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70  eanAll(pPager->p
30a20 50 43 61 63 68 65 29 3b 0a 20 20 20 20 20 20 7d  PCache);.      }
30a30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
30a40 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
30a50 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73  ng block updates
30a60 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
30a70 74 65 72 2e 20 45 78 61 63 74 6c 79 20 68 6f 77  ter. Exactly how
30a80 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f 65   it.      ** doe
30a90 73 20 74 68 69 73 20 64 65 70 65 6e 64 73 20 6f  s this depends o
30aa0 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
30ab0 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61   the atomic-upda
30ac0 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
30ad0 20 20 20 20 20 20 2a 2a 20 77 61 73 20 65 6e 61        ** was ena
30ae0 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20  bled at compile 
30af0 74 69 6d 65 2c 20 61 6e 64 20 69 66 20 74 68 69  time, and if thi
30b00 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65  s transaction me
30b10 65 74 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a  ets the .      *
30b20 2a 20 72 75 6e 74 69 6d 65 20 63 72 69 74 65 72  * runtime criter
30b30 69 61 20 74 6f 20 75 73 65 20 74 68 65 20 6f 70  ia to use the op
30b40 65 72 61 74 69 6f 6e 3a 20 0a 20 20 20 20 20 20  eration: .      
30b50 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a  **.      **    *
30b60 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   The file-system
30b70 20 73 75 70 70 6f 72 74 73 20 74 68 65 20 61 74   supports the at
30b80 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65  omic-write prope
30b90 72 74 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  rty for.      **
30ba0 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20        blocks of 
30bb0 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20  size page-size, 
30bc0 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 20 20  and .      **   
30bd0 20 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69   * This commit i
30be0 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20  s not part of a 
30bf0 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73  multi-file trans
30c00 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20  action, and.    
30c10 20 20 2a 2a 20 20 20 20 2a 20 45 78 61 63 74 6c    **    * Exactl
30c20 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62  y one page has b
30c30 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64  een modified and
30c40 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f   store in the jo
30c50 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
30c60 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
30c70 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
30c80 6e 20 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65  n was not enable
30c90 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  d at compile tim
30ca0 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  e, then the.    
30cb0 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f    ** pager_incr_
30cc0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
30cd0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
30ce0 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  ed to update the
30cf0 20 63 68 61 6e 67 65 0a 20 20 20 20 20 20 2a 2a   change.      **
30d00 20 63 6f 75 6e 74 65 72 20 69 6e 20 27 69 6e 64   counter in 'ind
30d10 69 72 65 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20  irect-mode'. If 
30d20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
30d30 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20   is compiled in 
30d40 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  but.      ** is 
30d50 6e 6f 74 20 61 70 70 6c 69 63 61 62 6c 65 20 74  not applicable t
30d60 6f 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  o this transacti
30d70 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  on, call sqlite3
30d80 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 29 0a  JournalCreate().
30d90 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65        ** to make
30da0 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61   sure the journa
30db0 6c 20 66 69 6c 65 20 68 61 73 20 61 63 74 75 61  l file has actua
30dc0 6c 6c 79 20 62 65 65 6e 20 63 72 65 61 74 65 64  lly been created
30dd0 2c 20 74 68 65 6e 20 63 61 6c 6c 0a 20 20 20 20  , then call.    
30de0 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f    ** pager_incr_
30df0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
30e00 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
30e10 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20  ange-counter in 
30e20 69 6e 64 69 72 65 63 74 0a 20 20 20 20 20 20 2a  indirect.      *
30e30 2a 20 6d 6f 64 65 2e 20 0a 20 20 20 20 20 20 2a  * mode. .      *
30e40 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72  *.      ** Other
30e50 77 69 73 65 2c 20 69 66 20 74 68 65 20 6f 70 74  wise, if the opt
30e60 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74  imization is bot
30e70 68 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 61 70  h enabled and ap
30e80 70 6c 69 63 61 62 6c 65 2c 0a 20 20 20 20 20 20  plicable,.      
30e90 2a 2a 20 74 68 65 6e 20 63 61 6c 6c 20 70 61 67  ** then call pag
30ea0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
30eb0 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74  unter() to updat
30ec0 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
30ed0 6e 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 6e  nter.      ** in
30ee0 20 27 64 69 72 65 63 74 27 20 6d 6f 64 65 2e 20   'direct' mode. 
30ef0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
30f00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
30f10 6c 6c 20 6e 65 76 65 72 20 62 65 0a 20 20 20 20  ll never be.    
30f20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72    ** created for
30f30 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
30f40 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 23 69  n..      */.  #i
30f50 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
30f60 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
30f70 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67        PgHdr *pPg
30f80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
30f90 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
30fa0 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
30fb0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
30fc0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
30fd0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
30fe0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
30ff0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
31000 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
31010 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29  ODE_WAL .      )
31020 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d 61  ;.      if( !zMa
31030 73 74 65 72 20 26 26 20 69 73 4f 70 65 6e 28 70  ster && isOpen(p
31040 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20  Pager->jfd) .   
31050 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
31060 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42  ournalOff==jrnlB
31070 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
31080 29 20 0a 20 20 20 20 20 20 20 26 26 20 70 50 61  ) .       && pPa
31090 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61  ger->dbSize>=pPa
310a0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 0a  ger->dbOrigSize.
310b0 20 20 20 20 20 20 20 26 26 20 28 30 3d 3d 28 70         && (0==(p
310c0 50 67 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  Pg = sqlite3Pcac
310d0 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
310e0 65 72 2d 3e 70 50 43 61 63 68 65 29 29 20 7c 7c  er->pPCache)) ||
310f0 20 30 3d 3d 70 50 67 2d 3e 70 44 69 72 74 79 29   0==pPg->pDirty)
31100 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
31110 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
31120 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63  db file change c
31130 6f 75 6e 74 65 72 20 76 69 61 20 74 68 65 20 64  ounter via the d
31140 69 72 65 63 74 2d 77 72 69 74 65 20 6d 65 74 68  irect-write meth
31150 6f 64 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20  od. The .       
31160 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61   ** following ca
31170 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 20 74  ll will modify t
31180 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
31190 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70  resentation of p
311a0 61 67 65 20 31 20 0a 20 20 20 20 20 20 20 20 2a  age 1 .        *
311b0 2a 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65  * to include the
311c0 20 75 70 64 61 74 65 64 20 63 68 61 6e 67 65 20   updated change 
311d0 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e  counter and then
311e0 20 77 72 69 74 65 20 70 61 67 65 20 31 20 0a 20   write page 1 . 
311f0 20 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74         ** direct
31200 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ly to the databa
31210 73 65 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65  se file. Because
31220 20 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77   of the atomic-w
31230 72 69 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  rite .        **
31240 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
31250 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65   host file-syste
31260 6d 2c 20 74 68 69 73 20 69 73 20 73 61 66 65 2e  m, this is safe.
31270 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
31280 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69      rc = pager_i
31290 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
312a0 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  r(pPager, 1);.  
312b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
312c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
312d0 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61  ournalCreate(pPa
312e0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
312f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
31300 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31310 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
31320 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
31330 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
31340 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
31350 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d  #else.      rc =
31360 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
31370 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72  gecounter(pPager
31380 2c 20 30 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20  , 0);.  #endif. 
31390 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
313a0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f  ITE_OK ) goto co
313b0 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
313c0 78 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a  xit;.  .      /*
313d0 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   If this transac
313e0 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68  tion has made th
313f0 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c  e database small
31400 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  er, then all pag
31410 65 73 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  es.      ** bein
31420 67 20 64 69 73 63 61 72 64 65 64 20 62 79 20 74  g discarded by t
31430 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75  he truncation mu
31440 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  st be written to
31450 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
31460 20 20 20 2a 2a 20 66 69 6c 65 2e 20 54 68 69 73     ** file. This
31470 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
31480 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
31490 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  mode..      **. 
314a0 20 20 20 20 20 2a 2a 20 42 65 66 6f 72 65 20 72       ** Before r
314b0 65 61 64 69 6e 67 20 74 68 65 20 70 61 67 65 73  eading the pages
314c0 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
314d0 72 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  rs larger than t
314e0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 75 72  he .      ** cur
314f0 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61  rent value of Pa
31500 67 65 72 2e 64 62 53 69 7a 65 2c 20 73 65 74 20  ger.dbSize, set 
31510 64 62 53 69 7a 65 20 62 61 63 6b 20 74 6f 20 74  dbSize back to t
31520 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a  he value.      *
31530 2a 20 74 68 61 74 20 69 74 20 74 6f 6f 6b 20 61  * that it took a
31540 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
31550 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
31560 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 0a 20  Otherwise, the. 
31570 20 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f       ** calls to
31580 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
31590 28 29 20 72 65 74 75 72 6e 20 7a 65 72 6f 65 64  () return zeroed
315a0 20 70 61 67 65 73 20 69 6e 73 74 65 61 64 20 6f   pages instead o
315b0 66 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64  f .      ** read
315c0 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 74 68  ing data from th
315d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
315e0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
315f0 2a 2a 20 57 68 65 6e 20 6a 6f 75 72 6e 61 6c 5f  ** When journal_
31600 6d 6f 64 65 3d 3d 4f 46 46 20 74 68 65 20 64 62  mode==OFF the db
31610 4f 72 69 67 53 69 7a 65 20 69 73 20 61 6c 77 61  OrigSize is alwa
31620 79 73 20 7a 65 72 6f 2c 20 73 6f 20 74 68 69 73  ys zero, so this
31630 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20  .      ** block 
31640 6e 65 76 65 72 20 72 75 6e 73 20 69 66 20 6a 6f  never runs if jo
31650 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 2e 0a  urnal_mode=OFF..
31660 20 20 20 20 20 20 2a 2f 0a 20 20 23 69 66 6e 64        */.  #ifnd
31670 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
31680 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
31690 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
316a0 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  ze<pPager->dbOri
316b0 67 53 69 7a 65 20 0a 20 20 20 20 20 20 20 26 26  gSize .       &&
316c0 20 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e   ALWAYS(pPager->
316d0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
316e0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
316f0 46 46 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  FF).      ){.   
31700 20 20 20 20 20 50 67 6e 6f 20 69 3b 20 20 20 20       Pgno i;    
31710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31730 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
31740 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  ble */.        c
31750 6f 6e 73 74 20 50 67 6e 6f 20 69 53 6b 69 70 20  onst Pgno iSkip 
31760 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  = PAGER_MJ_PGNO(
31770 70 50 61 67 65 72 29 3b 20 2f 2a 20 50 65 6e 64  pPager); /* Pend
31780 69 6e 67 20 6c 6f 63 6b 20 70 61 67 65 20 2a 2f  ing lock page */
31790 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 50  .        const P
317a0 67 6e 6f 20 64 62 53 69 7a 65 20 3d 20 70 50 61  gno dbSize = pPa
317b0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 20 20 20 20  ger->dbSize;    
317c0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69     /* Database i
317d0 6d 61 67 65 20 73 69 7a 65 20 2a 2f 20 0a 20 20  mage size */ .  
317e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
317f0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
31800 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 20 20 20  bOrigSize;.     
31810 20 20 20 66 6f 72 28 20 69 3d 64 62 53 69 7a 65     for( i=dbSize
31820 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 64  +1; i<=pPager->d
31830 62 4f 72 69 67 53 69 7a 65 3b 20 69 2b 2b 20 29  bOrigSize; i++ )
31840 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
31850 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65  !sqlite3BitvecTe
31860 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  st(pPager->pInJo
31870 75 72 6e 61 6c 2c 20 69 29 20 26 26 20 69 21 3d  urnal, i) && i!=
31880 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20  iSkip ){.       
31890 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
318a0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
318b0 2a 20 50 61 67 65 20 74 6f 20 6a 6f 75 72 6e 61  * Page to journa
318c0 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  l */.           
318d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
318e0 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c  erGet(pPager, i,
318f0 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &pPage);.      
31900 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
31910 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63  LITE_OK ) goto c
31920 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
31930 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
31940 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
31950 67 65 72 57 72 69 74 65 28 70 50 61 67 65 29 3b  gerWrite(pPage);
31960 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
31970 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
31980 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
31990 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
319a0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d  E_OK ) goto comm
319b0 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69  it_phase_one_exi
319c0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
319d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
319e0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
319f0 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20  = dbSize;.      
31a00 7d 20 0a 20 20 23 65 6e 64 69 66 0a 20 20 0a 20  } .  #endif.  . 
31a10 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
31a20 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
31a30 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a   name into the j
31a40 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
31a50 61 20 6d 61 73 74 65 72 20 0a 20 20 20 20 20 20  a master .      
31a60 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
31a70 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79  name has already
31a80 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
31a90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
31aa0 65 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20  e, .      ** or 
31ab0 69 66 20 7a 4d 61 73 74 65 72 20 69 73 20 4e 55  if zMaster is NU
31ac0 4c 4c 20 28 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  LL (no master jo
31ad0 75 72 6e 61 6c 29 2c 20 74 68 65 6e 20 74 68 69  urnal), then thi
31ae0 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
31af0 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  p..      */.    
31b00 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74    rc = writeMast
31b10 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
31b20 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
31b30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31b40 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
31b50 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
31b60 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 53 79  ;.  .      /* Sy
31b70 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
31b80 69 6c 65 2e 20 49 66 20 74 68 65 20 61 74 6f 6d  ile. If the atom
31b90 69 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69  ic-update optimi
31ba0 7a 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 0a  zation is being.
31bb0 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2c 20 74        ** used, t
31bc0 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f  his call will no
31bd0 74 20 63 72 65 61 74 65 20 74 68 65 20 6a 6f 75  t create the jou
31be0 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 70 65 72  rnal file or per
31bf0 66 6f 72 6d 20 61 6e 79 0a 20 20 20 20 20 20 2a  form any.      *
31c00 2a 20 72 65 61 6c 20 49 4f 2e 0a 20 20 20 20 20  * real IO..     
31c10 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
31c20 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
31c30 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
31c40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
31c50 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
31c60 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20  one_exit;.  .   
31c70 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20     /* Write all 
31c80 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74  dirty pages to t
31c90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
31ca0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
31cb0 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
31cc0 6c 69 73 74 28 70 50 61 67 65 72 2c 73 71 6c 69  list(pPager,sqli
31cd0 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
31ce0 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
31cf0 68 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  he));.      if( 
31d00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
31d10 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
31d20 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
31d30 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20  R_BLOCKED );.   
31d40 20 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74       goto commit
31d50 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
31d60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
31d70 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
31d80 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
31d90 61 63 68 65 29 3b 0a 20 20 0a 20 20 20 20 20 20  ache);.  .      
31da0 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  /* If the file o
31db0 6e 20 64 69 73 6b 20 69 73 20 6e 6f 74 20 74 68  n disk is not th
31dc0 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20 74  e same size as t
31dd0 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
31de0 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  e,.      ** then
31df0 20 75 73 65 20 70 61 67 65 72 5f 74 72 75 6e 63   use pager_trunc
31e00 61 74 65 20 74 6f 20 67 72 6f 77 20 6f 72 20 73  ate to grow or s
31e10 68 72 69 6e 6b 20 74 68 65 20 66 69 6c 65 20 68  hrink the file h
31e20 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ere..      */.  
31e30 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
31e40 64 62 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e  dbSize!=pPager->
31e50 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
31e60 20 20 20 20 20 20 50 67 6e 6f 20 6e 4e 65 77 20        Pgno nNew 
31e70 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
31e80 20 2d 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69   - (pPager->dbSi
31e90 7a 65 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ze==PAGER_MJ_PGN
31ea0 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  O(pPager));.    
31eb0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
31ec0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
31ed0 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
31ee0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
31ef0 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
31f00 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , nNew);.       
31f10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31f20 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
31f30 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
31f40 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
31f50 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 73 79    /* Finally, sy
31f60 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
31f70 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  file. */.      i
31f80 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
31f90 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63 20 29 7b  nc && !noSync ){
31fa0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
31fb0 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
31fc0 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
31fd0 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20  sync_flags);.   
31fe0 20 20 20 7d 0a 20 20 20 20 20 20 49 4f 54 52 41     }.      IOTRA
31ff0 43 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e  CE(("DBSYNC %p\n
32000 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
32010 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  }..    pPager->s
32020 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e  tate = PAGER_SYN
32030 43 45 44 3b 0a 20 20 7d 0a 0a 63 6f 6d 6d 69 74  CED;.  }..commit
32040 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3a  _phase_one_exit:
32050 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
32060 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
32070 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
32080 6c 6c 65 64 2c 20 74 68 65 20 64 61 74 61 62 61  lled, the databa
32090 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  se file has been
320a0 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 2a 2a 20 75   completely.** u
320b0 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c 65 63  pdated to reflec
320c0 74 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61  t the changes ma
320d0 64 65 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  de by the curren
320e0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  t transaction an
320f0 64 0a 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64  d.** synced to d
32100 69 73 6b 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  isk. The journal
32110 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73   file still exis
32120 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ts in the file-s
32130 79 73 74 65 6d 20 0a 2a 2a 20 74 68 6f 75 67 68  ystem .** though
32140 2c 20 61 6e 64 20 69 66 20 61 20 66 61 69 6c 75  , and if a failu
32150 72 65 20 6f 63 63 75 72 73 20 61 74 20 74 68 69  re occurs at thi
32160 73 20 70 6f 69 6e 74 20 69 74 20 77 69 6c 6c 20  s point it will 
32170 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 62 65  eventually.** be
32180 20 75 73 65 64 20 61 73 20 61 20 68 6f 74 2d 6a   used as a hot-j
32190 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 63  ournal and the c
321a0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
321b0 6f 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  on rolled back..
321c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
321d0 69 6f 6e 20 66 69 6e 61 6c 69 7a 65 73 20 74 68  ion finalizes th
321e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
321f0 65 69 74 68 65 72 20 62 79 20 64 65 6c 65 74 69  either by deleti
32200 6e 67 2c 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69  ng, .** truncati
32210 6e 67 20 6f 72 20 70 61 72 74 69 61 6c 6c 79 20  ng or partially 
32220 7a 65 72 6f 69 6e 67 20 69 74 2c 20 73 6f 20 74  zeroing it, so t
32230 68 61 74 20 69 74 20 63 61 6e 6e 6f 74 20 62 65  hat it cannot be
32240 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 68 6f   used .** for ho
32250 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
32260 63 6b 2e 20 4f 6e 63 65 20 74 68 69 73 20 69 73  ck. Once this is
32270 20 64 6f 6e 65 20 74 68 65 20 74 72 61 6e 73 61   done the transa
32280 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 69 72 72 65  ction is.** irre
32290 76 6f 63 61 62 6c 79 20 63 6f 6d 6d 69 74 74 65  vocably committe
322a0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
322b0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
322c0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
322d0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
322e0 65 20 70 61 67 65 72 0a 2a 2a 20 6d 6f 76 65 73  e pager.** moves
322f0 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20   into the error 
32300 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  state. Otherwise
32310 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
32320 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
32330 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
32340 69 74 50 68 61 73 65 54 77 6f 28 50 61 67 65 72  itPhaseTwo(Pager
32350 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
32360 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
32370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32380 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
32390 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72   */..  /* This r
323a0 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f  outine should no
323b0 74 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 61  t be called if a
323c0 20 70 72 69 6f 72 20 65 72 72 6f 72 20 68 61 73   prior error has
323d0 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20   occurred..  ** 
323e0 42 75 74 20 69 66 20 28 64 75 65 20 74 6f 20 61  But if (due to a
323f0 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 65 6c   coding error el
32400 73 65 77 68 65 72 65 20 69 6e 20 74 68 65 20 73  sewhere in the s
32410 79 73 74 65 6d 29 20 69 74 20 64 6f 65 73 20 67  ystem) it does g
32420 65 74 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c 20  et.  ** called, 
32430 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20  just return the 
32440 73 61 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20  same error code 
32450 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
32460 79 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28  ything. */.  if(
32470 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
32480 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e  rrCode) ) return
32490 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
324a0 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  ;..  /* This fun
324b0 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74  ction should not
324c0 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 74 68   be called if th
324d0 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
324e0 6e 20 61 74 20 6c 65 61 73 74 0a 20 20 2a 2a 20  n at least.  ** 
324f0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73  PAGER_RESERVED s
32500 74 61 74 65 2e 20 2a 2a 46 49 58 4d 45 2a 2a 3a  tate. **FIXME**:
32510 20 4d 61 6b 65 20 69 74 20 73 6f 20 74 68 61 74   Make it so that
32520 20 74 68 69 73 20 74 65 73 74 20 61 6c 77 61 79   this test alway
32530 73 0a 20 20 2a 2a 20 66 61 69 6c 73 20 2d 20 6d  s.  ** fails - m
32540 61 6b 65 20 69 74 20 73 6f 20 74 68 61 74 20 77  ake it so that w
32550 65 20 6e 65 76 65 72 20 72 65 61 63 68 20 74 68  e never reach th
32560 69 73 20 70 6f 69 6e 74 20 69 66 20 77 65 20 64  is point if we d
32570 6f 20 6e 6f 74 20 68 6f 6c 64 0a 20 20 2a 2a 20  o not hold.  ** 
32580 61 6c 6c 20 6e 65 63 65 73 73 61 72 79 20 6c 6f  all necessary lo
32590 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  cks..  */.  if( 
325a0 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 73 74  NEVER(pPager->st
325b0 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56  ate<PAGER_RESERV
325c0 45 44 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ED) ) return SQL
325d0 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a  ITE_ERROR;..  /*
325e0 20 41 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   An optimization
325f0 2e 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  . If the databas
32600 65 20 77 61 73 20 6e 6f 74 20 61 63 74 75 61 6c  e was not actual
32610 6c 79 20 6d 6f 64 69 66 69 65 64 20 64 75 72 69  ly modified duri
32620 6e 67 0a 20 20 2a 2a 20 74 68 69 73 20 74 72 61  ng.  ** this tra
32630 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 70 61  nsaction, the pa
32640 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
32650 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  n exclusive-mode
32660 20 61 6e 64 20 69 73 0a 20 20 2a 2a 20 75 73 69   and is.  ** usi
32670 6e 67 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f  ng persistent jo
32680 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20 74 68 69  urnals, then thi
32690 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
326a0 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  no-op..  **.  **
326b0 20 54 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   The start of th
326c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
326d0 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e  urrently contain
326e0 73 20 61 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e  s a single journ
326f0 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64 65 72 20  al .  ** header 
32700 77 69 74 68 20 74 68 65 20 6e 52 65 63 20 66 69  with the nRec fi
32710 65 6c 64 20 73 65 74 20 74 6f 20 30 2e 20 49 66  eld set to 0. If
32720 20 73 75 63 68 20 61 20 6a 6f 75 72 6e 61 6c 20   such a journal 
32730 69 73 20 75 73 65 64 20 61 73 0a 20 20 2a 2a 20  is used as.  ** 
32740 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 64 75  a hot-journal du
32750 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ring hot-journal
32760 20 72 6f 6c 6c 62 61 63 6b 2c 20 30 20 63 68 61   rollback, 0 cha
32770 6e 67 65 73 20 77 69 6c 6c 20 62 65 20 6d 61 64  nges will be mad
32780 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61  e.  ** to the da
32790 74 61 62 61 73 65 20 66 69 6c 65 2e 20 53 6f 20  tabase file. So 
327a0 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
327b0 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6a 6f 75   to zero the jou
327c0 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64 65  rnal .  ** heade
327d0 72 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67  r. Since the pag
327e0 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69  er is in exclusi
327f0 76 65 20 6d 6f 64 65 2c 20 74 68 65 72 65 20 69  ve mode, there i
32800 73 20 6e 6f 20 6e 65 65 64 0a 20 20 2a 2a 20 74  s no need.  ** t
32810 6f 20 64 72 6f 70 20 61 6e 79 20 6c 6f 63 6b 73  o drop any locks
32820 20 65 69 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20   either..  */.  
32830 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f  if( pPager->dbMo
32840 64 69 66 69 65 64 3d 3d 30 20 26 26 20 70 50 61  dified==0 && pPa
32850 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
32860 64 65 20 0a 20 20 20 26 26 20 70 50 61 67 65 72  de .   && pPager
32870 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
32880 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
32890 5f 50 45 52 53 49 53 54 0a 20 20 29 7b 0a 20 20  _PERSIST.  ){.  
328a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
328b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
328c0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
328d0 67 65 72 29 20 7c 7c 20 21 70 50 61 67 65 72 2d  ger) || !pPager-
328e0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20  >journalOff );. 
328f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
32900 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45  _OK;.  }..  PAGE
32910 52 54 52 41 43 45 28 28 22 43 4f 4d 4d 49 54 20  RTRACE(("COMMIT 
32920 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
32930 50 61 67 65 72 29 29 29 3b 0a 20 20 61 73 73 65  Pager)));.  asse
32940 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
32950 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e==PAGER_SYNCED 
32960 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 21 70 50 61  || MEMDB || !pPa
32970 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
32980 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  );.  rc = pager_
32990 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
329a0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
329b0 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  setMaster);.  re
329c0 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
329d0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a  (pPager, rc);.}.
329e0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
329f0 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 54 68 65  all changes. The
32a00 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20   database falls 
32a10 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48  back to PAGER_SH
32a20 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a  ARED mode..**.**
32a30 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70   This function p
32a40 65 72 66 6f 72 6d 73 20 74 77 6f 20 74 61 73 6b  erforms two task
32a50 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 74  s:.**.**   1) It
32a60 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 20   rolls back the 
32a70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 72 65  journal file, re
32a80 73 74 6f 72 69 6e 67 20 61 6c 6c 20 64 61 74 61  storing all data
32a90 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a  base file and .*
32aa0 2a 20 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79  *      in-memory
32ab0 20 63 61 63 68 65 20 70 61 67 65 73 20 74 6f 20   cache pages to 
32ac0 74 68 65 20 73 74 61 74 65 20 74 68 65 79 20 77  the state they w
32ad0 65 72 65 20 69 6e 20 77 68 65 6e 20 74 68 65 20  ere in when the 
32ae0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
32af0 20 20 20 20 77 61 73 20 6f 70 65 6e 65 64 2c 20      was opened, 
32b00 61 6e 64 0a 2a 2a 20 20 20 32 29 20 49 74 20 66  and.**   2) It f
32b10 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75  inalizes the jou
32b20 72 6e 61 6c 20 66 69 6c 65 2c 20 73 6f 20 74 68  rnal file, so th
32b30 61 74 20 69 74 20 69 73 20 6e 6f 74 20 75 73 65  at it is not use
32b40 64 20 66 6f 72 20 68 6f 74 0a 2a 2a 20 20 20 20  d for hot.**    
32b50 20 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6e    rollback at an
32b60 79 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  y point in the f
32b70 75 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 73 75 62  uture..**.** sub
32b80 6a 65 63 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c  ject to the foll
32b90 6f 77 69 6e 67 20 71 75 61 6c 69 66 69 63 61 74  owing qualificat
32ba0 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49 66  ions:.**.** * If
32bb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
32bc0 65 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65  e is not yet ope
32bd0 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  n when this func
32be0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a  tion is called,.
32bf0 2a 2a 20 20 20 74 68 65 6e 20 6f 6e 6c 79 20 28  **   then only (
32c00 32 29 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e  2) is performed.
32c10 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
32c20 65 72 65 20 69 73 20 6e 6f 20 6a 6f 75 72 6e 61  ere is no journa
32c30 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 74 6f 20 72  l file.**   to r
32c40 6f 6c 6c 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  oll back..**.** 
32c50 2a 20 49 66 20 69 6e 20 61 6e 20 65 72 72 6f 72  * If in an error
32c60 20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68 61   state other tha
32c70 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 74  n SQLITE_FULL, t
32c80 68 65 6e 20 74 61 73 6b 20 28 31 29 20 69 73 20  hen task (1) is 
32c90 0a 2a 2a 20 20 20 70 65 72 66 6f 72 6d 65 64 2e  .**   performed.
32ca0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
32cb0 74 61 73 6b 20 28 32 29 2e 20 52 65 67 61 72 64  task (2). Regard
32cc0 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 63  less of the outc
32cd0 6f 6d 65 0a 2a 2a 20 20 20 6f 66 20 65 69 74 68  ome.**   of eith
32ce0 65 72 2c 20 74 68 65 20 65 72 72 6f 72 20 73 74  er, the error st
32cf0 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
32d00 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
32d10 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20 28 69  e caller.**   (i
32d20 2e 65 2e 20 65 69 74 68 65 72 20 53 51 4c 49 54  .e. either SQLIT
32d30 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49 54  E_IOERR or SQLIT
32d40 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a  E_CORRUPT)..**.*
32d50 2a 20 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  * * If the pager
32d60 20 69 73 20 69 6e 20 50 41 47 45 52 5f 52 45 53   is in PAGER_RES
32d70 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65  ERVED state, the
32d80 6e 20 61 74 74 65 6d 70 74 20 28 31 29 2e 20 57  n attempt (1). W
32d90 68 65 74 68 65 72 0a 2a 2a 20 20 20 6f 72 20 6e  hether.**   or n
32da0 6f 74 20 28 31 29 20 69 73 20 73 75 63 63 65 73  ot (1) is succes
32db0 73 66 75 6c 2c 20 61 6c 73 6f 20 61 74 74 65 6d  sful, also attem
32dc0 70 74 20 28 32 29 2e 20 49 66 20 73 75 63 63 65  pt (2). If succe
32dd0 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a  ssful, return.**
32de0 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74     SQLITE_OK. Ot
32df0 68 65 72 77 69 73 65 2c 20 65 6e 74 65 72 20 74  herwise, enter t
32e00 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61  he error state a
32e10 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 66 69  nd return the fi
32e20 72 73 74 20 0a 2a 2a 20 20 20 65 72 72 6f 72 20  rst .**   error 
32e30 63 6f 64 65 20 65 6e 63 6f 75 6e 74 65 72 65 64  code encountered
32e40 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74 68  . .**.**   In th
32e50 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73  is case there is
32e60 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20   no chance that 
32e70 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73  the database was
32e80 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 0a 2a 2a   written to. .**
32e90 20 20 20 53 6f 20 69 73 20 73 61 66 65 20 74 6f     So is safe to
32ea0 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
32eb0 75 72 6e 61 6c 20 66 69 6c 65 20 65 76 65 6e 20  urnal file even 
32ec0 69 66 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20  if the playback 
32ed0 0a 2a 2a 20 20 20 28 6f 70 65 72 61 74 69 6f 6e  .**   (operation
32ee0 20 31 29 20 66 61 69 6c 65 64 2e 20 48 6f 77 65   1) failed. Howe
32ef0 76 65 72 20 74 68 65 20 70 61 67 65 72 20 6d 75  ver the pager mu
32f00 73 74 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  st enter the err
32f10 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20 20 61 73  or state.**   as
32f20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
32f30 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
32f40 61 63 68 65 20 61 72 65 20 6e 6f 77 20 73 75 73  ache are now sus
32f50 70 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 2a 20 46 69  pect..**.** * Fi
32f60 6e 61 6c 6c 79 2c 20 69 66 20 69 6e 20 50 41 47  nally, if in PAG
32f70 45 52 5f 45 58 43 4c 55 53 49 56 45 20 73 74 61  ER_EXCLUSIVE sta
32f80 74 65 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74  te, then attempt
32f90 20 28 31 29 2e 20 4f 6e 6c 79 0a 2a 2a 20 20 20   (1). Only.**   
32fa0 61 74 74 65 6d 70 74 20 28 32 29 20 69 66 20 28  attempt (2) if (
32fb0 31 29 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  1) is successful
32fc0 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
32fd0 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
32fe0 2c 0a 2a 2a 20 20 20 6f 74 68 65 72 77 69 73 65  ,.**   otherwise
32ff0 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72   enter the error
33000 20 73 74 61 74 65 20 61 6e 64 20 72 65 74 75 72   state and retur
33010 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
33020 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 20 20   from the .**   
33030 66 61 69 6c 69 6e 67 20 6f 70 65 72 61 74 69 6f  failing operatio
33040 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74 68  n..**.**   In th
33050 69 73 20 63 61 73 65 20 74 68 65 20 64 61 74 61  is case the data
33060 62 61 73 65 20 66 69 6c 65 20 6d 61 79 20 68 61  base file may ha
33070 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
33080 74 6f 2e 20 53 6f 20 69 66 20 74 68 65 0a 2a 2a  to. So if the.**
33090 20 20 20 70 6c 61 79 62 61 63 6b 20 6f 70 65 72     playback oper
330a0 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 73 75  ation did not su
330b0 63 63 65 65 64 20 69 74 20 77 6f 75 6c 64 20 6e  cceed it would n
330c0 6f 74 20 62 65 20 73 61 66 65 20 74 6f 20 66 69  ot be safe to fi
330d0 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20 74 68 65 20  nalize.**   the 
330e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74  journal file. It
330f0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 65 66   needs to be lef
33100 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  t in the file-sy
33110 73 74 65 6d 20 73 6f 20 74 68 61 74 0a 2a 2a 20  stem so that.** 
33120 20 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f    some other pro
33130 63 65 73 73 20 63 61 6e 20 75 73 65 20 69 74 20  cess can use it 
33140 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
33150 61 74 61 62 61 73 65 20 73 74 61 74 65 20 28 62  atabase state (b
33160 79 0a 2a 2a 20 20 20 68 6f 74 2d 6a 6f 75 72 6e  y.**   hot-journ
33170 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 2a 2f  al rollback)..*/
33180 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
33190 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  rRollback(Pager 
331a0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
331b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
331c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
331d0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
331e0 2a 2f 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  */.  PAGERTRACE(
331f0 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  ("ROLLBACK %d\n"
33200 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
33210 29 29 29 3b 0a 20 20 69 66 28 20 70 61 67 65 72  )));.  if( pager
33220 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
33230 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a  {.    int rc2;..
33240 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33250 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70  PagerSavepoint(p
33260 50 61 67 65 72 2c 20 53 41 56 45 50 4f 49 4e 54  Pager, SAVEPOINT
33270 5f 52 4f 4c 4c 42 41 43 4b 2c 20 2d 31 29 3b 0a  _ROLLBACK, -1);.
33280 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f      rc2 = pager_
33290 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
332a0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
332b0 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  setMaster);.    
332c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
332d0 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20  K ) rc = rc2;.  
332e0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
332f0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
33300 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
33310 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
33320 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  || !isOpen(pPage
33330 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 72  r->jfd) ){.    r
33340 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
33350 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
33360 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
33370 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ter);.  }else if
33380 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
33390 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
333a0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
333b0 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  L ){.    if( pPa
333c0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
333d0 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
333e0 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62       pager_playb
333f0 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
33400 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70      }.    rc = p
33410 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
33420 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
33430 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
33440 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
33450 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b  {.      int rc2;
33460 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
33470 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
33480 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 32  r, 0);.      rc2
33490 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
334a0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
334b0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
334c0 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
334d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
334e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32          rc = rc2
334f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
33500 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
33510 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
33520 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
33530 0a 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  ..    if( !MEMDB
33540 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
33550 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
33560 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
33570 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
33580 75 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c  urs during a ROL
33590 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f  LBACK, we can no
335a0 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68   longer trust th
335b0 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 63  e pager.    ** c
335c0 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61  ache. So call pa
335d0 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74  ger_error() on t
335e0 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61  he way out to ma
335f0 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20  ke any error .  
33600 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e    ** persistent.
33610 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
33620 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
33630 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20  ger, rc);.  }.  
33640 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
33650 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
33660 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
33670 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72  file is opened r
33680 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ead-only.  Retur
33690 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68  n FALSE.** if th
336a0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69  e database is (i
336b0 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62  n theory) writab
336c0 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65  le..*/.u8 sqlite
336d0 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79  3PagerIsreadonly
336e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
336f0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
33700 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f  ->readOnly;.}../
33710 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
33720 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
33730 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
33740 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
33750 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50  3PagerRefcount(P
33760 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
33770 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
33780 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
33790 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
337a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
337b0 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74 65 20  the approximate 
337c0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
337d0 6f 66 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e  of memory curren
337e0 74 6c 79 0a 2a 2a 20 75 73 65 64 20 62 79 20 74  tly.** used by t
337f0 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 74 73  he pager and its
33800 20 61 73 73 6f 63 69 61 74 65 64 20 63 61 63 68   associated cach
33810 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
33820 33 50 61 67 65 72 4d 65 6d 55 73 65 64 28 50 61  3PagerMemUsed(Pa
33830 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
33840 69 6e 74 20 70 65 72 50 61 67 65 53 69 7a 65 20  int perPageSize 
33850 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
33860 7a 65 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78  ze + pPager->nEx
33870 74 72 61 20 2b 20 73 69 7a 65 6f 66 28 50 67 48  tra + sizeof(PgH
33880 64 72 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  dr).            
33890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
338a0 20 20 20 20 20 20 20 20 20 2b 20 35 2a 73 69 7a           + 5*siz
338b0 65 6f 66 28 76 6f 69 64 2a 29 3b 0a 20 20 72 65  eof(void*);.  re
338c0 74 75 72 6e 20 70 65 72 50 61 67 65 53 69 7a 65  turn perPageSize
338d0 2a 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61  *sqlite3PcachePa
338e0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
338f0 70 50 43 61 63 68 65 29 0a 20 20 20 20 20 20 20  pPCache).       
33900 20 20 20 20 2b 20 73 71 6c 69 74 65 33 4d 61 6c      + sqlite3Mal
33910 6c 6f 63 53 69 7a 65 28 70 50 61 67 65 72 29 0a  locSize(pPager).
33920 20 20 20 20 20 20 20 20 20 20 20 2b 20 70 50 61             + pPa
33930 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d  ger->pageSize;.}
33940 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
33950 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
33960 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
33970 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a  pecified page..*
33980 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
33990 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 44  erPageRefcount(D
339a0 62 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  bPage *pPage){. 
339b0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
339c0 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e  cachePageRefcoun
339d0 74 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 23 69 66  t(pPage);.}..#if
339e0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
339f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
33a00 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
33a10 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
33a20 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74  sis only..*/.int
33a30 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53 74   *sqlite3PagerSt
33a40 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ats(Pager *pPage
33a50 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  r){.  static int
33a60 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d   a[11];.  a[0] =
33a70 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
33a80 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
33a90 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 31 5d 20  PCache);.  a[1] 
33aa0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  = sqlite3PcacheP
33ab0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d  agecount(pPager-
33ac0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 32  >pPCache);.  a[2
33ad0 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  ] = sqlite3Pcach
33ae0 65 47 65 74 43 61 63 68 65 73 69 7a 65 28 70 50  eGetCachesize(pP
33af0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
33b00 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d    a[3] = pPager-
33b10 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3f 20 28  >dbSizeValid ? (
33b20 69 6e 74 29 20 70 50 61 67 65 72 2d 3e 64 62 53  int) pPager->dbS
33b30 69 7a 65 20 3a 20 2d 31 3b 0a 20 20 61 5b 34 5d  ize : -1;.  a[4]
33b40 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65   = pPager->state
33b50 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65  ;.  a[5] = pPage
33b60 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b  r->errCode;.  a[
33b70 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69  6] = pPager->nHi
33b80 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67  t;.  a[7] = pPag
33b90 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38  er->nMiss;.  a[8
33ba0 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20  ] = 0;  /* Used 
33bb0 74 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f  to be pPager->nO
33bc0 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20  vfl */.  a[9] = 
33bd0 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20  pPager->nRead;. 
33be0 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d   a[10] = pPager-
33bf0 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72  >nWrite;.  retur
33c00 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n a;.}.#endif../
33c10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
33c20 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   if this is an i
33c30 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a  n-memory pager..
33c40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
33c50 67 65 72 49 73 4d 65 6d 64 62 28 50 61 67 65 72  gerIsMemdb(Pager
33c60 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
33c70 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 0a 2f 2a  urn MEMDB;.}../*
33c80 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74  .** Check that t
33c90 68 65 72 65 20 61 72 65 20 61 74 20 6c 65 61 73  here are at leas
33ca0 74 20 6e 53 61 76 65 70 6f 69 6e 74 20 73 61 76  t nSavepoint sav
33cb0 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2e 20 49 66  epoints open. If
33cc0 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 63 75   there are.** cu
33cd0 72 72 65 6e 74 6c 79 20 6c 65 73 73 20 74 68 61  rrently less tha
33ce0 6e 20 6e 53 61 76 65 70 6f 69 6e 74 73 20 6f 70  n nSavepoints op
33cf0 65 6e 2c 20 74 68 65 6e 20 6f 70 65 6e 20 6f 6e  en, then open on
33d00 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f  e or more savepo
33d10 69 6e 74 73 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20  ints.** to make 
33d20 75 70 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  up the differenc
33d30 65 2e 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  e. If the number
33d40 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 20 69   of savepoints i
33d50 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 65 71 75  s already.** equ
33d60 61 6c 20 74 6f 20 6e 53 61 76 65 70 6f 69 6e 74  al to nSavepoint
33d70 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
33d80 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
33d90 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
33da0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
33db0 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ils, SQLITE_NOME
33dc0 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  M is returned. I
33dd0 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f  f an error .** o
33de0 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e  ccurs while open
33df0 69 6e 67 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  ing the sub-jour
33e00 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 61  nal file, then a
33e10 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
33e20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20  is.** returned. 
33e30 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
33e40 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
33e50 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
33e60 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50  epoint(Pager *pP
33e70 61 67 65 72 2c 20 69 6e 74 20 6e 53 61 76 65 70  ager, int nSavep
33e80 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  oint){.  int rc 
33e90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
33ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33eb0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
33ec0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 72  e */.  int nCurr
33ed0 65 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53  ent = pPager->nS
33ee0 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20  avepoint;       
33ef0 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d 62   /* Current numb
33f00 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73  er of savepoints
33f10 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 53 61 76 65   */..  if( nSave
33f20 70 6f 69 6e 74 3e 6e 43 75 72 72 65 6e 74 20 26  point>nCurrent &
33f30 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  & pPager->useJou
33f40 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  rnal ){.    int 
33f50 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
33f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f70 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
33f80 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
33f90 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
33fa0 61 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  aNew;           
33fb0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 50          /* New P
33fc0 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20  ager.aSavepoint 
33fd0 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74  array */.    int
33fe0 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
33ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34000 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
34010 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
34020 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
34030 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
34040 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
34050 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
34060 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 2f  eturn rc;..    /
34070 2a 20 47 72 6f 77 20 74 68 65 20 50 61 67 65 72  * Grow the Pager
34080 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72 61  .aSavepoint arra
34090 79 20 75 73 69 6e 67 20 72 65 61 6c 6c 6f 63 28  y using realloc(
340a0 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ). Return SQLITE
340b0 5f 4e 4f 4d 45 4d 0a 20 20 20 20 2a 2a 20 69 66  _NOMEM.    ** if
340c0 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
340d0 66 61 69 6c 73 2e 20 4f 74 68 65 72 77 69 73 65  fails. Otherwise
340e0 2c 20 7a 65 72 6f 20 74 68 65 20 6e 65 77 20 70  , zero the new p
340f0 6f 72 74 69 6f 6e 20 69 6e 20 63 61 73 65 20 61  ortion in case a
34100 20 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20   .    ** malloc 
34110 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
34120 68 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e 67 20  hile populating 
34130 69 74 20 69 6e 20 74 68 65 20 66 6f 72 28 2e 2e  it in the for(..
34140 2e 29 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e 0a 20  .) loop below.. 
34150 20 20 20 2a 2f 0a 20 20 20 20 61 4e 65 77 20 3d     */.    aNew =
34160 20 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74   (PagerSavepoint
34170 20 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f   *)sqlite3Reallo
34180 63 28 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  c(.        pPage
34190 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 2c 20 73  r->aSavepoint, s
341a0 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65 70  izeof(PagerSavep
341b0 6f 69 6e 74 29 2a 6e 53 61 76 65 70 6f 69 6e 74  oint)*nSavepoint
341c0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
341d0 21 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72  !aNew ){.      r
341e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
341f0 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  EM;.    }.    me
34200 6d 73 65 74 28 26 61 4e 65 77 5b 6e 43 75 72 72  mset(&aNew[nCurr
34210 65 6e 74 5d 2c 20 30 2c 20 28 6e 53 61 76 65 70  ent], 0, (nSavep
34220 6f 69 6e 74 2d 6e 43 75 72 72 65 6e 74 29 20 2a  oint-nCurrent) *
34230 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76   sizeof(PagerSav
34240 65 70 6f 69 6e 74 29 29 3b 0a 20 20 20 20 70 50  epoint));.    pP
34250 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
34260 20 3d 20 61 4e 65 77 3b 0a 0a 20 20 20 20 2f 2a   = aNew;..    /*
34270 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 50 61   Populate the Pa
34280 67 65 72 53 61 76 65 70 6f 69 6e 74 20 73 74 72  gerSavepoint str
34290 75 63 74 75 72 65 73 20 6a 75 73 74 20 61 6c 6c  uctures just all
342a0 6f 63 61 74 65 64 2e 20 2a 2f 0a 20 20 20 20 66  ocated. */.    f
342b0 6f 72 28 69 69 3d 6e 43 75 72 72 65 6e 74 3b 20  or(ii=nCurrent; 
342c0 69 69 3c 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  ii<nSavepoint; i
342d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 4e 65 77  i++){.      aNew
342e0 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d 20 6e 50 61  [ii].nOrig = nPa
342f0 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73  ge;.      if( is
34300 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
34310 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ) && pPager->jou
34320 72 6e 61 6c 4f 66 66 3e 30 20 29 7b 0a 20 20 20  rnalOff>0 ){.   
34330 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f       aNew[ii].iO
34340 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
34350 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
34360 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
34370 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65   aNew[ii].iOffse
34380 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  t = JOURNAL_HDR_
34390 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
343a0 20 20 7d 0a 20 20 20 20 20 20 61 4e 65 77 5b 69    }.      aNew[i
343b0 69 5d 2e 69 53 75 62 52 65 63 20 3d 20 70 50 61  i].iSubRec = pPa
343c0 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 0a 20 20  ger->nSubRec;.  
343d0 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 70 49 6e      aNew[ii].pIn
343e0 53 61 76 65 70 6f 69 6e 74 20 3d 20 73 71 6c 69  Savepoint = sqli
343f0 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
34400 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  nPage);.      if
34410 28 20 21 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53  ( !aNew[ii].pInS
34420 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
34430 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
34440 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
34450 0a 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72  .      if( pager
34460 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
34470 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
34480 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 28 70 50  3WalSavepoint(pP
34490 61 67 65 72 2d 3e 70 57 61 6c 2c 20 61 4e 65 77  ager->pWal, aNew
344a0 5b 69 69 5d 2e 61 57 61 6c 44 61 74 61 29 3b 0a  [ii].aWalData);.
344b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
344c0 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
344d0 20 3d 20 69 69 2b 31 3b 0a 20 20 20 20 7d 0a 20   = ii+1;.    }. 
344e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
344f0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 6e  r->nSavepoint==n
34500 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 20  Savepoint );.   
34510 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
34520 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72  onstraint(pPager
34530 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
34540 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
34550 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
34560 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63  alled to rollbac
34570 6b 20 6f 72 20 72 65 6c 65 61 73 65 20 28 63 6f  k or release (co
34580 6d 6d 69 74 29 20 61 20 73 61 76 65 70 6f 69 6e  mmit) a savepoin
34590 74 2e 0a 2a 2a 20 54 68 65 20 73 61 76 65 70 6f  t..** The savepo
345a0 69 6e 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6f  int to release o
345b0 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 20  r rollback need 
345c0 6e 6f 74 20 62 65 20 74 68 65 20 6d 6f 73 74 20  not be the most 
345d0 72 65 63 65 6e 74 6c 79 20 0a 2a 2a 20 63 72 65  recently .** cre
345e0 61 74 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a  ated savepoint..
345f0 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  **.** Parameter 
34600 6f 70 20 69 73 20 61 6c 77 61 79 73 20 65 69 74  op is always eit
34610 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  her SAVEPOINT_RO
34620 4c 4c 42 41 43 4b 20 6f 72 20 53 41 56 45 50 4f  LLBACK or SAVEPO
34630 49 4e 54 5f 52 45 4c 45 41 53 45 2e 0a 2a 2a 20  INT_RELEASE..** 
34640 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49  If it is SAVEPOI
34650 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e  NT_RELEASE, then
34660 20 72 65 6c 65 61 73 65 20 61 6e 64 20 64 65 73   release and des
34670 74 72 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69  troy the savepoi
34680 6e 74 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78  nt with.** index
34690 20 69 53 61 76 65 70 6f 69 6e 74 2e 20 49 66 20   iSavepoint. If 
346a0 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  it is SAVEPOINT_
346b0 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 72  ROLLBACK, then r
346c0 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e  ollback all chan
346d0 67 65 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65  ges.** that have
346e0 20 6f 63 63 75 72 72 65 64 20 73 69 6e 63 65 20   occurred since 
346f0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 73 61  the specified sa
34700 76 65 70 6f 69 6e 74 20 77 61 73 20 63 72 65 61  vepoint was crea
34710 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ted..**.** The s
34720 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 6f 6c 6c  avepoint to roll
34730 62 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 20  back or release 
34740 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  is identified by
34750 20 70 61 72 61 6d 65 74 65 72 20 0a 2a 2a 20 69   parameter .** i
34760 53 61 76 65 70 6f 69 6e 74 2e 20 41 20 76 61 6c  Savepoint. A val
34770 75 65 20 6f 66 20 30 20 6d 65 61 6e 73 20 74 6f  ue of 0 means to
34780 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
34790 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f  outermost savepo
347a0 69 6e 74 0a 2a 2a 20 28 74 68 65 20 66 69 72 73  int.** (the firs
347b0 74 20 63 72 65 61 74 65 64 29 2e 20 41 20 76 61  t created). A va
347c0 6c 75 65 20 6f 66 20 28 50 61 67 65 72 2e 6e 53  lue of (Pager.nS
347d0 61 76 65 70 6f 69 6e 74 2d 31 29 20 6d 65 61 6e  avepoint-1) mean
347e0 73 20 6f 70 65 72 61 74 65 0a 2a 2a 20 6f 6e 20  s operate.** on 
347f0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
34800 79 20 63 72 65 61 74 65 64 20 73 61 76 65 70 6f  y created savepo
34810 69 6e 74 2e 20 49 66 20 69 53 61 76 65 70 6f 69  int. If iSavepoi
34820 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
34830 61 6e 0a 2a 2a 20 28 50 61 67 65 72 2e 6e 53 61  an.** (Pager.nSa
34840 76 65 70 6f 69 6e 74 2d 31 29 2c 20 74 68 65 6e  vepoint-1), then
34850 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
34860 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
34870 20 49 66 20 61 20 6e 65 67 61 74 69 76 65 20 76   If a negative v
34880 61 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 74  alue is passed t
34890 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
348a0 20 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   then the curren
348b0 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
348c0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
348d0 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65   This is differe
348e0 6e 74 20 74 6f 20 63 61 6c 6c 69 6e 67 20 0a 2a  nt to calling .*
348f0 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
34900 6c 6c 62 61 63 6b 28 29 20 62 65 63 61 75 73 65  llback() because
34910 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
34920 6f 65 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74  oes not terminat
34930 65 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  e.** the transac
34940 74 69 6f 6e 20 6f 72 20 75 6e 6c 6f 63 6b 20 74  tion or unlock t
34950 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20  he database, it 
34960 6a 75 73 74 20 72 65 73 74 6f 72 65 73 20 74 68  just restores th
34970 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
34980 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
34990 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
349a0 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 6e 20  tate. .**.** In 
349b0 61 6e 79 20 63 61 73 65 2c 20 61 6c 6c 20 73 61  any case, all sa
349c0 76 65 70 6f 69 6e 74 73 20 77 69 74 68 20 61 6e  vepoints with an
349d0 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74   index greater t
349e0 68 61 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 0a  han iSavepoint .
349f0 2a 2a 20 61 72 65 20 64 65 73 74 72 6f 79 65 64  ** are destroyed
34a00 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72  . If this is a r
34a10 65 6c 65 61 73 65 20 6f 70 65 72 61 74 69 6f 6e  elease operation
34a20 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   (op==SAVEPOINT_
34a30 52 45 4c 45 41 53 45 29 2c 0a 2a 2a 20 74 68 65  RELEASE),.** the
34a40 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 53 61 76  n savepoint iSav
34a50 65 70 6f 69 6e 74 20 69 73 20 61 6c 73 6f 20 64  epoint is also d
34a60 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20  estroyed..**.** 
34a70 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
34a80 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
34a90 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 65 6d 6f 72  NOMEM if a memor
34aa0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
34ab0 6c 73 2c 0a 2a 2a 20 6f 72 20 61 6e 20 49 4f 20  ls,.** or an IO 
34ac0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
34ad0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
34ae0 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 20 62   while rolling b
34af0 61 63 6b 20 61 20 0a 2a 2a 20 73 61 76 65 70 6f  ack a .** savepo
34b00 69 6e 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72  int. If no error
34b10 73 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f  s occur, SQLITE_
34b20 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
34b30 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  */ .int sqlite3P
34b40 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 50 61  agerSavepoint(Pa
34b50 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
34b60 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f   op, int iSavepo
34b70 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
34b80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
34b90 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50  ssert( op==SAVEP
34ba0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20  OINT_RELEASE || 
34bb0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
34bc0 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 61 73 73 65  LLBACK );.  asse
34bd0 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d  rt( iSavepoint>=
34be0 30 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  0 || op==SAVEPOI
34bf0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 0a  NT_ROLLBACK );..
34c00 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74    if( iSavepoint
34c10 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
34c20 69 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  int ){.    int i
34c30 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
34c40 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
34c50 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e  le */.    int nN
34c60 65 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew;          /* 
34c70 4e 75 6d 62 65 72 20 6f 66 20 72 65 6d 61 69 6e  Number of remain
34c80 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ing savepoints a
34c90 66 74 65 72 20 74 68 69 73 20 6f 70 2e 20 2a 2f  fter this op. */
34ca0 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  ..    /* Figure 
34cb0 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 73 61 76  out how many sav
34cc0 65 70 6f 69 6e 74 73 20 77 69 6c 6c 20 73 74 69  epoints will sti
34cd0 6c 6c 20 62 65 20 61 63 74 69 76 65 20 61 66 74  ll be active aft
34ce0 65 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6f  er this.    ** o
34cf0 70 65 72 61 74 69 6f 6e 2e 20 53 74 6f 72 65 20  peration. Store 
34d00 74 68 69 73 20 76 61 6c 75 65 20 69 6e 20 6e 4e  this value in nN
34d10 65 77 2e 20 54 68 65 6e 20 66 72 65 65 20 72 65  ew. Then free re
34d20 73 6f 75 72 63 65 73 20 61 73 73 6f 63 69 61 74  sources associat
34d30 65 64 20 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ed .    ** with 
34d40 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74  any savepoints t
34d50 68 61 74 20 61 72 65 20 64 65 73 74 72 6f 79 65  hat are destroye
34d60 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
34d70 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
34d80 6e 4e 65 77 20 3d 20 69 53 61 76 65 70 6f 69 6e  nNew = iSavepoin
34d90 74 20 2b 20 28 28 20 6f 70 3d 3d 53 41 56 45 50  t + (( op==SAVEP
34da0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 20 3f  OINT_RELEASE ) ?
34db0 20 30 20 3a 20 31 29 3b 0a 20 20 20 20 66 6f 72   0 : 1);.    for
34dc0 28 69 69 3d 6e 4e 65 77 3b 20 69 69 3c 70 50 61  (ii=nNew; ii<pPa
34dd0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
34de0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71   ii++){.      sq
34df0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
34e00 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  oy(pPager->aSave
34e10 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76  point[ii].pInSav
34e20 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  epoint);.    }. 
34e30 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65     pPager->nSave
34e40 70 6f 69 6e 74 20 3d 20 6e 4e 65 77 3b 0a 0a 20  point = nNew;.. 
34e50 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
34e60 20 61 20 72 65 6c 65 61 73 65 20 6f 66 20 74 68   a release of th
34e70 65 20 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65  e outermost save
34e80 70 6f 69 6e 74 2c 20 74 72 75 6e 63 61 74 65 20  point, truncate 
34e90 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  .    ** the sub-
34ea0 6a 6f 75 72 6e 61 6c 20 74 6f 20 7a 65 72 6f 20  journal to zero 
34eb0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 2a  bytes in size. *
34ec0 2f 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41  /.    if( op==SA
34ed0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
34ee0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 65  ){.      if( nNe
34ef0 77 3d 3d 30 20 26 26 20 69 73 4f 70 65 6e 28 70  w==0 && isOpen(p
34f00 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
34f10 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20          /* Only 
34f20 74 72 75 6e 63 61 74 65 20 69 66 20 69 74 20 69  truncate if it i
34f30 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  s an in-memory s
34f40 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  ub-journal. */. 
34f50 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
34f60 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
34f70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
34f80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
34f90 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
34fa0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 30  (pPager->sjfd, 0
34fb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
34fc0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
34fd0 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OK );.        }.
34fe0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
34ff0 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 20 20 20  nSubRec = 0;.   
35000 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f     }.    }.    /
35010 2a 20 45 6c 73 65 20 74 68 69 73 20 69 73 20 61  * Else this is a
35020 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
35030 69 6f 6e 2c 20 70 6c 61 79 62 61 63 6b 20 74 68  ion, playback th
35040 65 20 73 70 65 63 69 66 69 65 64 20 73 61 76 65  e specified save
35050 70 6f 69 6e 74 2e 0a 20 20 20 20 2a 2a 20 49 66  point..    ** If
35060 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 2d   this is a temp-
35070 66 69 6c 65 2c 20 69 74 20 69 73 20 70 6f 73 73  file, it is poss
35080 69 62 6c 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ible that the jo
35090 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 0a 20  urnal file has. 
350a0 20 20 20 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65     ** not yet be
350b0 65 6e 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68  en opened. In th
350c0 69 73 20 63 61 73 65 20 74 68 65 72 65 20 68 61  is case there ha
350d0 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67  ve been no chang
350e0 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  es to.    ** the
350f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
35100 73 6f 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20  so the playback 
35110 6f 70 65 72 61 74 69 6f 6e 20 63 61 6e 20 62 65  operation can be
35120 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f   skipped..    */
35130 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 61  .    else if( pa
35140 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
35150 29 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  ) || isOpen(pPag
35160 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
35170 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
35180 20 2a 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 28   *pSavepoint = (
35190 6e 4e 65 77 3d 3d 30 29 3f 30 3a 26 70 50 61 67  nNew==0)?0:&pPag
351a0 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 6e  er->aSavepoint[n
351b0 4e 65 77 2d 31 5d 3b 0a 20 20 20 20 20 20 72 63  New-1];.      rc
351c0 20 3d 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b   = pagerPlayback
351d0 53 61 76 65 70 6f 69 6e 74 28 70 50 61 67 65 72  Savepoint(pPager
351e0 2c 20 70 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , pSavepoint);. 
351f0 20 20 20 20 20 61 73 73 65 72 74 28 72 63 21 3d       assert(rc!=
35200 53 51 4c 49 54 45 5f 44 4f 4e 45 29 3b 0a 20 20  SQLITE_DONE);.  
35210 20 20 7d 0a 20 20 0a 20 20 7d 0a 20 20 72 65 74    }.  .  }.  ret
35220 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
35230 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
35240 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
35250 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
35260 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
35270 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
35280 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
35290 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
352a0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a  ger->zFilename;.
352b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
352c0 74 68 65 20 56 46 53 20 73 74 72 75 63 74 75 72  the VFS structur
352d0 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e  e for the pager.
352e0 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65  .*/.const sqlite
352f0 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61  3_vfs *sqlite3Pa
35300 67 65 72 56 66 73 28 50 61 67 65 72 20 2a 70 50  gerVfs(Pager *pP
35310 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
35320 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a  pPager->pVfs;.}.
35330 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
35340 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f  e file handle fo
35350 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
35360 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  ile associated.*
35370 2a 20 77 69 74 68 20 74 68 65 20 70 61 67 65 72  * with the pager
35380 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 72 65  .  This might re
35390 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
353a0 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74   file has.** not
353b0 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
353c0 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c  ..*/.sqlite3_fil
353d0 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46  e *sqlite3PagerF
353e0 69 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ile(Pager *pPage
353f0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
35400 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  ger->fd;.}../*.*
35410 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
35420 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
35430 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
35440 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
35450 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
35460 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  alname(Pager *pP
35470 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
35480 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
35490 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
354a0 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28  n true if fsync(
354b0 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61  ) calls are disa
354c0 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61  bled for this pa
354d0 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  ger.  Return FAL
354e0 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29  SE.** if fsync()
354f0 73 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e  s are executed n
35500 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  ormally..*/.int 
35510 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
35520 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
35530 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
35540 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23  er->noSync;.}..#
35550 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
35560 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74  _CODEC./*.** Set
35570 20 6f 72 20 72 65 74 72 69 65 76 65 20 74 68 65   or retrieve the
35580 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20   codec for this 
35590 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71  pager.*/.void sq
355a0 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 6f 64  lite3PagerSetCod
355b0 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ec(.  Pager *pPa
355c0 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ger,.  void *(*x
355d0 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
355e0 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20  d*,Pgno,int),.  
355f0 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a  void (*xCodecSiz
35600 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74  eChng)(void*,int
35610 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ,int),.  void (*
35620 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64  xCodecFree)(void
35630 2a 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64  *),.  void *pCod
35640 65 63 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ec.){.  if( pPag
35650 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29  er->xCodecFree )
35660 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46   pPager->xCodecF
35670 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64  ree(pPager->pCod
35680 65 63 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78  ec);.  pPager->x
35690 43 6f 64 65 63 20 3d 20 70 50 61 67 65 72 2d 3e  Codec = pPager->
356a0 6d 65 6d 44 62 20 3f 20 30 20 3a 20 78 43 6f 64  memDb ? 0 : xCod
356b0 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43  ec;.  pPager->xC
356c0 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 3d 20 78  odecSizeChng = x
356d0 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 3b 0a 20  CodecSizeChng;. 
356e0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46   pPager->xCodecF
356f0 72 65 65 20 3d 20 78 43 6f 64 65 63 46 72 65 65  ree = xCodecFree
35700 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64  ;.  pPager->pCod
35710 65 63 20 3d 20 70 43 6f 64 65 63 3b 0a 20 20 70  ec = pCodec;.  p
35720 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70  agerReportSize(p
35730 50 61 67 65 72 29 3b 0a 7d 0a 76 6f 69 64 20 2a  Pager);.}.void *
35740 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 43  sqlite3PagerGetC
35750 6f 64 65 63 28 50 61 67 65 72 20 2a 70 50 61 67  odec(Pager *pPag
35760 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
35770 61 67 65 72 2d 3e 70 43 6f 64 65 63 3b 0a 7d 0a  ager->pCodec;.}.
35780 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
35790 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
357a0 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76  VACUUM./*.** Mov
357b0 65 20 74 68 65 20 70 61 67 65 20 70 50 67 20 74  e the page pPg t
357c0 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20  o location pgno 
357d0 69 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  in the file..**.
357e0 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  ** There must be
357f0 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74   no references t
35800 6f 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69  o the page previ
35810 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74  ously located at
35820 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69 63 68 20  .** pgno (which 
35830 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20  we call pPgOld) 
35840 74 68 6f 75 67 68 20 74 68 61 74 20 70 61 67 65  though that page
35850 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62   is allowed to b
35860 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20 20  e.** in cache.  
35870 49 66 20 74 68 65 20 70 61 67 65 20 70 72 65 76  If the page prev
35880 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61  iously located a
35890 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c  t pgno is not al
358a0 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20  ready.** in the 
358b0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
358c0 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 75 74 20  , it is not put 
358d0 74 68 65 72 65 20 62 79 20 62 79 20 74 68 69 73  there by by this
358e0 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
358f0 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  References to th
35900 65 20 70 61 67 65 20 70 50 67 20 72 65 6d 61 69  e page pPg remai
35910 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e  n valid. Updatin
35920 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61  g any.** meta-da
35930 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
35940 74 68 20 70 50 67 20 28 69 2e 65 2e 20 64 61 74  th pPg (i.e. dat
35950 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  a stored in the 
35960 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20  nExtra bytes.** 
35970 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
35980 77 69 74 68 20 74 68 65 20 70 61 67 65 29 20 69  with the page) i
35990 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
359a0 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
359b0 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e  er..**.** A tran
359c0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
359d0 61 63 74 69 76 65 20 77 68 65 6e 20 74 68 69 73  active when this
359e0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
359f0 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62  ed. It used to b
35a00 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68  e.** required th
35a10 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  at a statement t
35a20 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e  ransaction was n
35a30 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74 20 74  ot active, but t
35a40 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a  his restriction.
35a50 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f  ** has been remo
35a60 76 65 64 20 28 43 52 45 41 54 45 20 49 4e 44 45  ved (CREATE INDE
35a70 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20  X needs to move 
35a80 61 20 70 61 67 65 20 77 68 65 6e 20 61 20 73 74  a page when a st
35a90 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  atement.** trans
35aa0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
35ab0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
35ac0 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 2c  fourth argument,
35ad0 20 69 73 43 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f   isCommit, is no
35ae0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69  n-zero, then thi
35af0 73 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 0a  s page is being.
35b00 2a 2a 20 6d 6f 76 65 64 20 61 73 20 70 61 72 74  ** moved as part
35b10 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 72   of a database r
35b20 65 6f 72 67 61 6e 69 7a 61 74 69 6f 6e 20 6a 75  eorganization ju
35b30 73 74 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  st before the tr
35b40 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 69 73  ansaction .** is
35b50 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64   being committed
35b60 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
35b70 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
35b80 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
35b90 73 65 20 70 61 67 65 20 0a 2a 2a 20 70 50 67 20  se page .** pPg 
35ba0 72 65 66 65 72 73 20 74 6f 20 77 69 6c 6c 20 6e  refers to will n
35bb0 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  ot be written to
35bc0 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
35bd0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  is transaction..
35be0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
35bf0 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ion may return S
35c00 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61  QLITE_NOMEM or a
35c10 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
35c20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f  if an error.** o
35c30 63 63 75 72 73 2e 20 4f 74 68 65 72 77 69 73 65  ccurs. Otherwise
35c40 2c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  , it returns SQL
35c50 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
35c60 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
35c70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
35c80 72 2c 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20  r, DbPage *pPg, 
35c90 50 67 6e 6f 20 70 67 6e 6f 2c 20 69 6e 74 20 69  Pgno pgno, int i
35ca0 73 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 48 64  sCommit){.  PgHd
35cb0 72 20 2a 70 50 67 4f 6c 64 3b 20 20 20 20 20 20  r *pPgOld;      
35cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
35cd0 70 61 67 65 20 62 65 69 6e 67 20 6f 76 65 72 77  page being overw
35ce0 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 50 67 6e  ritten. */.  Pgn
35cf0 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d  o needSyncPgno =
35d00 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6c 64   0;       /* Old
35d10 20 76 61 6c 75 65 20 6f 66 20 70 50 67 2d 3e 70   value of pPg->p
35d20 67 6e 6f 2c 20 69 66 20 73 79 6e 63 20 69 73 20  gno, if sync is 
35d30 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e  required */.  in
35d40 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
35d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
35d60 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50  turn code */.  P
35d70 67 6e 6f 20 6f 72 69 67 50 67 6e 6f 3b 20 20 20  gno origPgno;   
35d80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
35d90 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
35da0 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 61 73   number */..  as
35db0 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
35dc0 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 6f 72  0 );..  /* In or
35dd0 64 65 72 20 74 6f 20 62 65 20 61 62 6c 65 20 74  der to be able t
35de0 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 6e 20 69  o rollback, an i
35df0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
35e00 65 20 6d 75 73 74 20 6a 6f 75 72 6e 61 6c 0a 20  e must journal. 
35e10 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77 65 20   ** the page we 
35e20 61 72 65 20 6d 6f 76 69 6e 67 20 66 72 6f 6d 2e  are moving from.
35e30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44  .  */.  if( MEMD
35e40 42 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  B ){.    rc = sq
35e50 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
35e60 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
35e70 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
35e80 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
35e90 61 67 65 20 62 65 69 6e 67 20 6d 6f 76 65 64 20  age being moved 
35ea0 69 73 20 64 69 72 74 79 20 61 6e 64 20 68 61 73  is dirty and has
35eb0 20 6e 6f 74 20 62 65 65 6e 20 73 61 76 65 64 20   not been saved 
35ec0 62 79 20 74 68 65 20 6c 61 74 65 73 74 0a 20 20  by the latest.  
35ed0 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 68  ** savepoint, th
35ee0 65 6e 20 73 61 76 65 20 74 68 65 20 63 75 72 72  en save the curr
35ef0 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ent contents of 
35f00 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
35f10 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72  e .  ** sub-jour
35f20 6e 61 6c 20 6e 6f 77 2e 20 54 68 69 73 20 69 73  nal now. This is
35f30 20 72 65 71 75 69 72 65 64 20 74 6f 20 68 61 6e   required to han
35f40 64 6c 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  dle the followin
35f50 67 20 73 63 65 6e 61 72 69 6f 3a 0a 20 20 2a 2a  g scenario:.  **
35f60 0a 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20  .  **   BEGIN;. 
35f70 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c   **     <journal
35f80 20 70 61 67 65 20 58 2c 20 74 68 65 6e 20 6d 6f   page X, then mo
35f90 64 69 66 79 20 69 74 20 69 6e 20 6d 65 6d 6f 72  dify it in memor
35fa0 79 3e 0a 20 20 2a 2a 20 20 20 20 20 53 41 56 45  y>.  **     SAVE
35fb0 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 2a 2a 20  POINT one;.  ** 
35fc0 20 20 20 20 20 20 3c 4d 6f 76 65 20 70 61 67 65        <Move page
35fd0 20 58 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 59   X to location Y
35fe0 3e 0a 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42  >.  **     ROLLB
35ff0 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 2a 2a  ACK TO one;.  **
36000 0a 20 20 2a 2a 20 49 66 20 70 61 67 65 20 58 20  .  ** If page X 
36010 77 65 72 65 20 6e 6f 74 20 77 72 69 74 74 65 6e  were not written
36020 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
36030 6e 61 6c 20 68 65 72 65 2c 20 69 74 20 77 6f 75  nal here, it wou
36040 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 70  ld not.  ** be p
36050 6f 73 73 69 62 6c 65 20 74 6f 20 72 65 73 74 6f  ossible to resto
36060 72 65 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 20  re its contents 
36070 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41  when the "ROLLBA
36080 43 4b 20 54 4f 20 6f 6e 65 22 0a 20 20 2a 2a 20  CK TO one".  ** 
36090 73 74 61 74 65 6d 65 6e 74 20 77 65 72 65 20 69  statement were i
360a0 73 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a  s processed..  *
360b0 2a 0a 20 20 2a 2a 20 73 75 62 6a 6f 75 72 6e 61  *.  ** subjourna
360c0 6c 50 61 67 65 28 29 20 6d 61 79 20 6e 65 65 64  lPage() may need
360d0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61   to allocate spa
360e0 63 65 20 74 6f 20 73 74 6f 72 65 20 70 50 67 2d  ce to store pPg-
360f0 3e 70 67 6e 6f 20 69 6e 74 6f 0a 20 20 2a 2a 20  >pgno into.  ** 
36100 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65  one or more save
36110 70 6f 69 6e 74 20 62 69 74 76 65 63 73 2e 20 54  point bitvecs. T
36120 68 69 73 20 69 73 20 74 68 65 20 72 65 61 73 6f  his is the reaso
36130 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  n this function.
36140 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20    ** may return 
36150 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 20 20  SQLITE_NOMEM..  
36160 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c  */.  if( pPg->fl
36170 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 0a  ags&PGHDR_DIRTY.
36180 20 20 20 26 26 20 73 75 62 6a 52 65 71 75 69 72     && subjRequir
36190 65 73 50 61 67 65 28 70 50 67 29 0a 20 20 20 26  esPage(pPg).   &
361a0 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
361b0 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
361c0 65 28 70 50 67 29 29 0a 20 20 29 7b 0a 20 20 20  e(pPg)).  ){.   
361d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
361e0 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
361f0 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25 64 20  MOVE %d page %d 
36200 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f  (needSync=%d) mo
36210 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20  ves to %d\n", . 
36220 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
36230 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
36240 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
36250 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
36260 30 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 49 4f 54  0, pgno));.  IOT
36270 52 41 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25  RACE(("MOVE %p %
36280 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
36290 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f   pPg->pgno, pgno
362a0 29 29 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  ))..  /* If the 
362b0 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
362c0 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
362d0 6f 72 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67  ore page pPg->pg
362e0 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62 65 20 77  no can.  ** be w
362f0 72 69 74 74 65 6e 20 74 6f 2c 20 73 74 6f 72 65  ritten to, store
36300 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 6c 6f   pPg->pgno in lo
36310 63 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 65 65  cal variable nee
36320 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a 2a 0a  dSyncPgno..  **.
36330 20 20 2a 2a 20 49 66 20 74 68 65 20 69 73 43 6f    ** If the isCo
36340 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74  mmit flag is set
36350 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  , there is no ne
36360 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
36370 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75  hat.  ** the jou
36380 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  rnal needs to be
36390 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65   sync()ed before
363a0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
363b0 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a 20 63  Pg->pgno .  ** c
363c0 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  an be written to
363d0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73  . The caller has
363e0 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65   already promise
363f0 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74  d not to write t
36400 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o it..  */.  if(
36410 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
36420 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 20 26 26  DR_NEED_SYNC) &&
36430 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20   !isCommit ){.  
36440 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d    needSyncPgno =
36450 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
36460 61 73 73 65 72 74 28 20 70 61 67 65 49 6e 4a 6f  assert( pageInJo
36470 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70 50  urnal(pPg) || pP
36480 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
36490 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20  dbOrigSize );.  
364a0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
364b0 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
364c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
364d0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
364e0 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   );.  }..  /* If
364f0 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
36500 69 6e 73 20 61 20 70 61 67 65 20 77 69 74 68 20  ins a page with 
36510 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f  page-number pgno
36520 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a  , remove it.  **
36530 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63   from its hash c
36540 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74  hain. Also, if t
36550 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
36560 63 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20  c was set for . 
36570 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65   ** page pgno be
36580 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20  fore the 'move' 
36590 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65  operation, it ne
365a0 65 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e  eds to be retain
365b0 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ed .  ** for the
365c0 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72   page moved ther
365d0 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66  e..  */.  pPg->f
365e0 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e  lags &= ~PGHDR_N
365f0 45 45 44 5f 53 59 4e 43 3b 0a 20 20 70 50 67 4f  EED_SYNC;.  pPgO
36600 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ld = pager_looku
36610 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
36620 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67 4f  .  assert( !pPgO
36630 6c 64 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e 6e 52  ld || pPgOld->nR
36640 65 66 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70  ef==1 );.  if( p
36650 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 70 50 67  PgOld ){.    pPg
36660 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70 50 67 4f  ->flags |= (pPgO
36670 6c 64 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  ld->flags&PGHDR_
36680 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20 20 20 20  NEED_SYNC);.    
36690 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
366a0 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 69 73     /* Do not dis
366b0 63 61 72 64 20 70 61 67 65 73 20 66 72 6f 6d 20  card pages from 
366c0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
366d0 61 62 61 73 65 20 73 69 6e 63 65 20 77 65 20 6d  abase since we m
366e0 69 67 68 74 0a 20 20 20 20 20 20 2a 2a 20 6e 65  ight.      ** ne
366f0 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6c  ed to rollback l
36700 61 74 65 72 2e 20 20 4a 75 73 74 20 6d 6f 76 65  ater.  Just move
36710 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 6f 66   the page out of
36720 20 74 68 65 20 77 61 79 2e 20 2a 2f 0a 20 20 20   the way. */.   
36730 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
36740 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29  r->dbSizeValid )
36750 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
36760 63 61 63 68 65 4d 6f 76 65 28 70 50 67 4f 6c 64  cacheMove(pPgOld
36770 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
36780 2b 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  +1);.    }else{.
36790 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
367a0 63 68 65 44 72 6f 70 28 70 50 67 4f 6c 64 29 3b  cheDrop(pPgOld);
367b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6f 72  .    }.  }..  or
367c0 69 67 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  igPgno = pPg->pg
367d0 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  no;.  sqlite3Pca
367e0 63 68 65 4d 6f 76 65 28 70 50 67 2c 20 70 67 6e  cheMove(pPg, pgn
367f0 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  o);.  sqlite3Pca
36800 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
36810 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d  );.  pPager->dbM
36820 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 0a 20 20  odified = 1;..  
36830 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  if( needSyncPgno
36840 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65   ){.    /* If ne
36850 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f  edSyncPgno is no
36860 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
36870 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65   journal file ne
36880 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a  eds to be .    *
36890 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  * sync()ed befor
368a0 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 77 72  e any data is wr
368b0 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73  itten to databas
368c0 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64  e file page need
368d0 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a  SyncPgno..    **
368e0 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73   Currently, no s
368f0 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73 20  uch page exists 
36900 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  in the page-cach
36910 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a  e and the .    *
36920 2a 20 22 69 73 20 6a 6f 75 72 6e 61 6c 65 64 22  * "is journaled"
36930 20 62 69 74 76 65 63 20 66 6c 61 67 20 68 61 73   bitvec flag has
36940 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20   been set. This 
36950 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65  needs to be reme
36960 64 69 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 6c  died by.    ** l
36970 6f 61 64 69 6e 67 20 74 68 65 20 70 61 67 65 20  oading the page 
36980 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63  into the pager-c
36990 61 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67  ache and setting
369a0 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
369b0 79 6e 63 20 0a 20 20 20 20 2a 2a 20 66 6c 61 67  ync .    ** flag
369c0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
369d0 49 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  If the attempt t
369e0 6f 20 6c 6f 61 64 20 74 68 65 20 70 61 67 65 20  o load the page 
369f0 69 6e 74 6f 20 74 68 65 20 70 61 67 65 2d 63 61  into the page-ca
36a00 63 68 65 20 66 61 69 6c 73 2c 20 28 64 75 65 0a  che fails, (due.
36a10 20 20 20 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c      ** to a mall
36a20 6f 63 28 29 20 6f 72 20 49 4f 20 66 61 69 6c 75  oc() or IO failu
36a30 72 65 29 2c 20 63 6c 65 61 72 20 74 68 65 20 62  re), clear the b
36a40 69 74 20 69 6e 20 74 68 65 20 70 49 6e 4a 6f 75  it in the pInJou
36a50 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72  rnal[].    ** ar
36a60 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ray. Otherwise, 
36a70 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6c  if the page is l
36a80 6f 61 64 65 64 20 61 6e 64 20 77 72 69 74 74 65  oaded and writte
36a90 6e 20 61 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a  n again in.    *
36aa0 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  * this transacti
36ab0 6f 6e 2c 20 69 74 20 6d 61 79 20 62 65 20 77 72  on, it may be wr
36ac0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
36ad0 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
36ae0 65 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 73  e.    ** it is s
36af0 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6a  ynced into the j
36b00 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
36b10 73 20 77 61 79 2c 20 69 74 20 6d 61 79 20 65 6e  s way, it may en
36b20 64 20 75 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74  d up in.    ** t
36b30 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
36b40 74 77 69 63 65 2c 20 62 75 74 20 74 68 61 74 20  twice, but that 
36b50 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d  is not a problem
36b60 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
36b70 54 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  The sqlite3Pager
36b80 47 65 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63  Get() call may c
36b90 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ause the journal
36ba0 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b   to sync. So mak
36bb0 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68  e.    ** sure th
36bc0 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
36bd0 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f   flag is set too
36be0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 50 67 48  ..    */.    PgH
36bf0 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20  dr *pPgHdr;.    
36c00 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
36c10 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20  needSync );.    
36c20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
36c30 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65  rGet(pPager, nee
36c40 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48  dSyncPgno, &pPgH
36c50 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
36c60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36c70 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63      if( needSync
36c80 50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  Pgno<=pPager->db
36c90 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20  OrigSize ){.    
36ca0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
36cb0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 21 3d 30  er->pTmpSpace!=0
36cc0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
36cd0 74 65 33 42 69 74 76 65 63 43 6c 65 61 72 28 70  te3BitvecClear(p
36ce0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
36cf0 6c 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c  l, needSyncPgno,
36d00 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
36d10 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ce);.      }.   
36d20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
36d30 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
36d40 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
36d50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
36d60 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26 26 20 21  ->noSync==0 && !
36d70 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 50 67  MEMDB );.    pPg
36d80 48 64 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  Hdr->flags |= PG
36d90 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
36da0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
36db0 4d 61 6b 65 44 69 72 74 79 28 70 50 67 48 64 72  MakeDirty(pPgHdr
36dc0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
36dd0 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
36de0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
36df0 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   For an in-memor
36e00 79 20 64 61 74 61 62 61 73 65 2c 20 6d 61 6b 65  y database, make
36e10 20 73 75 72 65 20 74 68 65 20 6f 72 69 67 69 6e   sure the origin
36e20 61 6c 20 70 61 67 65 20 63 6f 6e 74 69 6e 75 65  al page continue
36e30 73 0a 20 20 2a 2a 20 74 6f 20 65 78 69 73 74 2c  s.  ** to exist,
36e40 20 69 6e 20 63 61 73 65 20 74 68 65 20 74 72 61   in case the tra
36e50 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  nsaction needs t
36e60 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 55 73  o roll back.  Us
36e70 65 20 70 50 67 4f 6c 64 0a 20 20 2a 2a 20 61 73  e pPgOld.  ** as
36e80 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
36e90 67 65 20 73 69 6e 63 65 20 69 74 20 68 61 73 20  ge since it has 
36ea0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
36eb0 6f 63 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  ocated..  */.  i
36ec0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
36ed0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 6f 76  sqlite3PcacheMov
36ee0 65 28 70 50 67 4f 6c 64 2c 20 6f 72 69 67 50 67  e(pPgOld, origPg
36ef0 6e 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  no);.    sqlite3
36f00 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 4f 6c  PagerUnref(pPgOl
36f10 64 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  d);.  }..  retur
36f20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
36f30 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
36f40 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
36f50 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
36f60 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
36f70 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
36f80 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 44  e3PagerGetData(D
36f90 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 61  bPage *pPg){.  a
36fa0 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
36fb0 3e 30 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65  >0 || pPg->pPage
36fc0 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20 20 72 65  r->memDb );.  re
36fd0 74 75 72 6e 20 70 50 67 2d 3e 70 44 61 74 61 3b  turn pPg->pData;
36fe0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
36ff0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
37000 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62  e Pager.nExtra b
37010 79 74 65 73 20 6f 66 20 22 65 78 74 72 61 22 20  ytes of "extra" 
37020 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61  space .** alloca
37030 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ted along with t
37040 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
37050 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  e..*/.void *sqli
37060 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
37070 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
37080 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 45 78   return pPg->pEx
37090 74 72 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  tra;.}../*.** Ge
370a0 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e  t/set the lockin
370b0 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20  g-mode for this 
370c0 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72  pager. Parameter
370d0 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f   eMode must be o
370e0 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c  ne.** of PAGER_L
370f0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
37100 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  , PAGER_LOCKINGM
37110 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a  ODE_NORMAL or .*
37120 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  * PAGER_LOCKINGM
37130 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49  ODE_EXCLUSIVE. I
37140 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
37150 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74  is not _QUERY, t
37160 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69  hen.** the locki
37170 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74  ng-mode is set t
37180 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70 65 63  o the value spec
37190 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ified..**.** The
371a0 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
371b0 69 73 20 65 69 74 68 65 72 20 50 41 47 45 52 5f  is either PAGER_
371c0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
371d0 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c  AL or.** PAGER_L
371e0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
371f0 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67  SIVE, indicating
37200 20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f   the current (po
37210 73 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a  ssibly updated).
37220 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e  ** locking-mode.
37230 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
37240 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28  agerLockingMode(
37250 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
37260 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73  nt eMode){.  ass
37270 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45  ert( eMode==PAGE
37280 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
37290 45 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERY.            
372a0 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
372b0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
372c0 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  AL.            |
372d0 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  | eMode==PAGER_L
372e0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
372f0 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
37300 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
37310 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20  ODE_QUERY<0 );. 
37320 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
37330 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
37340 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4c 4f  L>=0 && PAGER_LO
37350 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
37360 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  IVE>=0 );.  if( 
37370 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70 50 61  eMode>=0 && !pPa
37380 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
37390 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63  .    pPager->exc
373a0 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38  lusiveMode = (u8
373b0 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65  )eMode;.  }.  re
373c0 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72  turn (int)pPager
373d0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b  ->exclusiveMode;
373e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
373f0 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 66  e journal-mode f
37400 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50  or this pager. P
37410 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d  arameter eMode m
37420 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a 0a 2a  ust be one of:.*
37430 2a 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  *.**    PAGER_JO
37440 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
37450 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
37460 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
37470 45 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  E.**    PAGER_JO
37480 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
37490 54 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  T.**    PAGER_JO
374a0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a 2a 2a  URNALMODE_OFF.**
374b0 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
374c0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 0a 2a 2a 20  LMODE_MEMORY.** 
374d0 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c     PAGER_JOURNAL
374e0 4d 4f 44 45 5f 57 41 4c 0a 2a 2a 0a 2a 2a 20 54  MODE_WAL.**.** T
374f0 68 65 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65 20 69  he journalmode i
37500 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
37510 75 65 20 73 70 65 63 69 66 69 65 64 20 69 66 20  ue specified if 
37520 74 68 65 20 63 68 61 6e 67 65 20 69 73 20 61 6c  the change is al
37530 6c 6f 77 65 64 2e 0a 2a 2a 20 54 68 65 20 63 68  lowed..** The ch
37540 61 6e 67 65 20 6d 61 79 20 62 65 20 64 69 73 61  ange may be disa
37550 6c 6c 6f 77 65 64 20 66 6f 72 20 74 68 65 20 66  llowed for the f
37560 6f 6c 6c 6f 77 69 6e 67 20 72 65 61 73 6f 6e 73  ollowing reasons
37570 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20  :.**.**   *  An 
37580 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
37590 73 65 20 63 61 6e 20 6f 6e 6c 79 20 68 61 76 65  se can only have
375a0 20 69 74 73 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   its journal_mod
375b0 65 20 73 65 74 20 74 6f 20 5f 4f 46 46 0a 2a 2a  e set to _OFF.**
375c0 20 20 20 20 20 20 6f 72 20 5f 4d 45 4d 4f 52 59        or _MEMORY
375d0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 65 6d  ..**.**   *  Tem
375e0 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73  porary databases
375f0 20 63 61 6e 6e 6f 74 20 68 61 76 65 20 5f 57 41   cannot have _WA
37600 4c 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65 2e 0a 2a  L journalmode..*
37610 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
37620 64 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 63  d indicate the c
37630 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79  urrent (possibly
37640 20 75 70 64 61 74 65 64 29 20 6a 6f 75 72 6e 61   updated) journa
37650 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  l-mode..*/.int s
37660 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4a 6f  qlite3PagerSetJo
37670 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72 20  urnalMode(Pager 
37680 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f  *pPager, int eMo
37690 64 65 29 7b 0a 20 20 75 38 20 65 4f 6c 64 20 3d  de){.  u8 eOld =
376a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
376b0 4d 6f 64 65 3b 20 20 20 20 2f 2a 20 50 72 69 6f  Mode;    /* Prio
376c0 72 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65 20 2a 2f  r journalmode */
376d0 0a 0a 20 20 2f 2a 20 54 68 65 20 65 4d 6f 64 65  ..  /* The eMode
376e0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 6c   parameter is al
376f0 77 61 79 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20  ways valid */.  
37700 61 73 73 65 72 74 28 20 20 20 20 20 20 65 4d 6f  assert(      eMo
37710 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
37720 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20 20  LMODE_DELETE.   
37730 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
37740 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
37750 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 20 20  MODE_TRUNCATE.  
37760 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
37770 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
37780 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
37790 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
377a0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
377b0 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20  LMODE_OFF .     
377c0 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
377d0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
377e0 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20  DE_WAL .        
377f0 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
37800 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
37810 4d 45 4d 4f 52 59 20 29 3b 0a 0a 20 20 2f 2a 20  MEMORY );..  /* 
37820 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
37830 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d  only called from
37840 20 74 68 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d   the OP_JournalM
37850 6f 64 65 20 6f 70 63 6f 64 65 2c 20 61 6e 64 0a  ode opcode, and.
37860 20 20 2a 2a 20 74 68 65 20 6c 6f 67 69 63 20 74    ** the logic t
37870 68 65 72 65 20 77 69 6c 6c 20 6e 65 76 65 72 20  here will never 
37880 61 6c 6c 6f 77 20 61 20 74 65 6d 70 6f 72 61 72  allow a temporar
37890 79 20 66 69 6c 65 20 74 6f 20 62 65 20 63 68 61  y file to be cha
378a0 6e 67 65 64 0a 20 20 2a 2a 20 74 6f 20 57 41 4c  nged.  ** to WAL
378b0 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   mode..  */.  as
378c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
378d0 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 65 4d 6f  mpFile==0 || eMo
378e0 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
378f0 4c 4d 4f 44 45 5f 57 41 4c 20 29 3b 0a 0a 20 20  LMODE_WAL );..  
37900 2f 2a 20 44 6f 20 61 6c 6c 6f 77 20 74 68 65 20  /* Do allow the 
37910 6a 6f 75 72 6e 61 6c 6d 6f 64 65 20 6f 66 20 61  journalmode of a
37920 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
37930 62 61 73 65 20 74 6f 20 62 65 20 73 65 74 20 74  base to be set t
37940 6f 0a 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20  o.  ** anything 
37950 6f 74 68 65 72 20 74 68 61 6e 20 4d 45 4d 4f 52  other than MEMOR
37960 59 20 6f 72 20 4f 46 46 0a 20 20 2a 2f 0a 20 20  Y or OFF.  */.  
37970 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
37980 20 61 73 73 65 72 74 28 20 65 4f 6c 64 3d 3d 50   assert( eOld==P
37990 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
379a0 5f 4d 45 4d 4f 52 59 20 7c 7c 20 65 4f 6c 64 3d  _MEMORY || eOld=
379b0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
379c0 44 45 5f 4f 46 46 20 29 3b 0a 20 20 20 20 69 66  DE_OFF );.    if
379d0 28 20 65 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  ( eMode!=PAGER_J
379e0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
379f0 59 20 26 26 20 65 4d 6f 64 65 21 3d 50 41 47 45  Y && eMode!=PAGE
37a00 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
37a10 46 20 29 7b 0a 20 20 20 20 20 20 65 4d 6f 64 65  F ){.      eMode
37a20 20 3d 20 65 4f 6c 64 3b 0a 20 20 20 20 7d 0a 20   = eOld;.    }. 
37a30 20 7d 0a 0a 20 20 69 66 28 20 65 4d 6f 64 65 21   }..  if( eMode!
37a40 3d 65 4f 6c 64 20 29 7b 0a 20 20 20 20 2f 2a 20  =eOld ){.    /* 
37a50 57 68 65 6e 20 63 68 61 6e 67 69 6e 67 20 62 65  When changing be
37a60 74 77 65 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d  tween rollback m
37a70 6f 64 65 73 2c 20 63 6c 6f 73 65 20 74 68 65 20  odes, close the 
37a80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 72 69  journal file pri
37a90 6f 72 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  or.    ** to the
37aa0 20 63 68 61 6e 67 65 2e 20 20 42 75 74 20 77 68   change.  But wh
37ab0 65 6e 20 63 68 61 6e 67 69 6e 67 20 66 72 6f 6d  en changing from
37ac0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65   a rollback mode
37ad0 20 74 6f 20 57 41 4c 2c 20 6b 65 65 70 0a 20 20   to WAL, keep.  
37ae0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
37af0 20 6f 70 65 6e 20 73 69 6e 63 65 20 74 68 65 72   open since ther
37b00 65 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 2d  e is a rollback-
37b10 73 74 79 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  style transactio
37b20 6e 20 69 6e 20 70 6c 61 79 0a 20 20 20 20 2a 2a  n in play.    **
37b30 20 75 73 65 64 20 74 6f 20 63 6f 6e 76 65 72 74   used to convert
37b40 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d   the version num
37b50 62 65 72 73 20 69 6e 20 74 68 65 20 62 74 72 65  bers in the btre
37b60 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f  e header..    */
37b70 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28  .    if( isOpen(
37b80 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
37b90 65 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  eMode!=PAGER_JOU
37ba0 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a  RNALMODE_WAL ){.
37bb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
37bc0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
37bd0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
37be0 20 43 68 61 6e 67 65 20 74 68 65 20 6a 6f 75 72   Change the jour
37bf0 6e 61 6c 20 6d 6f 64 65 2e 20 2a 2f 0a 20 20 20  nal mode. */.   
37c00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
37c10 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65  Mode = (u8)eMode
37c20 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74  ;..    /* When t
37c30 72 61 6e 73 69 73 74 69 6f 6e 69 6e 67 20 66 72  ransistioning fr
37c40 6f 6d 20 54 52 55 4e 43 41 54 45 20 6f 72 20 50  om TRUNCATE or P
37c50 45 52 53 49 53 54 20 74 6f 20 61 6e 79 20 6f 74  ERSIST to any ot
37c60 68 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  her journal.    
37c70 2a 2a 20 6d 6f 64 65 20 65 78 63 65 70 74 20 57  ** mode except W
37c80 41 4c 20 28 61 6e 64 20 77 65 20 61 72 65 20 6e  AL (and we are n
37c90 6f 74 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ot in locking_mo
37ca0 64 65 3d 45 58 43 4c 55 53 49 56 45 29 20 74 68  de=EXCLUSIVE) th
37cb0 65 6e 20 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74  en .    ** delet
37cc0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
37cd0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  le..    */.    a
37ce0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
37cf0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
37d00 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  TE & 5)==1 );.  
37d10 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
37d20 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
37d30 53 49 53 54 20 26 20 35 29 3d 3d 31 20 29 3b 0a  SIST & 5)==1 );.
37d40 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
37d50 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
37d60 45 4c 45 54 45 20 26 20 35 29 3d 3d 30 20 29 3b  ELETE & 5)==0 );
37d70 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
37d80 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
37d90 4d 45 4d 4f 52 59 20 26 20 35 29 3d 3d 34 20 29  MEMORY & 5)==4 )
37da0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
37db0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
37dc0 5f 4f 46 46 20 26 20 35 29 3d 3d 30 20 29 3b 0a  _OFF & 5)==0 );.
37dd0 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
37de0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
37df0 41 4c 20 26 20 35 29 3d 3d 35 20 29 3b 0a 0a 20  AL & 5)==5 );.. 
37e00 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
37e10 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
37e20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
37e30 76 65 4d 6f 64 65 20 29 3b 0a 20 20 20 20 69 66  veMode );.    if
37e40 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
37e50 73 69 76 65 4d 6f 64 65 20 26 26 20 28 65 4f 6c  siveMode && (eOl
37e60 64 20 26 20 35 29 3d 3d 31 20 26 26 20 28 65 4d  d & 5)==1 && (eM
37e70 6f 64 65 20 26 20 31 29 3d 3d 30 20 29 7b 0a 0a  ode & 1)==0 ){..
37e80 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73        /* In this
37e90 20 63 61 73 65 20 77 65 20 77 6f 75 6c 64 20 6c   case we would l
37ea0 69 6b 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ike to delete th
37eb0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
37ec0 49 66 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a  If it is.      *
37ed0 2a 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2c 20  * not possible, 
37ee0 74 68 65 6e 20 74 68 61 74 20 69 73 20 6e 6f 74  then that is not
37ef0 20 61 20 70 72 6f 62 6c 65 6d 2e 20 44 65 6c 65   a problem. Dele
37f00 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
37f10 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 68   file.      ** h
37f20 65 72 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ere is an optimi
37f30 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 0a 20 20 20  zation only..   
37f40 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42     **.      ** B
37f50 65 66 6f 72 65 20 64 65 6c 65 74 69 6e 67 20 74  efore deleting t
37f60 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
37f70 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   obtain a RESERV
37f80 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  ED lock on the. 
37f90 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
37fa0 20 66 69 6c 65 2e 20 54 68 69 73 20 65 6e 73 75   file. This ensu
37fb0 72 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75  res that the jou
37fc0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
37fd0 20 64 65 6c 65 74 65 64 0a 20 20 20 20 20 20 2a   deleted.      *
37fe0 2a 20 77 68 69 6c 65 20 69 74 20 69 73 20 69 6e  * while it is in
37ff0 20 75 73 65 20 62 79 20 73 6f 6d 65 20 6f 74 68   use by some oth
38000 65 72 20 63 6c 69 65 6e 74 2e 0a 20 20 20 20 20  er client..     
38010 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 63   */.      int rc
38020 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
38030 20 20 20 20 69 6e 74 20 73 74 61 74 65 20 3d 20      int state = 
38040 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20  pPager->state;. 
38050 20 20 20 20 20 69 66 28 20 73 74 61 74 65 3c 50       if( state<P
38060 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20  AGER_SHARED ){. 
38070 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
38080 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f  te3PagerSharedLo
38090 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
380a0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50    }.      if( pP
380b0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
380c0 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  ER_SHARED ){.   
380d0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
380e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
380f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
38100 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
38110 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  >fd, RESERVED_LO
38120 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
38130 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
38140 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
38150 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
38160 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
38170 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
38180 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
38190 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
381a0 5f 4f 4b 20 26 26 20 73 74 61 74 65 3d 3d 50 41  _OK && state==PA
381b0 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  GER_SHARED ){.  
381c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
381d0 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
381e0 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
381f0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
38200 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
38210 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  OCK ){.        p
38220 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
38230 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
38240 20 20 20 61 73 73 65 72 74 28 20 73 74 61 74 65     assert( state
38250 3d 3d 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  ==pPager->state 
38260 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
38270 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65  /* Return the ne
38280 77 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 2a  w journal mode *
38290 2f 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  /.  return (int)
382a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
382b0 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ode;.}../*.** Re
382c0 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
382d0 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 0a 2a   journal mode..*
382e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
382f0 65 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65  erGetJournalMode
38300 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
38310 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70  .  return (int)p
38320 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
38330 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  de;.}../*.** Ret
38340 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
38350 70 61 67 65 72 20 69 73 20 69 6e 20 61 20 73 74  pager is in a st
38360 61 74 65 20 77 68 65 72 65 20 69 74 20 69 73 20  ate where it is 
38370 4f 4b 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  OK to change the
38380 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65 2e  .** journalmode.
38390 20 20 4a 6f 75 72 6e 61 6c 6d 6f 64 65 20 63 68    Journalmode ch
383a0 61 6e 67 65 73 20 63 61 6e 20 6f 6e 6c 79 20 68  anges can only h
383b0 61 70 70 65 6e 20 77 68 65 6e 20 74 68 65 20 64  appen when the d
383c0 61 74 61 62 61 73 65 0a 2a 2a 20 69 73 20 75 6e  atabase.** is un
383d0 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74  modified..*/.int
383e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 6b 54   sqlite3PagerOkT
383f0 6f 43 68 61 6e 67 65 4a 6f 75 72 6e 61 6c 4d 6f  oChangeJournalMo
38400 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  de(Pager *pPager
38410 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
38420 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 20 72 65  >dbModified ) re
38430 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45  turn 0;.  if( NE
38440 56 45 52 28 69 73 4f 70 65 6e 28 70 50 61 67 65  VER(isOpen(pPage
38450 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65  r->jfd) && pPage
38460 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29  r->journalOff>0)
38470 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
38480 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
38490 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 73 69  * Get/set the si
384a0 7a 65 2d 6c 69 6d 69 74 20 75 73 65 64 20 66 6f  ze-limit used fo
384b0 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  r persistent jou
384c0 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  rnal files..**.*
384d0 2a 20 53 65 74 74 69 6e 67 20 74 68 65 20 73 69  * Setting the si
384e0 7a 65 20 6c 69 6d 69 74 20 74 6f 20 2d 31 20 6d  ze limit to -1 m
384f0 65 61 6e 73 20 6e 6f 20 6c 69 6d 69 74 20 69 73  eans no limit is
38500 20 65 6e 66 6f 72 63 65 64 2e 0a 2a 2a 20 41 6e   enforced..** An
38510 20 61 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   attempt to set 
38520 61 20 6c 69 6d 69 74 20 73 6d 61 6c 6c 65 72 20  a limit smaller 
38530 74 68 61 6e 20 2d 31 20 69 73 20 61 20 6e 6f 2d  than -1 is a no-
38540 6f 70 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74  op..*/.i64 sqlit
38550 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69  e3PagerJournalSi
38560 7a 65 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70  zeLimit(Pager *p
38570 50 61 67 65 72 2c 20 69 36 34 20 69 4c 69 6d 69  Pager, i64 iLimi
38580 74 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74  t){.  if( iLimit
38590 3e 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50 61 67  >=-1 ){.    pPag
385a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
385b0 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b 0a 20  imit = iLimit;. 
385c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67   }.  return pPag
385d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
385e0 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  imit;.}../*.** R
385f0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
38600 74 6f 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70  to the pPager->p
38610 42 61 63 6b 75 70 20 76 61 72 69 61 62 6c 65 2e  Backup variable.
38620 20 54 68 65 20 62 61 63 6b 75 70 20 6d 6f 64 75   The backup modu
38630 6c 65 0a 2a 2a 20 69 6e 20 62 61 63 6b 75 70 2e  le.** in backup.
38640 63 20 6d 61 69 6e 74 61 69 6e 73 20 74 68 65 20  c maintains the 
38650 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20  content of this 
38660 76 61 72 69 61 62 6c 65 2e 20 54 68 69 73 20 6d  variable. This m
38670 6f 64 75 6c 65 0a 2a 2a 20 75 73 65 73 20 69 74  odule.** uses it
38680 20 6f 70 61 71 75 65 6c 79 20 61 73 20 61 6e 20   opaquely as an 
38690 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69  argument to sqli
386a0 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
386b0 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69 74 65  () and.** sqlite
386c0 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 29 20  3BackupUpdate() 
386d0 6f 6e 6c 79 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  only..*/.sqlite3
386e0 5f 62 61 63 6b 75 70 20 2a 2a 73 71 6c 69 74 65  _backup **sqlite
386f0 33 50 61 67 65 72 42 61 63 6b 75 70 50 74 72 28  3PagerBackupPtr(
38700 50 61 67 65 72 20 2a 70 50