SQLite4
Hex Artifact Content
Not logged in

Artifact a571444314c9fa1bd6952505c7dd482a21a3a4f3:


0000: 0a 0a 0a 3c 74 69 74 6c 65 3e 42 54 20 44 65 73  ...<title>BT Des
0010: 69 67 6e 20 4f 76 65 72 76 69 65 77 3c 2f 74 69  ign Overview</ti
0020: 74 6c 65 3e 0a 3c 6e 6f 77 69 6b 69 3e 0a 0a 0a  tle>.<nowiki>...
0030: 0a 0a 0a 0a 0a 0a 0a 0a 0a 0a 0a 0a 0a 0a 0a 3c  ...............<
0040: 64 69 76 20 69 64 3d 73 74 61 72 74 5f 6f 66 5f  div id=start_of_
0050: 74 6f 63 3e 3c 2f 64 69 76 3e 0a 26 6e 62 73 70  toc></div>.&nbsp
0060: 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62  ;&nbsp;&nbsp;&nb
0070: 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 3c  sp;&nbsp;&nbsp;<
0080: 61 20 68 72 65 66 3d 23 6f 76 65 72 76 69 65 77  a href=#overview
0090: 20 73 74 79 6c 65 3d 74 65 78 74 2d 64 65 63 6f   style=text-deco
00a0: 72 61 74 69 6f 6e 3a 6e 6f 6e 65 3e 31 2e 20 4f  ration:none>1. O
00b0: 76 65 72 76 69 65 77 3c 2f 61 3e 3c 62 72 3e 0a  verview</a><br>.
00c0: 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73  &nbsp;&nbsp;&nbs
00d0: 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e  p;&nbsp;&nbsp;&n
00e0: 62 73 70 3b 3c 61 20 68 72 65 66 3d 23 62 2d 74  bsp;<a href=#b-t
00f0: 72 65 65 5f 64 61 74 61 62 61 73 65 5f 6e 6f 74  ree_database_not
0100: 65 73 20 73 74 79 6c 65 3d 74 65 78 74 2d 64 65  es style=text-de
0110: 63 6f 72 61 74 69 6f 6e 3a 6e 6f 6e 65 3e 32 2e  coration:none>2.
0120: 20 42 2d 54 72 65 65 20 44 61 74 61 62 61 73 65   B-Tree Database
0130: 20 4e 6f 74 65 73 3c 2f 61 3e 3c 62 72 3e 0a 26   Notes</a><br>.&
0140: 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70  nbsp;&nbsp;&nbsp
0150: 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62  ;&nbsp;&nbsp;&nb
0160: 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26  sp;&nbsp;&nbsp;&
0170: 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70  nbsp;&nbsp;&nbsp
0180: 3b 26 6e 62 73 70 3b 3c 61 20 68 72 65 66 3d 23  ;&nbsp;<a href=#
0190: 70 61 67 65 72 5f 6c 65 76 65 6c 5f 63 68 61 6e  pager_level_chan
01a0: 67 65 73 20 73 74 79 6c 65 3d 74 65 78 74 2d 64  ges style=text-d
01b0: 65 63 6f 72 61 74 69 6f 6e 3a 6e 6f 6e 65 3e 32  ecoration:none>2
01c0: 2e 31 2e 20 50 61 67 65 72 20 4c 65 76 65 6c 20  .1. Pager Level 
01d0: 63 68 61 6e 67 65 73 3c 2f 61 3e 3c 62 72 3e 0a  changes</a><br>.
01e0: 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73  &nbsp;&nbsp;&nbs
01f0: 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e  p;&nbsp;&nbsp;&n
0200: 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b  bsp;&nbsp;&nbsp;
0210: 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73  &nbsp;&nbsp;&nbs
0220: 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e  p;&nbsp;&nbsp;&n
0230: 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b  bsp;&nbsp;&nbsp;
0240: 26 6e 62 73 70 3b 26 6e 62 73 70 3b 3c 61 20 68  &nbsp;&nbsp;<a h
0250: 72 65 66 3d 23 77 61 6c 5f 66 69 6c 65 5f 66 6f  ref=#wal_file_fo
0260: 72 6d 61 74 5f 63 68 61 6e 67 65 73 20 73 74 79  rmat_changes sty
0270: 6c 65 3d 74 65 78 74 2d 64 65 63 6f 72 61 74 69  le=text-decorati
0280: 6f 6e 3a 6e 6f 6e 65 3e 32 2e 31 2e 31 2e 20 57  on:none>2.1.1. W
0290: 41 4c 20 46 69 6c 65 20 46 6f 72 6d 61 74 20 43  AL File Format C
02a0: 68 61 6e 67 65 73 3c 2f 61 3e 3c 62 72 3e 0a 26  hanges</a><br>.&
02b0: 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70  nbsp;&nbsp;&nbsp
02c0: 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62  ;&nbsp;&nbsp;&nb
02d0: 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26  sp;&nbsp;&nbsp;&
02e0: 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70  nbsp;&nbsp;&nbsp
02f0: 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62  ;&nbsp;&nbsp;&nb
0300: 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26  sp;&nbsp;&nbsp;&
0310: 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70  nbsp;&nbsp;&nbsp
0320: 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62  ;&nbsp;&nbsp;&nb
0330: 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 3c  sp;&nbsp;&nbsp;<
0340: 61 20 68 72 65 66 3d 23 77 61 6c 5f 66 69 6c 65  a href=#wal_file
0350: 5f 77 72 61 70 70 69 6e 67 20 73 74 79 6c 65 3d  _wrapping style=
0360: 74 65 78 74 2d 64 65 63 6f 72 61 74 69 6f 6e 3a  text-decoration:
0370: 6e 6f 6e 65 3e 32 2e 31 2e 31 2e 31 2e 20 57 41  none>2.1.1.1. WA
0380: 4c 20 46 69 6c 65 20 57 72 61 70 70 69 6e 67 3c  L File Wrapping<
0390: 2f 61 3e 3c 62 72 3e 0a 26 6e 62 73 70 3b 26 6e  /a><br>.&nbsp;&n
03a0: 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b  bsp;&nbsp;&nbsp;
03b0: 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73  &nbsp;&nbsp;&nbs
03c0: 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e  p;&nbsp;&nbsp;&n
03d0: 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b  bsp;&nbsp;&nbsp;
03e0: 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73  &nbsp;&nbsp;&nbs
03f0: 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e  p;&nbsp;&nbsp;&n
0400: 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b  bsp;&nbsp;&nbsp;
0410: 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73  &nbsp;&nbsp;&nbs
0420: 70 3b 26 6e 62 73 70 3b 3c 61 20 68 72 65 66 3d  p;&nbsp;<a href=
0430: 23 77 61 6c 5f 66 69 6c 65 5f 68 65 61 64 65 72  #wal_file_header
0440: 73 5f 61 6e 64 5f 72 65 63 6f 76 65 72 79 20 73  s_and_recovery s
0450: 74 79 6c 65 3d 74 65 78 74 2d 64 65 63 6f 72 61  tyle=text-decora
0460: 74 69 6f 6e 3a 6e 6f 6e 65 3e 32 2e 31 2e 31 2e  tion:none>2.1.1.
0470: 32 2e 20 57 41 4c 20 46 69 6c 65 20 48 65 61 64  2. WAL File Head
0480: 65 72 73 20 61 6e 64 20 52 65 63 6f 76 65 72 79  ers and Recovery
0490: 3c 2f 61 3e 3c 62 72 3e 0a 26 6e 62 73 70 3b 26  </a><br>.&nbsp;&
04a0: 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70  nbsp;&nbsp;&nbsp
04b0: 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62  ;&nbsp;&nbsp;&nb
04c0: 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26  sp;&nbsp;&nbsp;&
04d0: 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70  nbsp;&nbsp;&nbsp
04e0: 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62  ;&nbsp;&nbsp;&nb
04f0: 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26  sp;&nbsp;&nbsp;&
0500: 6e 62 73 70 3b 3c 61 20 68 72 65 66 3d 23 73 68  nbsp;<a href=#sh
0510: 6d 5f 66 69 6c 65 5f 66 6f 72 6d 61 74 5f 63 68  m_file_format_ch
0520: 61 6e 67 65 73 20 73 74 79 6c 65 3d 74 65 78 74  anges style=text
0530: 2d 64 65 63 6f 72 61 74 69 6f 6e 3a 6e 6f 6e 65  -decoration:none
0540: 3e 32 2e 31 2e 32 2e 20 53 48 4d 20 46 69 6c 65  >2.1.2. SHM File
0550: 20 46 6f 72 6d 61 74 20 43 68 61 6e 67 65 73 3c   Format Changes<
0560: 2f 61 3e 3c 62 72 3e 0a 26 6e 62 73 70 3b 26 6e  /a><br>.&nbsp;&n
0570: 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b  bsp;&nbsp;&nbsp;
0580: 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73  &nbsp;&nbsp;&nbs
0590: 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e  p;&nbsp;&nbsp;&n
05a0: 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b  bsp;&nbsp;&nbsp;
05b0: 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73  &nbsp;&nbsp;&nbs
05c0: 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e  p;&nbsp;&nbsp;&n
05d0: 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b  bsp;&nbsp;&nbsp;
05e0: 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73  &nbsp;&nbsp;&nbs
05f0: 70 3b 26 6e 62 73 70 3b 3c 61 20 68 72 65 66 3d  p;&nbsp;<a href=
0600: 23 73 68 6d 2d 66 69 6c 65 5f 68 65 61 64 65 72  #shm-file_header
0610: 20 73 74 79 6c 65 3d 74 65 78 74 2d 64 65 63 6f   style=text-deco
0620: 72 61 74 69 6f 6e 3a 6e 6f 6e 65 3e 32 2e 31 2e  ration:none>2.1.
0630: 32 2e 33 2e 20 53 68 6d 2d 66 69 6c 65 20 48 65  2.3. Shm-file He
0640: 61 64 65 72 3c 2f 61 3e 3c 62 72 3e 0a 26 6e 62  ader</a><br>.&nb
0650: 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26  sp;&nbsp;&nbsp;&
0660: 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70  nbsp;&nbsp;&nbsp
0670: 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62  ;&nbsp;&nbsp;&nb
0680: 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26  sp;&nbsp;&nbsp;&
0690: 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70  nbsp;&nbsp;&nbsp
06a0: 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62  ;&nbsp;&nbsp;&nb
06b0: 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26  sp;&nbsp;&nbsp;&
06c0: 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70  nbsp;&nbsp;&nbsp
06d0: 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 3c 61 20  ;&nbsp;&nbsp;<a 
06e0: 68 72 65 66 3d 23 73 68 6d 2d 66 69 6c 65 5f 68  href=#shm-file_h
06f0: 61 73 68 5f 74 61 62 6c 65 73 20 73 74 79 6c 65  ash_tables style
0700: 3d 74 65 78 74 2d 64 65 63 6f 72 61 74 69 6f 6e  =text-decoration
0710: 3a 6e 6f 6e 65 3e 32 2e 31 2e 32 2e 34 2e 20 53  :none>2.1.2.4. S
0720: 68 6d 2d 46 69 6c 65 20 48 61 73 68 20 54 61 62  hm-File Hash Tab
0730: 6c 65 73 3c 2f 61 3e 3c 62 72 3e 0a 26 6e 62 73  les</a><br>.&nbs
0740: 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e  p;&nbsp;&nbsp;&n
0750: 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b  bsp;&nbsp;&nbsp;
0760: 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73  &nbsp;&nbsp;&nbs
0770: 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e  p;&nbsp;&nbsp;&n
0780: 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b  bsp;&nbsp;&nbsp;
0790: 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73  &nbsp;&nbsp;&nbs
07a0: 70 3b 26 6e 62 73 70 3b 3c 61 20 68 72 65 66 3d  p;&nbsp;<a href=
07b0: 23 63 68 61 6e 67 65 73 5f 74 6f 5f 6c 6f 63 6b  #changes_to_lock
07c0: 69 6e 67 20 73 74 79 6c 65 3d 74 65 78 74 2d 64  ing style=text-d
07d0: 65 63 6f 72 61 74 69 6f 6e 3a 6e 6f 6e 65 3e 32  ecoration:none>2
07e0: 2e 31 2e 33 2e 20 43 68 61 6e 67 65 73 20 74 6f  .1.3. Changes to
07f0: 20 4c 6f 63 6b 69 6e 67 3c 2f 61 3e 3c 62 72 3e   Locking</a><br>
0800: 0a 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62  .&nbsp;&nbsp;&nb
0810: 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26  sp;&nbsp;&nbsp;&
0820: 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70  nbsp;&nbsp;&nbsp
0830: 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62  ;&nbsp;&nbsp;&nb
0840: 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26  sp;&nbsp;&nbsp;&
0850: 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70  nbsp;&nbsp;&nbsp
0860: 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62  ;&nbsp;&nbsp;&nb
0870: 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26  sp;&nbsp;&nbsp;&
0880: 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70  nbsp;&nbsp;&nbsp
0890: 3b 3c 61 20 68 72 65 66 3d 23 72 65 61 64 2d 6f  ;<a href=#read-o
08a0: 6e 6c 79 5f 63 6c 69 65 6e 74 73 5f 61 6e 64 5f  nly_clients_and_
08b0: 68 61 6c 74 65 64 5f 64 61 74 61 62 61 73 65 73  halted_databases
08c0: 20 73 74 79 6c 65 3d 74 65 78 74 2d 64 65 63 6f   style=text-deco
08d0: 72 61 74 69 6f 6e 3a 6e 6f 6e 65 3e 32 2e 31 2e  ration:none>2.1.
08e0: 33 2e 35 2e 20 52 65 61 64 2d 6f 6e 6c 79 20 43  3.5. Read-only C
08f0: 6c 69 65 6e 74 73 20 61 6e 64 20 48 61 6c 74 65  lients and Halte
0900: 64 20 44 61 74 61 62 61 73 65 73 3c 2f 61 3e 3c  d Databases</a><
0910: 62 72 3e 0a 26 6e 62 73 70 3b 26 6e 62 73 70 3b  br>.&nbsp;&nbsp;
0920: 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73  &nbsp;&nbsp;&nbs
0930: 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e  p;&nbsp;&nbsp;&n
0940: 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b  bsp;&nbsp;&nbsp;
0950: 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73  &nbsp;&nbsp;&nbs
0960: 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e  p;&nbsp;&nbsp;&n
0970: 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b  bsp;&nbsp;&nbsp;
0980: 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73  &nbsp;&nbsp;&nbs
0990: 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e  p;&nbsp;&nbsp;&n
09a0: 62 73 70 3b 3c 61 20 68 72 65 66 3d 23 72 65 61  bsp;<a href=#rea
09b0: 64 2d 6f 6e 6c 79 5f 63 6c 69 65 6e 74 73 5f 61  d-only_clients_a
09c0: 6e 64 5f 6c 69 76 65 5f 64 61 74 61 62 61 73 65  nd_live_database
09d0: 73 20 73 74 79 6c 65 3d 74 65 78 74 2d 64 65 63  s style=text-dec
09e0: 6f 72 61 74 69 6f 6e 3a 6e 6f 6e 65 3e 32 2e 31  oration:none>2.1
09f0: 2e 33 2e 36 2e 20 52 65 61 64 2d 6f 6e 6c 79 20  .3.6. Read-only 
0a00: 43 6c 69 65 6e 74 73 20 61 6e 64 20 4c 69 76 65  Clients and Live
0a10: 20 44 61 74 61 62 61 73 65 73 3c 2f 61 3e 3c 62   Databases</a><b
0a20: 72 3e 0a 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26  r>.&nbsp;&nbsp;&
0a30: 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70  nbsp;&nbsp;&nbsp
0a40: 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62  ;&nbsp;&nbsp;&nb
0a50: 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26  sp;&nbsp;&nbsp;&
0a60: 6e 62 73 70 3b 26 6e 62 73 70 3b 3c 61 20 68 72  nbsp;&nbsp;<a hr
0a70: 65 66 3d 23 62 2d 74 72 65 65 5f 6c 65 76 65 6c  ef=#b-tree_level
0a80: 5f 63 68 61 6e 67 65 73 20 73 74 79 6c 65 3d 74  _changes style=t
0a90: 65 78 74 2d 64 65 63 6f 72 61 74 69 6f 6e 3a 6e  ext-decoration:n
0aa0: 6f 6e 65 3e 32 2e 32 2e 20 42 2d 54 72 65 65 20  one>2.2. B-Tree 
0ab0: 4c 65 76 65 6c 20 43 68 61 6e 67 65 73 3c 2f 61  Level Changes</a
0ac0: 3e 3c 62 72 3e 0a 26 6e 62 73 70 3b 26 6e 62 73  ><br>.&nbsp;&nbs
0ad0: 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e  p;&nbsp;&nbsp;&n
0ae0: 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b  bsp;&nbsp;&nbsp;
0af0: 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73  &nbsp;&nbsp;&nbs
0b00: 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e  p;&nbsp;&nbsp;&n
0b10: 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b  bsp;&nbsp;&nbsp;
0b20: 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73  &nbsp;&nbsp;&nbs
0b30: 70 3b 3c 61 20 68 72 65 66 3d 23 66 72 65 65 5f  p;<a href=#free_
0b40: 70 61 67 65 5f 6d 61 6e 61 67 65 6d 65 6e 74 20  page_management 
0b50: 73 74 79 6c 65 3d 74 65 78 74 2d 64 65 63 6f 72  style=text-decor
0b60: 61 74 69 6f 6e 3a 6e 6f 6e 65 3e 32 2e 32 2e 31  ation:none>2.2.1
0b70: 2e 20 46 72 65 65 20 50 61 67 65 20 4d 61 6e 61  . Free Page Mana
0b80: 67 65 6d 65 6e 74 3c 2f 61 3e 3c 62 72 3e 0a 26  gement</a><br>.&
0b90: 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70  nbsp;&nbsp;&nbsp
0ba0: 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62  ;&nbsp;&nbsp;&nb
0bb0: 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26  sp;&nbsp;&nbsp;&
0bc0: 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70  nbsp;&nbsp;&nbsp
0bd0: 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62  ;&nbsp;&nbsp;&nb
0be0: 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26  sp;&nbsp;&nbsp;&
0bf0: 6e 62 73 70 3b 26 6e 62 73 70 3b 3c 61 20 68 72  nbsp;&nbsp;<a hr
0c00: 65 66 3d 23 6c 61 72 67 65 5f 72 65 63 6f 72 64  ef=#large_record
0c10: 73 20 73 74 79 6c 65 3d 74 65 78 74 2d 64 65 63  s style=text-dec
0c20: 6f 72 61 74 69 6f 6e 3a 6e 6f 6e 65 3e 32 2e 32  oration:none>2.2
0c30: 2e 32 2e 20 4c 61 72 67 65 20 52 65 63 6f 72 64  .2. Large Record
0c40: 73 3c 2f 61 3e 3c 62 72 3e 0a 26 6e 62 73 70 3b  s</a><br>.&nbsp;
0c50: 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73  &nbsp;&nbsp;&nbs
0c60: 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e  p;&nbsp;&nbsp;&n
0c70: 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b  bsp;&nbsp;&nbsp;
0c80: 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73  &nbsp;&nbsp;&nbs
0c90: 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e  p;&nbsp;&nbsp;&n
0ca0: 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b  bsp;&nbsp;&nbsp;
0cb0: 26 6e 62 73 70 3b 3c 61 20 68 72 65 66 3d 23 62  &nbsp;<a href=#b
0cc0: 2d 74 72 65 65 5f 70 61 67 65 5f 66 6f 72 6d 61  -tree_page_forma
0cd0: 74 20 73 74 79 6c 65 3d 74 65 78 74 2d 64 65 63  t style=text-dec
0ce0: 6f 72 61 74 69 6f 6e 3a 6e 6f 6e 65 3e 32 2e 32  oration:none>2.2
0cf0: 2e 33 2e 20 42 2d 54 72 65 65 20 50 61 67 65 20  .3. B-Tree Page 
0d00: 46 6f 72 6d 61 74 3c 2f 61 3e 3c 62 72 3e 0a 26  Format</a><br>.&
0d10: 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70  nbsp;&nbsp;&nbsp
0d20: 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62  ;&nbsp;&nbsp;&nb
0d30: 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26  sp;&nbsp;&nbsp;&
0d40: 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70  nbsp;&nbsp;&nbsp
0d50: 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62  ;&nbsp;&nbsp;&nb
0d60: 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26  sp;&nbsp;&nbsp;&
0d70: 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70  nbsp;&nbsp;&nbsp
0d80: 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62  ;&nbsp;&nbsp;&nb
0d90: 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 3c  sp;&nbsp;&nbsp;<
0da0: 61 20 68 72 65 66 3d 23 70 61 67 65 5f 66 6f 72  a href=#page_for
0db0: 6d 61 74 73 20 73 74 79 6c 65 3d 74 65 78 74 2d  mats style=text-
0dc0: 64 65 63 6f 72 61 74 69 6f 6e 3a 6e 6f 6e 65 3e  decoration:none>
0dd0: 32 2e 32 2e 33 2e 37 2e 20 50 61 67 65 20 46 6f  2.2.3.7. Page Fo
0de0: 72 6d 61 74 73 3c 2f 61 3e 3c 62 72 3e 0a 26 6e  rmats</a><br>.&n
0df0: 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b  bsp;&nbsp;&nbsp;
0e00: 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73  &nbsp;&nbsp;&nbs
0e10: 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e  p;&nbsp;&nbsp;&n
0e20: 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b  bsp;&nbsp;&nbsp;
0e30: 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73  &nbsp;&nbsp;&nbs
0e40: 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e  p;&nbsp;&nbsp;&n
0e50: 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b  bsp;&nbsp;&nbsp;
0e60: 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73  &nbsp;&nbsp;&nbs
0e70: 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 3c 61  p;&nbsp;&nbsp;<a
0e80: 20 68 72 65 66 3d 23 63 65 6c 6c 5f 66 6f 72 6d   href=#cell_form
0e90: 61 74 73 20 73 74 79 6c 65 3d 74 65 78 74 2d 64  ats style=text-d
0ea0: 65 63 6f 72 61 74 69 6f 6e 3a 6e 6f 6e 65 3e 32  ecoration:none>2
0eb0: 2e 32 2e 33 2e 38 2e 20 43 65 6c 6c 20 46 6f 72  .2.3.8. Cell For
0ec0: 6d 61 74 73 3c 2f 61 3e 3c 62 72 3e 0a 26 6e 62  mats</a><br>.&nb
0ed0: 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26  sp;&nbsp;&nbsp;&
0ee0: 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70  nbsp;&nbsp;&nbsp
0ef0: 3b 3c 61 20 68 72 65 66 3d 23 6d 65 72 67 65 2d  ;<a href=#merge-
0f00: 74 72 65 65 5f 64 61 74 61 62 61 73 65 5f 6e 6f  tree_database_no
0f10: 74 65 73 20 73 74 79 6c 65 3d 74 65 78 74 2d 64  tes style=text-d
0f20: 65 63 6f 72 61 74 69 6f 6e 3a 6e 6f 6e 65 3e 33  ecoration:none>3
0f30: 2e 20 4d 65 72 67 65 2d 54 72 65 65 20 44 61 74  . Merge-Tree Dat
0f40: 61 62 61 73 65 20 4e 6f 74 65 73 3c 2f 61 3e 3c  abase Notes</a><
0f50: 62 72 3e 0a 26 6e 62 73 70 3b 26 6e 62 73 70 3b  br>.&nbsp;&nbsp;
0f60: 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73  &nbsp;&nbsp;&nbs
0f70: 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e  p;&nbsp;&nbsp;&n
0f80: 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b  bsp;&nbsp;&nbsp;
0f90: 26 6e 62 73 70 3b 26 6e 62 73 70 3b 3c 61 20 68  &nbsp;&nbsp;<a h
0fa0: 72 65 66 3d 23 6d 65 72 67 65 2d 74 72 65 65 5f  ref=#merge-tree_
0fb0: 66 6f 72 6d 61 74 20 73 74 79 6c 65 3d 74 65 78  format style=tex
0fc0: 74 2d 64 65 63 6f 72 61 74 69 6f 6e 3a 6e 6f 6e  t-decoration:non
0fd0: 65 3e 33 2e 31 2e 20 4d 65 72 67 65 2d 54 72 65  e>3.1. Merge-Tre
0fe0: 65 20 46 6f 72 6d 61 74 3c 2f 61 3e 3c 62 72 3e  e Format</a><br>
0ff0: 0a 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62  .&nbsp;&nbsp;&nb
1000: 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26  sp;&nbsp;&nbsp;&
1010: 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70  nbsp;&nbsp;&nbsp
1020: 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62  ;&nbsp;&nbsp;&nb
1030: 73 70 3b 26 6e 62 73 70 3b 3c 61 20 68 72 65 66  sp;&nbsp;<a href
1040: 3d 23 69 6e 2d 6d 65 6d 6f 72 79 5f 74 72 65 65  =#in-memory_tree
1050: 20 73 74 79 6c 65 3d 74 65 78 74 2d 64 65 63 6f   style=text-deco
1060: 72 61 74 69 6f 6e 3a 6e 6f 6e 65 3e 33 2e 32 2e  ration:none>3.2.
1070: 20 49 6e 2d 4d 65 6d 6f 72 79 20 54 72 65 65 3c   In-Memory Tree<
1080: 2f 61 3e 3c 62 72 3e 0a 26 6e 62 73 70 3b 26 6e  /a><br>.&nbsp;&n
1090: 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b  bsp;&nbsp;&nbsp;
10a0: 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73  &nbsp;&nbsp;&nbs
10b0: 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e  p;&nbsp;&nbsp;&n
10c0: 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b  bsp;&nbsp;&nbsp;
10d0: 3c 61 20 68 72 65 66 3d 23 75 73 65 5f 6f 66 5f  <a href=#use_of_
10e0: 61 5f 62 61 63 6b 67 72 6f 75 6e 64 5f 74 68 72  a_background_thr
10f0: 65 61 64 5f 6f 72 5f 70 72 6f 63 65 73 73 20 73  ead_or_process s
1100: 74 79 6c 65 3d 74 65 78 74 2d 64 65 63 6f 72 61  tyle=text-decora
1110: 74 69 6f 6e 3a 6e 6f 6e 65 3e 33 2e 33 2e 20 55  tion:none>3.3. U
1120: 73 65 20 6f 66 20 61 20 42 61 63 6b 67 72 6f 75  se of a Backgrou
1130: 6e 64 20 54 68 72 65 61 64 20 6f 72 20 50 72 6f  nd Thread or Pro
1140: 63 65 73 73 3c 2f 61 3e 3c 62 72 3e 0a 26 6e 62  cess</a><br>.&nb
1150: 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26  sp;&nbsp;&nbsp;&
1160: 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70  nbsp;&nbsp;&nbsp
1170: 3b 3c 61 20 68 72 65 66 3d 23 64 65 73 69 67 6e  ;<a href=#design
1180: 5f 73 75 6d 6d 61 72 79 20 73 74 79 6c 65 3d 74  _summary style=t
1190: 65 78 74 2d 64 65 63 6f 72 61 74 69 6f 6e 3a 6e  ext-decoration:n
11a0: 6f 6e 65 3e 34 2e 20 44 65 73 69 67 6e 20 53 75  one>4. Design Su
11b0: 6d 6d 61 72 79 3c 2f 61 3e 3c 62 72 3e 0a 26 6e  mmary</a><br>.&n
11c0: 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b  bsp;&nbsp;&nbsp;
11d0: 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73  &nbsp;&nbsp;&nbs
11e0: 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26 6e  p;&nbsp;&nbsp;&n
11f0: 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b  bsp;&nbsp;&nbsp;
1200: 26 6e 62 73 70 3b 3c 61 20 68 72 65 66 3d 23 6c  &nbsp;<a href=#l
1210: 6f 63 6b 69 6e 67 20 73 74 79 6c 65 3d 74 65 78  ocking style=tex
1220: 74 2d 64 65 63 6f 72 61 74 69 6f 6e 3a 6e 6f 6e  t-decoration:non
1230: 65 3e 34 2e 31 2e 20 4c 6f 63 6b 69 6e 67 3c 2f  e>4.1. Locking</
1240: 61 3e 3c 62 72 3e 0a 0a 3c 64 69 76 20 69 64 3d  a><br>..<div id=
1250: 65 6e 64 5f 6f 66 5f 74 6f 63 3e 3c 2f 64 69 76  end_of_toc></div
1260: 3e 0a 0a 3c 68 31 20 69 64 3d 6f 76 65 72 76 69  >..<h1 id=overvi
1270: 65 77 3e 31 2e 20 4f 76 65 72 76 69 65 77 3c 2f  ew>1. Overview</
1280: 68 31 3e 0a 0a 3c 70 3e 0a 20 20 54 68 69 73 20  h1>..<p>.  This 
1290: 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
12a0: 20 65 78 74 65 6e 64 20 61 20 62 2d 74 72 65 65   extend a b-tree
12b0: 20 64 65 73 69 67 6e 20 73 69 6d 69 6c 61 72 20   design similar 
12c0: 74 6f 20 53 51 4c 69 74 65 33 20 77 61 6c 20 0a  to SQLite3 wal .
12d0: 20 20 6d 6f 64 65 20 77 69 74 68 20 74 68 65 20    mode with the 
12e0: 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74  following object
12f0: 69 76 65 73 3a 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c  ives:..<ol>.  <l
1300: 69 3e 3c 70 3e 54 6f 20 73 75 70 70 6f 72 74 20  i><p>To support 
1310: 66 61 73 74 20 22 62 6c 69 6e 64 20 77 72 69 74  fast "blind writ
1320: 65 73 22 2c 20 73 69 6d 69 6c 61 72 20 74 6f 20  es", similar to 
1330: 4c 53 4d 20 6f 72 20 46 54 53 34 2e 20 54 68 65  LSM or FTS4. The
1340: 20 75 73 65 72 0a 20 20 73 68 6f 75 6c 64 20 62   user.  should b
1350: 65 20 61 62 6c 65 20 74 6f 20 73 65 6c 65 63 74  e able to select
1360: 20 6f 6e 20 61 20 70 65 72 2d 77 72 69 74 65 20   on a per-write 
1370: 62 61 73 69 73 20 77 68 65 74 68 65 72 20 61 20  basis whether a 
1380: 62 6c 69 6e 64 20 77 72 69 74 65 20 6f 72 20 61  blind write or a
1390: 0a 20 20 74 72 61 64 69 74 69 6f 6e 61 6c 20 62  .  traditional b
13a0: 2d 74 72 65 65 20 77 72 69 74 65 20 69 73 20 75  -tree write is u
13b0: 73 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68  sed to update th
13c0: 65 20 64 61 74 61 62 61 73 65 2e 20 49 6e 20 53  e database. In S
13d0: 51 4c 69 74 65 34 2c 20 74 68 69 73 0a 20 20 6d  QLite4, this.  m
13e0: 69 67 68 74 20 62 65 20 75 73 65 64 20 61 73 20  ight be used as 
13f0: 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 3c 75 6c  follows:.    <ul
1400: 3e 0a 20 20 20 20 20 20 3c 6c 69 3e 3c 70 3e 54  >.      <li><p>T
1410: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  he primary key i
1420: 6e 64 65 78 20 6f 66 20 74 61 62 6c 65 73 20 63  ndex of tables c
1430: 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
1440: 75 73 69 6e 67 20 62 2d 74 72 65 65 0a 20 20 20  using b-tree.   
1450: 20 20 20 77 72 69 74 65 73 20 77 68 69 6c 65 20     writes while 
1460: 61 6e 20 46 54 53 20 28 6f 72 20 6f 74 68 65 72  an FTS (or other
1470: 29 20 69 6e 64 65 78 20 61 74 74 61 63 68 65 64  ) index attached
1480: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62   to the same tab
1490: 6c 65 20 75 73 65 73 0a 20 20 20 20 20 20 62 6c  le uses.      bl
14a0: 69 6e 64 20 77 72 69 74 65 73 2e 0a 0a 20 20 20  ind writes...   
14b0: 20 20 20 3c 6c 69 3e 3c 70 3e 41 20 64 61 74 61     <li><p>A data
14c0: 62 61 73 65 20 75 73 65 64 20 62 79 20 61 6e 20  base used by an 
14d0: 69 6e 64 65 78 65 64 64 62 20 69 6d 70 6c 65 6d  indexeddb implem
14e0: 65 6e 74 61 74 69 6f 6e 20 6d 69 67 68 74 20 77  entation might w
14f0: 72 69 74 65 20 61 6c 6c 0a 20 20 20 20 20 20 64  rite all.      d
1500: 61 74 61 20 75 73 69 6e 67 20 62 6c 69 6e 64 20  ata using blind 
1510: 77 72 69 74 65 73 2e 0a 20 20 20 20 3c 2f 75 6c  writes..    </ul
1520: 3e 0a 0a 20 20 3c 6c 69 3e 3c 70 3e 54 6f 20 62  >..  <li><p>To b
1530: 65 74 74 65 72 20 73 75 70 70 6f 72 74 20 64 65  etter support de
1540: 66 65 72 72 69 6e 67 20 77 6f 72 6b 20 69 6e 76  ferring work inv
1550: 6f 6c 76 65 64 20 69 6e 20 77 72 69 74 69 6e 67  olved in writing
1560: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1570: 0a 20 20 74 6f 20 61 20 62 61 63 6b 67 72 6f 75  .  to a backgrou
1580: 6e 64 20 74 68 72 65 61 64 20 6f 72 20 70 72 6f  nd thread or pro
1590: 63 65 73 73 2e 20 0a 0a 20 20 3c 70 3e 49 6e 20  cess. ..  <p>In 
15a0: 53 51 4c 69 74 65 2c 20 69 74 20 69 73 20 70 6f  SQLite, it is po
15b0: 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 74 68 69  ssible to do thi
15c0: 73 20 62 79 20 74 75 72 6e 69 6e 67 20 6f 66 66  s by turning off
15d0: 20 61 75 74 6f 2d 63 68 65 63 6b 70 6f 69 6e 74   auto-checkpoint
15e0: 0a 20 20 61 6e 64 20 75 73 69 6e 67 20 61 20 62  .  and using a b
15f0: 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65 61 64  ackground thread
1600: 20 6f 72 20 70 72 6f 63 65 73 73 20 74 6f 20 72   or process to r
1610: 75 6e 20 70 65 72 69 6f 64 69 63 20 63 68 65 63  un periodic chec
1620: 6b 70 6f 69 6e 74 73 0a 20 20 6f 6e 20 61 20 64  kpoints.  on a d
1630: 61 74 61 62 61 73 65 2e 20 54 68 65 20 6d 61 69  atabase. The mai
1640: 6e 20 70 72 6f 62 6c 65 6d 20 77 69 74 68 20 74  n problem with t
1650: 68 69 73 20 69 73 20 74 68 61 74 20 69 66 20 74  his is that if t
1660: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 75  he database is u
1670: 6e 64 65 72 0a 20 20 6c 6f 61 64 20 74 68 65 20  nder.  load the 
1680: 57 41 4c 20 66 69 6c 65 20 6d 61 79 20 67 72 6f  WAL file may gro
1690: 77 20 69 6e 64 65 66 69 6e 69 74 65 6c 79 2e 20  w indefinitely. 
16a0: 41 64 64 72 65 73 73 69 6e 67 20 74 68 69 73 20  Addressing this 
16b0: 77 6f 75 6c 64 20 6e 6f 74 20 6d 61 6b 65 20 0a  would not make .
16c0: 20 20 77 72 69 74 65 72 20 74 68 72 65 61 64 73    writer threads
16d0: 20 61 73 20 72 65 73 70 6f 6e 73 69 76 65 20 61   as responsive a
16e0: 73 20 74 68 65 79 20 63 61 6e 20 62 65 20 77 69  s they can be wi
16f0: 74 68 20 4c 53 4d 20 6f 72 20 4c 65 76 65 6c 44  th LSM or LevelD
1700: 42 2c 20 62 75 74 20 77 6f 75 6c 64 20 0a 20 20  B, but would .  
1710: 69 6d 70 72 6f 76 65 20 74 68 69 6e 67 73 20 77  improve things w
1720: 69 74 68 6f 75 74 20 73 61 63 72 69 66 69 63 69  ithout sacrifici
1730: 6e 67 20 44 41 4d 20 6f 70 74 69 6d 61 6c 20 73  ng DAM optimal s
1740: 65 65 6b 20 71 75 65 72 69 65 73 2e 0a 0a 20 20  eek queries...  
1750: 3c 6c 69 3e 3c 70 3e 54 6f 20 73 75 70 70 6f 72  <li><p>To suppor
1760: 74 20 72 65 61 64 2d 6f 6e 6c 79 20 63 6c 69 65  t read-only clie
1770: 6e 74 73 2e 20 41 20 72 65 61 64 2d 6f 6e 6c 79  nts. A read-only
1780: 20 63 6c 69 65 6e 74 20 6d 61 79 20 6e 6f 74 20   client may not 
1790: 63 72 65 61 74 65 20 66 69 6c 65 73 0a 20 20 6f  create files.  o
17a0: 72 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  r shared-memory 
17b0: 72 65 67 69 6f 6e 73 2c 20 77 72 69 74 65 20 74  regions, write t
17c0: 6f 20 74 68 65 20 73 61 6d 65 2c 20 6f 72 20 74  o the same, or t
17d0: 61 6b 65 20 61 6e 79 20 45 58 43 4c 55 53 49 56  ake any EXCLUSIV
17e0: 45 20 6c 6f 63 6b 73 2e 0a 3c 2f 6f 6c 3e 0a 0a  E locks..</ol>..
17f0: 3c 68 31 20 69 64 3d 62 2d 74 72 65 65 5f 64 61  <h1 id=b-tree_da
1800: 74 61 62 61 73 65 5f 6e 6f 74 65 73 3e 32 2e 20  tabase_notes>2. 
1810: 42 2d 54 72 65 65 20 44 61 74 61 62 61 73 65 20  B-Tree Database 
1820: 4e 6f 74 65 73 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a  Notes</h1>..<p>.
1830: 20 20 54 68 65 20 62 2d 74 72 65 65 20 64 61 74    The b-tree dat
1840: 61 62 61 73 65 20 69 73 20 73 69 6d 69 6c 61 72  abase is similar
1850: 20 74 6f 20 53 51 4c 69 74 65 20 69 6e 20 57 41   to SQLite in WA
1860: 4c 20 6d 6f 64 65 2e 20 49 6e 20 74 68 65 20 73  L mode. In the s
1870: 65 6e 73 65 20 74 68 61 74 3a 0a 0a 3c 75 6c 3e  ense that:..<ul>
1880: 0a 20 20 3c 6c 69 3e 3c 70 3e 20 41 6c 6c 20 64  .  <li><p> All d
1890: 61 74 61 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ata is stored in
18a0: 20 61 20 62 2d 74 72 65 65 20 73 74 72 75 63 74   a b-tree struct
18b0: 75 72 65 20 77 69 74 68 20 66 69 78 65 64 20 73  ure with fixed s
18c0: 69 7a 65 20 70 61 67 65 73 2e 0a 20 20 20 20 20  ize pages..     
18d0: 20 20 4c 61 72 67 65 20 72 65 63 6f 72 64 73 20    Large records 
18e0: 61 72 65 20 73 74 6f 72 65 64 20 75 73 69 6e 67  are stored using
18f0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
1900: 0a 0a 20 20 3c 6c 69 3e 3c 70 3e 20 41 20 70 68  ..  <li><p> A ph
1910: 79 73 69 63 61 6c 20 6c 6f 67 20 66 69 6c 65 20  ysical log file 
1920: 73 69 6d 69 6c 61 72 20 74 6f 20 53 51 4c 69 74  similar to SQLit
1930: 65 27 73 20 57 41 4c 20 66 69 6c 65 20 69 73 20  e's WAL file is 
1940: 75 73 65 64 2e 20 54 68 69 73 0a 20 20 20 20 20  used. This.     
1950: 20 20 70 72 6f 76 69 64 65 73 20 73 69 6e 67 6c    provides singl
1960: 65 2d 77 72 69 74 65 72 2f 6d 75 6c 74 69 70 6c  e-writer/multipl
1970: 65 2d 72 65 61 64 65 72 20 4d 56 43 43 2e 0a 0a  e-reader MVCC...
1980: 20 20 3c 6c 69 3e 3c 70 3e 20 41 20 74 65 6d 70    <li><p> A temp
1990: 6f 72 61 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6c  orary rollback l
19a0: 6f 67 20 66 69 6c 65 20 74 6f 20 73 75 70 70 6f  og file to suppo
19b0: 72 74 20 6e 65 73 74 65 64 20 74 72 61 6e 73 61  rt nested transa
19c0: 63 74 69 6f 6e 73 2e 0a 0a 20 20 3c 6c 69 3e 3c  ctions...  <li><
19d0: 70 3e 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20  p> A checkpoint 
19e0: 6f 70 65 72 61 74 69 6f 6e 20 63 6f 70 69 65 73  operation copies
19f0: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 70   data from the p
1a00: 68 79 73 69 63 61 6c 20 6c 6f 67 20 66 69 6c 65  hysical log file
1a10: 20 69 6e 74 6f 0a 20 20 20 20 20 20 20 74 68 65   into.       the
1a20: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1a30: 74 73 65 6c 66 2e 20 43 68 65 63 6b 70 6f 69 6e  tself. Checkpoin
1a40: 74 73 20 6d 61 79 20 70 72 6f 63 65 65 64 20 63  ts may proceed c
1a50: 6f 6e 63 75 72 72 65 6e 74 6c 79 20 77 69 74 68  oncurrently with
1a60: 0a 20 20 20 20 20 20 20 61 20 73 69 6e 67 6c 65  .       a single
1a70: 20 77 72 69 74 65 72 20 61 6e 64 20 61 6e 79 20   writer and any 
1a80: 6e 75 6d 62 65 72 20 6f 66 20 72 65 61 64 65 72  number of reader
1a90: 73 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20 20  s..</ul>..<p>.  
1aa0: 54 68 65 20 6e 6f 74 65 73 20 62 65 6c 6f 77 20  The notes below 
1ab0: 61 72 65 20 64 69 76 69 64 65 64 20 69 6e 74 6f  are divided into
1ac0: 20 74 77 6f 20 73 65 63 74 69 6f 6e 73 20 2d 20   two sections - 
1ad0: 74 68 65 20 66 69 72 73 74 20 64 65 73 63 72 69  the first descri
1ae0: 62 69 6e 67 20 61 0a 20 20 57 41 4c 20 70 61 67  bing a.  WAL pag
1af0: 65 72 20 6d 6f 64 75 6c 65 20 74 68 61 74 20 73  er module that s
1b00: 75 70 70 6f 72 74 73 20 74 68 65 20 63 69 72 63  upports the circ
1b10: 75 6c 61 72 20 6c 6f 67 20 66 69 6c 65 2c 20 61  ular log file, a
1b20: 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 20  nd the second . 
1b30: 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20   describing the 
1b40: 62 2d 74 72 65 65 20 63 72 65 61 74 65 64 20 6f  b-tree created o
1b50: 6e 20 74 6f 70 20 6f 66 20 69 74 2e 0a 0a 3c 68  n top of it...<h
1b60: 32 20 69 64 3d 70 61 67 65 72 5f 6c 65 76 65 6c  2 id=pager_level
1b70: 5f 63 68 61 6e 67 65 73 3e 32 2e 31 2e 20 50 61  _changes>2.1. Pa
1b80: 67 65 72 20 4c 65 76 65 6c 20 63 68 61 6e 67 65  ger Level change
1b90: 73 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 54 6f  s</h2>..<p>.  To
1ba0: 20 73 75 70 70 6f 72 74 20 74 68 65 20 63 69 72   support the cir
1bb0: 63 75 6c 61 72 20 6c 6f 67 20 63 6f 6e 63 65 70  cular log concep
1bc0: 74 2c 20 74 68 65 20 66 6f 72 6d 61 74 20 6f 66  t, the format of
1bd0: 20 74 68 65 20 77 61 6c 20 61 6e 64 20 73 68 6d   the wal and shm
1be0: 20 66 69 6c 65 73 20 0a 20 20 61 72 65 20 73 6c   files .  are sl
1bf0: 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74  ightly different
1c00: 2e 20 44 65 73 63 72 69 62 65 64 20 62 65 6c 6f  . Described belo
1c10: 77 2e 0a 0a 3c 68 33 20 69 64 3d 77 61 6c 5f 66  w...<h3 id=wal_f
1c20: 69 6c 65 5f 66 6f 72 6d 61 74 5f 63 68 61 6e 67  ile_format_chang
1c30: 65 73 3e 32 2e 31 2e 31 2e 20 57 41 4c 20 46 69  es>2.1.1. WAL Fi
1c40: 6c 65 20 46 6f 72 6d 61 74 20 43 68 61 6e 67 65  le Format Change
1c50: 73 3c 2f 68 33 3e 0a 0a 3c 70 3e 20 54 77 6f 20  s</h3>..<p> Two 
1c60: 68 65 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 74  header blocks at
1c70: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
1c80: 65 20 66 69 6c 65 2e 20 45 61 63 68 20 6f 63 63  e file. Each occ
1c90: 75 70 79 69 6e 67 20 61 6e 20 65 6e 74 69 72 65  upying an entire
1ca0: 0a 20 20 20 20 64 69 73 6b 20 73 65 63 74 6f 72  .    disk sector
1cb0: 2e 0a 0a 3c 70 3e 20 54 68 65 20 72 65 6d 61 69  ...<p> The remai
1cc0: 6e 64 65 72 20 6f 66 20 74 68 65 20 66 69 6c 65  nder of the file
1cd0: 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 22 66   divided into "f
1ce0: 72 61 6d 65 73 22 2c 20 6a 75 73 74 20 61 73 20  rames", just as 
1cf0: 74 68 65 20 53 51 4c 69 74 65 20 57 41 4c 0a 66  the SQLite WAL.f
1d00: 69 6c 65 20 69 73 2e 20 4d 6f 73 74 20 76 61 6c  ile is. Most val
1d10: 69 64 20 66 72 61 6d 65 73 20 63 6f 6e 74 61 69  id frames contai
1d20: 6e 20 6e 65 77 20 76 65 72 73 69 6f 6e 73 20 6f  n new versions o
1d30: 66 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73  f database pages
1d40: 2c 20 6a 75 73 74 0a 61 73 20 69 6e 20 53 51 4c  , just.as in SQL
1d50: 69 74 65 2e 20 48 6f 77 65 76 65 72 2c 20 61 20  ite. However, a 
1d60: 66 72 61 6d 65 20 6d 61 79 20 61 6c 73 6f 20 62  frame may also b
1d70: 65 20 61 20 22 70 6f 69 6e 74 65 72 20 66 72 61  e a "pointer fra
1d80: 6d 65 22 20 2d 20 61 20 66 72 61 6d 65 20 74 68  me" - a frame th
1d90: 61 74 0a 65 78 69 73 74 73 20 73 6f 6c 65 6c 79  at.exists solely
1da0: 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65   to indicate the
1db0: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
1dc0: 20 6e 65 78 74 20 66 72 61 6d 65 20 69 6e 20 74   next frame in t
1dd0: 68 65 20 6c 6f 67 2e 0a 0a 3c 68 34 20 69 64 3d  he log...<h4 id=
1de0: 77 61 6c 5f 66 69 6c 65 5f 77 72 61 70 70 69 6e  wal_file_wrappin
1df0: 67 3e 32 2e 31 2e 31 2e 31 2e 20 57 41 4c 20 46  g>2.1.1.1. WAL F
1e00: 69 6c 65 20 57 72 61 70 70 69 6e 67 3c 2f 68 34  ile Wrapping</h4
1e10: 3e 0a 0a 3c 70 3e 20 4c 6f 67 69 63 61 6c 6c 79  >..<p> Logically
1e20: 2c 20 74 68 65 20 6c 6f 67 20 61 6c 77 61 79 73  , the log always
1e30: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 72   consists of thr
1e40: 65 65 20 72 65 67 69 6f 6e 73 20 28 63 6f 6e 74  ee regions (cont
1e50: 69 67 75 6f 75 73 20 72 75 6e 73 20 6f 66 0a 20  iguous runs of. 
1e60: 20 20 20 66 72 61 6d 65 73 20 77 69 74 68 69 6e     frames within
1e70: 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 66 69   the physical fi
1e80: 6c 65 29 2c 20 72 65 67 69 6f 6e 20 41 2c 20 72  le), region A, r
1e90: 65 67 69 6f 6e 20 42 20 61 6e 64 20 72 65 67 69  egion B and regi
1ea0: 6f 6e 20 43 2e 20 57 68 65 6e 0a 20 20 20 20 74  on C. When.    t
1eb0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  he contents of a
1ec0: 20 6c 6f 67 20 61 72 65 20 72 65 63 6f 76 65 72   log are recover
1ed0: 65 64 2c 20 72 65 67 69 6f 6e 73 20 61 72 65 20  ed, regions are 
1ee0: 72 65 61 64 20 69 6e 20 74 68 61 74 20 6f 72 64  read in that ord
1ef0: 65 72 20 28 41 2c 0a 20 20 20 20 74 68 65 6e 20  er (A,.    then 
1f00: 42 2c 20 74 68 65 6e 20 43 29 2e 20 4e 65 77 20  B, then C). New 
1f10: 66 72 61 6d 65 73 20 61 72 65 20 61 6c 77 61 79  frames are alway
1f20: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
1f30: 65 20 65 6e 64 20 6f 66 20 72 65 67 69 6f 6e 20  e end of region 
1f40: 43 2e 0a 0a 3c 70 72 65 3e 0a 20 20 20 20 7c 2d  C...<pre>.    |-
1f50: 2d 2d 42 2d 2d 2d 7c 2e 2e 7c 2d 2d 2d 41 2d 2d  --B---|..|---A--
1f60: 2d 7c 7c 2d 2d 2d 43 2d 2d 2d 7c 2e 2e 2e 2e 2e  -||---C---|.....
1f70: 2e 0a 3c 2f 70 72 65 3e 0a 0a 3c 70 3e 20 49 6e  ..</pre>..<p> In
1f80: 69 74 69 61 6c 6c 79 2c 20 74 68 65 20 6c 6f 67  itially, the log
1f90: 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 2e 20   file is empty. 
1fa0: 41 6c 6c 20 74 68 72 65 65 20 72 65 67 69 6f 6e  All three region
1fb0: 73 20 61 72 65 20 7a 65 72 6f 20 66 72 61 6d 65  s are zero frame
1fc0: 73 20 69 6e 20 0a 73 69 7a 65 2e 20 41 6c 6c 20  s in .size. All 
1fd0: 74 68 72 65 65 20 61 72 65 20 6c 6f 63 61 74 65  three are locate
1fe0: 64 20 61 74 20 74 68 65 20 76 65 72 79 20 73 74  d at the very st
1ff0: 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 67 20 66  art of the log f
2000: 69 6c 65 2e 20 41 73 20 66 72 61 6d 65 73 20 61  ile. As frames a
2010: 72 65 0a 61 70 70 65 6e 64 65 64 20 74 6f 20 74  re.appended to t
2020: 68 65 20 6c 6f 67 2c 20 72 65 67 69 6f 6e 20 43  he log, region C
2030: 20 67 72 6f 77 73 2c 20 67 69 76 69 6e 67 3a 0a   grows, giving:.
2040: 0a 3c 70 72 65 3e 0a 20 20 20 20 31 29 20 20 20  .<pre>.    1)   
2050: 20 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    |-------------
2060: 2d 2d 43 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --C-------------
2070: 2d 2d 7c 2e 2e 2e 2e 0a 3c 2f 70 72 65 3e 0a 0a  --|.....</pre>..
2080: 3c 70 3e 20 49 66 20 61 20 63 68 65 63 6b 70 6f  <p> If a checkpo
2090: 69 6e 74 20 69 73 20 70 65 72 66 6f 72 6d 65 64  int is performed
20a0: 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
20b0: 69 74 20 72 65 64 75 63 65 73 20 74 68 65 20 73  it reduces the s
20c0: 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 0a 20 20  ize of region.  
20d0: 20 20 43 2c 20 74 6f 20 28 73 61 79 29 3a 0a 0a    C, to (say):..
20e0: 3c 70 72 65 3e 0a 20 20 20 20 32 29 20 20 20 20  <pre>.    2)    
20f0: 20 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e   ...............
2100: 2e 2e 2e 2e 2e 7c 2d 2d 2d 2d 2d 43 2d 2d 2d 2d  .....|-----C----
2110: 2d 7c 2e 2e 2e 2e 0a 3c 2f 70 72 65 3e 0a 0a 3c  -|.....</pre>..<
2120: 70 3e 20 4f 6e 63 65 20 74 68 65 72 65 20 69 73  p> Once there is
2130: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
2140: 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 73 74  e between the st
2150: 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 67 20 66  art of the log f
2160: 69 6c 65 20 61 6e 64 20 74 68 65 0a 20 20 20 20  ile and the.    
2170: 73 74 61 72 74 20 6f 66 20 72 65 67 69 6f 6e 20  start of region 
2180: 43 2c 20 72 65 67 69 6f 6e 20 43 20 69 73 20 72  C, region C is r
2190: 65 6e 61 6d 65 64 20 74 6f 20 72 65 67 69 6f 6e  enamed to region
21a0: 20 41 20 61 6e 64 20 61 20 6e 65 77 20 72 65 67   A and a new reg
21b0: 69 6f 6e 20 43 0a 20 20 20 20 63 72 65 61 74 65  ion C.    create
21c0: 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
21d0: 66 20 74 68 65 20 66 69 6c 65 3a 0a 0a 3c 70 72  f the file:..<pr
21e0: 65 3e 0a 20 20 20 20 33 29 20 20 20 20 20 7c 2d  e>.    3)     |-
21f0: 2d 2d 43 2d 2d 2d 7c 2e 2e 2e 2e 2e 2e 2e 2e 2e  --C---|.........
2200: 2e 2e 7c 2d 2d 2d 2d 2d 41 2d 2d 2d 2d 2d 7c 2e  ..|-----A-----|.
2210: 2e 2e 2e 0a 3c 2f 70 72 65 3e 0a 0a 3c 70 3e 20  ....</pre>..<p> 
2220: 55 73 75 61 6c 6c 79 2c 20 6f 72 20 61 74 20 6c  Usually, or at l
2230: 65 61 73 74 20 68 6f 70 65 66 75 6c 6c 79 2c 20  east hopefully, 
2240: 63 68 65 63 6b 70 6f 69 6e 74 73 20 77 69 6c 6c  checkpoints will
2250: 20 72 65 64 75 63 65 20 74 68 65 20 73 69 7a 65   reduce the size
2260: 20 6f 66 20 0a 72 65 67 69 6f 6e 20 41 20 74 6f   of .region A to
2270: 20 7a 65 72 6f 20 62 65 66 6f 72 65 20 43 20 67   zero before C g
2280: 72 6f 77 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  rows large enoug
2290: 68 20 74 6f 20 6d 65 65 74 20 74 68 65 20 73 74  h to meet the st
22a0: 61 72 74 20 6f 66 20 41 2c 0a 6c 65 61 76 69 6e  art of A,.leavin
22b0: 67 20 74 68 65 20 73 79 73 74 65 6d 20 62 61 63  g the system bac
22c0: 6b 20 69 6e 20 73 74 61 74 65 20 28 31 29 2e 20  k in state (1). 
22d0: 42 75 74 2c 20 69 66 20 69 74 20 64 6f 65 73 6e  But, if it doesn
22e0: 27 74 2c 20 72 65 67 69 6f 6e 20 43 20 69 73 20  't, region C is 
22f0: 0a 72 65 6e 61 6d 65 64 20 42 20 61 6e 64 20 61  .renamed B and a
2300: 20 6e 65 77 20 43 20 62 65 67 69 6e 73 20 69 6d   new C begins im
2310: 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
2320: 69 6e 67 20 41 3a 0a 0a 3c 70 72 65 3e 0a 20 20  ing A:..<pre>.  
2330: 20 20 34 29 20 20 20 20 20 7c 2d 2d 2d 2d 2d 2d    4)     |------
2340: 2d 2d 42 2d 2d 2d 2d 2d 2d 2d 2d 2d 7c 7c 2d 2d  --B---------||--
2350: 2d 2d 2d 41 2d 2d 2d 2d 2d 7c 7c 2d 2d 2d 43 2d  ---A-----||---C-
2360: 2d 2d 7c 2e 2e 2e 0a 3c 2f 70 72 65 3e 0a 0a 3c  --|....</pre>..<
2370: 70 3e 20 4f 6e 63 65 20 69 6e 20 74 68 69 73 20  p> Once in this 
2380: 73 74 61 74 65 20 6e 65 77 20 66 72 61 6d 65 73  state new frames
2390: 20 61 72 65 20 61 70 70 65 6e 64 65 64 20 74 6f   are appended to
23a0: 20 72 65 67 69 6f 6e 20 43 20 75 6e 74 69 6c 20   region C until 
23b0: 61 6c 6c 20 64 61 74 61 0a 69 6e 20 62 6f 74 68  all data.in both
23c0: 20 72 65 67 69 6f 6e 73 20 41 20 61 6e 64 20 42   regions A and B
23d0: 20 68 61 73 20 62 65 65 6e 20 63 68 65 63 6b 70   has been checkp
23e0: 6f 69 6e 74 65 64 2e 20 41 74 20 77 68 69 63 68  ointed. At which
23f0: 20 70 6f 69 6e 74 20 74 68 65 20 73 79 73 74 65   point the syste
2400: 6d 0a 69 73 20 62 61 63 6b 20 69 6e 20 73 74 61  m.is back in sta
2410: 74 65 20 28 32 29 20 61 62 6f 76 65 2e 20 42 65  te (2) above. Be
2420: 66 6f 72 65 20 69 74 20 67 65 74 73 20 74 68 65  fore it gets the
2430: 72 65 2c 20 74 68 65 20 73 79 73 74 65 6d 20 74  re, the system t
2440: 6f 70 6f 6c 6f 67 79 20 6d 61 79 0a 70 61 73 73  opology may.pass
2450: 20 74 68 72 6f 75 67 68 20 73 74 61 74 65 20 35   through state 5
2460: 3a 0a 0a 3c 70 72 65 3e 0a 20 20 20 20 35 29 20  :..<pre>.    5) 
2470: 20 20 20 20 2e 2e 2e 2e 2e 7c 2d 2d 2d 2d 2d 2d      .....|------
2480: 42 2d 2d 2d 2d 2d 2d 7c 2e 2e 2e 2e 2e 2e 2e 2e  B------|........
2490: 2e 2e 2e 2e 2e 7c 2d 2d 2d 2d 2d 43 2d 2d 2d 2d  .....|-----C----
24a0: 2d 7c 2e 2e 2e 0a 3c 2f 70 72 65 3e 0a 0a 3c 68  -|....</pre>..<h
24b0: 34 20 69 64 3d 77 61 6c 5f 66 69 6c 65 5f 68 65  4 id=wal_file_he
24c0: 61 64 65 72 73 5f 61 6e 64 5f 72 65 63 6f 76 65  aders_and_recove
24d0: 72 79 3e 32 2e 31 2e 31 2e 32 2e 20 57 41 4c 20  ry>2.1.1.2. WAL 
24e0: 46 69 6c 65 20 48 65 61 64 65 72 73 20 61 6e 64  File Headers and
24f0: 20 52 65 63 6f 76 65 72 79 3c 2f 68 34 3e 0a 0a   Recovery</h4>..
2500: 3c 70 3e 54 68 65 20 57 41 4c 20 66 69 6c 65 20  <p>The WAL file 
2510: 62 65 67 69 6e 73 20 77 69 74 68 20 74 77 6f 20  begins with two 
2520: 68 65 61 64 65 72 20 62 6c 6f 63 6b 73 20 2d 20  header blocks - 
2530: 68 65 61 64 65 72 73 20 31 20 61 6e 64 20 32 2e  headers 1 and 2.
2540: 20 45 61 63 68 20 0a 62 6c 6f 63 6b 20 6f 63 63   Each .block occ
2550: 75 70 79 69 6e 67 20 61 6e 20 65 6e 74 69 72 65  upying an entire
2560: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 41 73   disk sector. As
2570: 20 77 65 6c 6c 20 61 73 20 6f 74 68 65 72 20 66   well as other f
2580: 69 65 6c 64 73 2c 20 61 20 68 65 61 64 65 72 20  ields, a header 
2590: 0a 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 3a  .block contains:
25a0: 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 20 41 20  ..<ul>.  <li> A 
25b0: 36 34 2d 62 69 74 20 76 65 72 73 69 6f 6e 20 6e  64-bit version n
25c0: 75 6d 62 65 72 2e 20 54 68 65 20 76 65 72 73 69  umber. The versi
25d0: 6f 6e 20 6e 75 6d 62 65 72 20 69 73 20 69 6e 63  on number is inc
25e0: 72 65 6d 65 6e 74 65 64 20 0a 20 20 20 20 20 20  remented .      
25f0: 20 65 61 63 68 20 74 69 6d 65 20 61 20 6e 65 77   each time a new
2600: 20 68 65 61 64 65 72 20 62 6c 6f 63 6b 20 69 73   header block is
2610: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2620: 57 41 4c 20 66 69 6c 65 2e 0a 20 20 3c 6c 69 3e  WAL file..  <li>
2630: 20 41 20 63 68 65 63 6b 73 75 6d 2e 20 42 61 73   A checksum. Bas
2640: 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ed on the conten
2650: 74 73 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ts of the header
2660: 20 62 6c 6f 63 6b 2c 20 69 6e 63 6c 75 64 69 6e   block, includin
2670: 67 20 0a 20 20 20 20 20 20 20 74 68 65 20 76 65  g .       the ve
2680: 72 73 69 6f 6e 20 6e 75 6d 62 65 72 2e 0a 3c 2f  rsion number..</
2690: 75 6c 3e 0a 0a 3c 70 3e 44 75 72 69 6e 67 20 72  ul>..<p>During r
26a0: 65 63 6f 76 65 72 79 2c 20 62 6f 74 68 20 68 65  ecovery, both he
26b0: 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 72 65 20  ader blocks are 
26c0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
26d0: 74 61 62 61 73 65 2e 20 54 68 65 0a 6e 65 77 65  tabase. The.newe
26e0: 73 74 20 62 6c 6f 63 6b 20 77 69 74 68 20 61 20  st block with a 
26f0: 76 61 6c 69 64 20 63 68 65 63 6b 73 75 6d 20 69  valid checksum i
2700: 73 20 75 73 65 64 2e 0a 0a 3c 70 3e 54 68 65 20  s used...<p>The 
2710: 6b 65 79 20 70 69 65 63 65 20 6f 66 20 69 6e 66  key piece of inf
2720: 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20 57 41  ormation in a WA
2730: 4c 20 66 69 6c 65 20 68 65 61 64 65 72 20 69 73  L file header is
2740: 20 74 68 65 20 66 69 72 73 74 20 66 72 61 6d 65   the first frame
2750: 0a 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20  .to read during 
2760: 72 65 63 6f 76 65 72 79 2e 20 49 6e 20 61 6e 20  recovery. In an 
2770: 53 51 4c 69 74 65 20 33 20 57 41 4c 20 66 69 6c  SQLite 3 WAL fil
2780: 65 2c 20 74 68 69 73 20 69 73 20 61 6c 77 61 79  e, this is alway
2790: 73 20 66 72 61 6d 65 20 0a 7a 65 72 6f 20 2d 20  s frame .zero - 
27a0: 74 68 65 20 66 72 61 6d 65 20 74 68 61 74 20 69  the frame that i
27b0: 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
27c0: 77 73 20 74 68 65 20 68 65 61 64 65 72 2e 20 49  ws the header. I
27d0: 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e 2c 0a  n this version,.
27e0: 69 74 20 6d 61 79 20 62 65 20 61 6e 79 20 66 72  it may be any fr
27f0: 61 6d 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  ame in the file.
2800: 0a 0a 3c 70 3e 57 68 65 6e 20 61 20 57 41 4c 20  ..<p>When a WAL 
2810: 66 69 6c 65 20 69 73 20 66 69 72 73 74 20 77 72  file is first wr
2820: 69 74 74 65 6e 20 28 73 74 61 74 65 20 31 20 61  itten (state 1 a
2830: 62 6f 76 65 29 2c 20 68 65 61 64 65 72 20 31 20  bove), header 1 
2840: 69 73 20 77 72 69 74 74 65 6e 20 61 6e 64 0a 74  is written and.t
2850: 68 65 20 72 65 63 6f 76 65 72 79 20 66 72 61 6d  he recovery fram
2860: 65 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f  e pointer set to
2870: 20 30 20 28 66 69 72 73 74 20 66 72 61 6d 65 20   0 (first frame 
2880: 69 6e 20 74 68 65 20 66 69 6c 65 29 2e 20 49 6e  in the file). In
2890: 20 74 68 69 73 20 63 61 73 65 2c 0a 74 68 65 20   this case,.the 
28a0: 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
28b0: 6e 20 62 79 20 74 68 65 20 77 72 69 74 65 72 2e  n by the writer.
28c0: 20 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c   This is the onl
28d0: 79 20 74 69 6d 65 20 61 20 57 41 4c 20 68 65 61  y time a WAL hea
28e0: 64 65 72 0a 69 73 20 75 70 64 61 74 65 64 20 62  der.is updated b
28f0: 79 20 61 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  y a process hold
2900: 69 6e 67 20 74 68 65 20 57 52 49 54 45 52 20 6c  ing the WRITER l
2910: 6f 63 6b 2e 20 41 6c 6c 20 73 75 62 73 65 71 75  ock. All subsequ
2920: 65 6e 74 20 68 65 61 64 65 72 20 0a 75 70 64 61  ent header .upda
2930: 74 65 73 20 61 72 65 20 70 65 72 66 6f 72 6d 65  tes are performe
2940: 64 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  d while holding 
2950: 74 68 65 20 43 48 45 43 4b 50 4f 49 4e 54 45 52  the CHECKPOINTER
2960: 20 6c 6f 63 6b 2e 0a 0a 3c 70 3e 41 66 74 65 72   lock...<p>After
2970: 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73   a checkpoint is
2980: 20 70 65 72 66 6f 72 6d 65 64 2c 20 61 20 63 68   performed, a ch
2990: 65 63 6b 70 6f 69 6e 74 65 72 20 6d 61 79 20 77  eckpointer may w
29a0: 72 69 74 65 20 61 20 6e 65 77 20 68 65 61 64 65  rite a new heade
29b0: 72 0a 69 6e 74 6f 20 74 68 65 20 57 41 4c 20 66  r.into the WAL f
29c0: 69 6c 65 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ile, indicating 
29d0: 61 20 6e 65 77 20 22 66 69 72 73 74 20 66 72 61  a new "first fra
29e0: 6d 65 22 20 74 68 61 74 20 63 61 6e 20 62 65 20  me" that can be 
29f0: 75 73 65 64 20 77 68 65 6e 0a 72 65 63 6f 76 65  used when.recove
2a00: 72 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c  ring the log fil
2a10: 65 2e 20 4f 6e 63 65 20 74 68 69 73 20 6e 65 77  e. Once this new
2a20: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
2a30: 20 73 79 6e 63 65 64 2c 20 69 74 20 69 73 20 73   synced, it is s
2a40: 61 66 65 0a 74 6f 20 6f 76 65 72 77 72 69 74 65  afe.to overwrite
2a50: 20 61 6e 79 20 70 61 72 74 73 20 6f 66 20 74 68   any parts of th
2a60: 65 20 6c 6f 67 20 74 68 61 74 20 6f 63 63 75 72  e log that occur
2a70: 20 6c 6f 67 69 63 61 6c 6c 79 20 62 65 66 6f 72   logically befor
2a80: 65 20 74 68 65 20 6e 65 77 20 22 66 69 72 73 74  e the new "first
2a90: 0a 66 72 61 6d 65 22 2e 20 54 68 65 20 6e 65 77  .frame". The new
2aa0: 20 68 65 61 64 65 72 20 69 73 20 61 6c 77 61 79   header is alway
2ab0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
2ac0: 20 73 6c 6f 74 20 6e 6f 74 20 6f 63 63 75 70 69   slot not occupi
2ad0: 65 64 20 62 79 20 74 68 65 0a 70 72 65 76 69 6f  ed by the.previo
2ae0: 75 73 20 68 65 61 64 65 72 2c 20 73 6f 20 74 68  us header, so th
2af0: 61 74 20 69 66 20 61 20 66 61 69 6c 75 72 65 20  at if a failure 
2b00: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 77 72 69  occurs while wri
2b10: 74 69 6e 67 20 61 74 20 6c 65 61 73 74 20 6f 6e  ting at least on
2b20: 65 20 68 65 61 64 65 72 20 0a 69 73 20 61 6c 77  e header .is alw
2b30: 61 79 73 20 76 61 6c 69 64 2e 20 49 66 20 74 68  ays valid. If th
2b40: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e  e database is in
2b50: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52   synchronous=NOR
2b60: 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 6d 6f 64 65  MAL or FULL mode
2b70: 2c 20 74 68 65 20 57 41 4c 0a 66 69 6c 65 20 69  , the WAL.file i
2b80: 73 20 73 79 6e 63 65 64 20 69 6d 6d 65 64 69 61  s synced immedia
2b90: 74 65 6c 79 20 61 66 74 65 72 20 74 68 65 20 68  tely after the h
2ba0: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
2bb0: 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 61 74  . Following that
2bc0: 2c 20 74 68 65 0a 2a 2d 73 68 6d 20 66 69 6c 65  , the.*-shm file
2bd0: 20 69 73 20 75 70 64 61 74 65 64 20 73 6f 20 74   is updated so t
2be0: 68 61 74 20 73 75 62 73 65 71 75 65 6e 74 20 77  hat subsequent w
2bf0: 72 69 74 65 72 73 20 63 61 6e 20 73 65 65 20 74  riters can see t
2c00: 68 61 74 20 74 68 65 20 57 41 4c 20 66 69 6c 65  hat the WAL file
2c10: 0a 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e  .header has been
2c20: 20 75 70 64 61 74 65 64 2e 20 41 20 77 72 69 74   updated. A writ
2c30: 65 72 20 70 72 6f 63 65 73 73 20 6d 61 79 20 74  er process may t
2c40: 68 65 6e 20 75 73 65 20 74 68 69 73 20 69 6e 66  hen use this inf
2c50: 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 64 65 74 65  ormation to.dete
2c60: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
2c70: 20 6e 6f 74 20 74 6f 20 77 72 61 70 20 74 68 65   not to wrap the
2c80: 20 6c 6f 67 20 66 69 6c 65 2e 0a 0a 3c 68 33 20   log file...<h3 
2c90: 69 64 3d 73 68 6d 5f 66 69 6c 65 5f 66 6f 72 6d  id=shm_file_form
2ca0: 61 74 5f 63 68 61 6e 67 65 73 3e 32 2e 31 2e 32  at_changes>2.1.2
2cb0: 2e 20 53 48 4d 20 46 69 6c 65 20 46 6f 72 6d 61  . SHM File Forma
2cc0: 74 20 43 68 61 6e 67 65 73 3c 2f 68 33 3e 0a 0a  t Changes</h3>..
2cd0: 3c 68 34 20 69 64 3d 73 68 6d 2d 66 69 6c 65 5f  <h4 id=shm-file_
2ce0: 68 65 61 64 65 72 3e 32 2e 31 2e 32 2e 33 2e 20  header>2.1.2.3. 
2cf0: 53 68 6d 2d 66 69 6c 65 20 48 65 61 64 65 72 3c  Shm-file Header<
2d00: 2f 68 34 3e 0a 0a 3c 70 3e 49 6e 20 53 51 4c 69  /h4>..<p>In SQLi
2d10: 74 65 2c 20 74 68 65 20 73 68 6d 2d 66 69 6c 65  te, the shm-file
2d20: 20 68 65 61 64 65 72 20 63 6f 6e 73 69 73 74 73   header consists
2d30: 20 6f 66 20 74 68 72 65 65 20 74 68 69 6e 67 73   of three things
2d40: 3a 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 20 54  :..<ul>.  <li> T
2d50: 68 65 20 57 61 6c 49 6e 64 65 78 48 64 72 20 73  he WalIndexHdr s
2d60: 74 72 75 63 74 75 72 65 20 28 75 70 64 61 74 65  tructure (update
2d70: 64 20 62 79 20 77 72 69 74 65 72 73 29 2e 0a 20  d by writers).. 
2d80: 20 3c 6c 69 3e 20 54 68 65 20 6e 42 61 63 6b 66   <li> The nBackf
2d90: 69 6c 6c 20 66 69 65 6c 64 20 28 75 70 64 61 74  ill field (updat
2da0: 65 64 20 62 79 20 63 68 65 63 6b 70 6f 69 6e 74  ed by checkpoint
2db0: 65 72 73 29 2e 0a 20 20 3c 6c 69 3e 20 54 68 65  ers)..  <li> The
2dc0: 20 61 72 72 61 79 20 6f 66 20 72 65 61 64 2d 6c   array of read-l
2dd0: 6f 63 6b 20 73 6c 6f 74 73 20 28 75 70 64 61 74  ock slots (updat
2de0: 65 64 20 62 79 20 72 65 61 64 65 72 73 29 2e 0a  ed by readers)..
2df0: 3c 2f 75 6c 3e 0a 0a 3c 70 3e 54 68 65 72 65 20  </ul>..<p>There 
2e00: 61 72 65 20 74 77 6f 20 69 64 65 6e 74 69 63 61  are two identica
2e10: 6c 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  l copies of the 
2e20: 57 61 6c 49 6e 64 65 78 48 64 72 2e 20 42 6f 74  WalIndexHdr. Bot
2e30: 68 20 63 6f 6e 74 61 69 6e 20 61 20 63 68 65 63  h contain a chec
2e40: 6b 73 75 6d 2e 0a 57 68 65 6e 20 61 20 77 72 69  ksum..When a wri
2e50: 74 65 72 20 77 69 73 68 65 73 20 74 6f 20 75 70  ter wishes to up
2e60: 64 61 74 65 20 74 68 65 20 57 61 6c 49 6e 64 65  date the WalInde
2e70: 78 48 64 72 2c 20 69 74 20 75 70 64 61 74 65 73  xHdr, it updates
2e80: 20 74 68 65 20 66 69 72 73 74 20 63 6f 70 79 2c   the first copy,
2e90: 0a 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 53 68  .invokes the xSh
2ea0: 6d 42 61 72 72 69 65 72 28 29 20 72 6f 75 74 69  mBarrier() routi
2eb0: 6e 65 2c 20 74 68 65 6e 20 75 70 64 61 74 65 73  ne, then updates
2ec0: 20 74 68 65 20 73 65 63 6f 6e 64 2e 20 0a 0a 3c   the second. ..<
2ed0: 70 3e 57 68 65 6e 20 61 20 72 65 61 64 65 72 20  p>When a reader 
2ee0: 72 65 61 64 73 20 74 68 65 20 57 61 6c 49 6e 64  reads the WalInd
2ef0: 65 78 48 64 72 2c 20 69 74 20 72 65 61 64 73 20  exHdr, it reads 
2f00: 74 68 65 20 66 69 72 73 74 20 63 6f 70 79 2c 20  the first copy, 
2f10: 69 6e 76 6f 6b 65 73 0a 78 53 68 6d 42 61 72 72  invokes.xShmBarr
2f20: 69 65 72 28 29 2c 20 74 68 65 6e 20 72 65 61 64  ier(), then read
2f30: 73 20 74 68 65 20 73 65 63 6f 6e 64 2e 20 49 66  s the second. If
2f40: 20 62 6f 74 68 20 6f 70 65 72 61 74 69 6f 6e 73   both operations
2f50: 20 72 65 74 75 72 6e 20 69 64 65 6e 74 69 63 61   return identica
2f60: 6c 20 64 61 74 61 0a 61 6e 64 20 74 68 65 20 63  l data.and the c
2f70: 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20  hecksum matches 
2f80: 74 68 65 6e 20 74 68 65 20 72 65 61 64 20 69 73  then the read is
2f90: 20 63 6f 6e 73 69 64 65 72 65 64 20 73 75 63 63   considered succ
2fa0: 65 73 73 66 75 6c 2e 20 55 6e 73 75 63 63 65 73  essful. Unsucces
2fb0: 73 66 75 6c 0a 72 65 61 64 73 20 61 72 65 20 72  sful.reads are r
2fc0: 65 74 72 69 65 64 20 66 6f 72 20 61 20 77 68 69  etried for a whi
2fd0: 6c 65 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65  le, then an atte
2fe0: 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 64  mpt is made to d
2ff0: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 72  etermine if ther
3000: 65 20 69 73 0a 61 6e 20 61 63 74 69 76 65 20 77  e is.an active w
3010: 72 69 74 65 72 20 70 72 6f 63 65 73 73 2e 20 49  riter process. I
3020: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 2c 20  f there is not, 
3030: 72 65 63 6f 76 65 72 79 20 69 73 20 72 75 6e 20  recovery is run 
3040: 6f 6e 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2e  on the WAL file.
3050: 20 49 66 0a 74 68 65 72 65 20 69 73 2c 20 53 51   If.there is, SQ
3060: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 69 73  LITE_PROTOCOL is
3070: 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
3080: 20 75 73 65 72 2e 0a 0a 54 68 65 72 65 20 61 72   user...There ar
3090: 65 20 74 77 6f 20 6d 69 6e 6f 72 20 70 72 6f 62  e two minor prob
30a0: 6c 65 6d 73 20 77 69 74 68 20 74 68 69 73 3a 0a  lems with this:.
30b0: 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 3c 70 3e 20  .<ul>.  <li><p> 
30c0: 45 76 65 6e 20 77 69 74 68 20 68 69 67 68 20 72  Even with high r
30d0: 65 74 72 79 20 63 6f 75 6e 74 73 2c 20 53 51 4c  etry counts, SQL
30e0: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 68 61 73  ITE_PROTOCOL has
30f0: 20 76 65 72 79 20 6f 63 63 61 73 69 6f 6e 61 6c   very occasional
3100: 6c 79 0a 20 20 20 20 20 20 20 20 20 20 62 65 65  ly.          bee
3110: 6e 20 6f 62 73 65 72 76 65 64 20 69 6e 20 74 68  n observed in th
3120: 65 20 77 69 6c 64 2e 0a 20 20 3c 6c 69 3e 3c 70  e wild..  <li><p
3130: 3e 20 52 65 71 75 69 72 69 6e 67 20 74 68 61 74  > Requiring that
3140: 20 72 65 63 6f 76 65 72 79 20 62 65 20 72 75 6e   recovery be run
3150: 20 69 66 20 61 20 77 72 69 74 65 72 20 70 72 6f   if a writer pro
3160: 63 65 73 73 20 66 61 69 6c 73 20 77 68 69 6c 65  cess fails while
3170: 0a 20 20 20 20 20 20 20 20 20 20 75 70 64 61 74  .          updat
3180: 69 6e 67 20 74 68 65 20 57 61 6c 49 6e 64 65 78  ing the WalIndex
3190: 48 64 72 20 63 61 75 73 65 73 20 70 72 6f 62 6c  Hdr causes probl
31a0: 65 6d 73 20 66 6f 72 20 72 65 61 64 2d 6f 6e 6c  ems for read-onl
31b0: 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20  y connections.  
31c0: 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e 54 68 65 20 70  .</ul>..<p>The p
31d0: 72 6f 63 65 64 75 72 65 20 66 6f 72 20 72 65 61  rocedure for rea
31e0: 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67  ding and writing
31f0: 20 74 68 65 20 57 61 6c 49 6e 64 65 78 48 64 72   the WalIndexHdr
3200: 20 63 6f 70 69 65 73 20 63 61 6e 20 62 65 20 6d   copies can be m
3210: 6f 64 69 66 69 65 64 0a 74 6f 20 61 64 64 72 65  odified.to addre
3220: 73 73 20 74 68 65 20 61 62 6f 76 65 20 61 73 20  ss the above as 
3230: 66 6f 6c 6c 6f 77 73 3a 0a 0a 3c 75 6c 3e 0a 20  follows:..<ul>. 
3240: 20 3c 6c 69 3e 3c 70 3e 54 68 65 20 77 72 69 74   <li><p>The writ
3250: 65 72 20 69 6e 76 6f 6b 65 73 20 78 53 68 6d 42  er invokes xShmB
3260: 61 72 72 69 65 72 28 29 20 62 65 66 6f 72 65 20  arrier() before 
3270: 75 70 64 61 74 69 6e 67 20 74 68 65 20 66 69 72  updating the fir
3280: 73 74 20 57 61 6c 49 6e 64 65 78 48 64 72 0a 20  st WalIndexHdr. 
3290: 20 61 73 20 77 65 6c 6c 20 61 73 20 62 65 66 6f   as well as befo
32a0: 72 65 20 75 70 64 61 74 69 6e 67 20 74 68 65 20  re updating the 
32b0: 73 65 63 6f 6e 64 2e 0a 0a 20 20 3c 6c 69 3e 3c  second...  <li><
32c0: 70 3e 41 20 72 65 61 64 65 72 20 73 74 61 72 74  p>A reader start
32d0: 73 20 62 79 20 72 65 61 64 69 6e 67 20 74 68 65  s by reading the
32e0: 20 66 69 72 73 74 20 57 61 6c 49 6e 64 65 78 48   first WalIndexH
32f0: 64 72 2e 20 49 66 20 74 68 65 20 63 68 65 63 6b  dr. If the check
3300: 73 75 6d 0a 20 20 6d 61 74 63 68 65 73 20 74 68  sum.  matches th
3310: 65 20 72 65 61 64 20 64 61 74 61 2c 20 74 68 65  e read data, the
3320: 20 72 65 61 64 20 69 73 20 63 6f 6e 73 69 64 65   read is conside
3330: 72 65 64 20 73 75 63 63 65 73 73 66 75 6c 20 77  red successful w
3340: 69 74 68 6f 75 74 20 65 76 65 72 0a 20 20 65 78  ithout ever.  ex
3350: 61 6d 69 6e 69 6e 67 20 74 68 65 20 73 65 63 6f  amining the seco
3360: 6e 64 20 63 6f 70 79 2e 20 49 66 20 75 6e 73 75  nd copy. If unsu
3370: 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 61 74 74  ccessful, an att
3380: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
3390: 72 65 61 64 20 74 68 65 0a 20 20 73 65 63 6f 6e  read the.  secon
33a0: 64 20 63 6f 70 79 2e 20 54 68 65 6e 20 74 68 65  d copy. Then the
33b0: 20 66 69 72 73 74 20 61 67 61 69 6e 2c 20 61 6e   first again, an
33c0: 64 20 73 6f 20 6f 6e 2c 20 75 6e 74 69 6c 20 73  d so on, until s
33d0: 6f 6d 65 20 63 6f 6e 66 69 67 75 72 65 64 20 6c  ome configured l
33e0: 69 6d 69 74 20 69 73 0a 20 20 72 65 61 63 68 65  imit is.  reache
33f0: 64 20 6f 72 20 61 20 73 75 63 63 65 73 73 66 75  d or a successfu
3400: 6c 20 72 65 61 64 20 69 73 20 6d 61 64 65 2e 20  l read is made. 
3410: 49 66 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  If a successful 
3420: 72 65 61 64 20 69 73 20 61 63 68 65 69 76 65 64  read is acheived
3430: 2c 20 74 68 65 0a 20 20 78 53 68 6d 42 61 72 72  , the.  xShmBarr
3440: 69 65 72 28 29 20 6d 65 74 68 6f 64 20 69 73 20  ier() method is 
3450: 69 6e 76 6f 6b 65 64 20 62 65 66 6f 72 65 20 70  invoked before p
3460: 72 6f 63 65 65 64 69 6e 67 2e 20 49 66 20 6e 6f  roceeding. If no
3470: 74 2c 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  t, SQLITE_PROTOC
3480: 4f 4c 20 69 73 0a 20 20 72 65 74 75 72 6e 65 64  OL is.  returned
3490: 20 74 6f 20 74 68 65 20 75 73 65 72 2e 0a 3c 2f   to the user..</
34a0: 75 6c 3e 0a 0a 3c 70 3e 54 68 65 20 78 53 68 6d  ul>..<p>The xShm
34b0: 42 61 72 72 69 65 72 28 29 20 6d 61 64 65 20 62  Barrier() made b
34c0: 79 20 74 68 65 20 72 65 61 64 65 72 20 61 6e 64  y the reader and
34d0: 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 74 68   the first of th
34e0: 6f 73 65 20 6d 61 64 65 20 62 79 20 74 68 65 0a  ose made by the.
34f0: 77 72 69 74 65 72 20 74 6f 67 65 74 68 65 72 20  writer together 
3500: 65 6e 73 75 72 65 20 74 68 61 74 20 61 20 72 65  ensure that a re
3510: 61 64 65 72 20 6d 61 79 20 6e 6f 74 20 73 65 65  ader may not see
3520: 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68   a version of th
3530: 65 20 68 61 73 68 20 74 61 62 6c 65 73 0a 74 68  e hash tables.th
3540: 61 74 20 69 73 20 6f 6c 64 65 72 20 74 68 61 6e  at is older than
3550: 20 74 68 65 20 57 61 6c 49 6e 64 65 78 48 64 72   the WalIndexHdr
3560: 20 69 74 20 72 65 61 64 73 2e 20 54 68 65 20 73   it reads. The s
3570: 65 63 6f 6e 64 20 78 53 68 6d 42 61 72 72 69 65  econd xShmBarrie
3580: 72 28 29 20 63 61 6c 6c 20 6d 61 64 65 0a 62 79  r() call made.by
3590: 20 74 68 65 20 77 72 69 74 65 72 20 2e 2e 2e 20   the writer ... 
35a0: 3c 69 3e 44 6f 65 73 20 77 68 61 74 3f 20 4d 61  <i>Does what? Ma
35b0: 6b 65 73 20 69 74 20 6d 6f 72 65 20 6c 69 6b 65  kes it more like
35c0: 6c 79 20 74 68 61 74 20 61 20 63 6f 6e 63 75 72  ly that a concur
35d0: 72 65 6e 74 20 72 65 61 64 65 72 0a 77 69 6c 6c  rent reader.will
35e0: 20 67 65 74 20 61 20 63 6c 65 61 6e 20 72 65 61   get a clean rea
35f0: 64 3f 20 43 61 6e 20 74 68 69 73 20 62 65 20 72  d? Can this be r
3600: 65 6d 6f 76 65 64 3f 3c 2f 69 3e 0a 0a 3c 70 3e  emoved?</i>..<p>
3610: 54 68 65 20 73 69 6e 67 6c 65 20 6e 42 61 63 6b  The single nBack
3620: 66 69 6c 6c 20 66 69 65 6c 64 20 69 73 20 72 65  fill field is re
3630: 70 6c 61 63 65 64 20 62 79 20 74 77 6f 20 33 32  placed by two 32
3640: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 69 65  -bit integer fie
3650: 6c 64 73 20 74 68 61 74 0a 6d 61 79 20 62 65 20  lds that.may be 
3660: 75 70 64 61 74 65 64 20 62 79 20 63 68 65 63 6b  updated by check
3670: 70 6f 69 6e 74 65 72 73 3a 0a 0a 3c 75 6c 3e 0a  pointers:..<ul>.
3680: 20 20 3c 6c 69 3e 3c 70 3e 69 46 69 72 73 74 52    <li><p>iFirstR
3690: 65 61 64 20 2d 20 66 69 72 73 74 20 66 72 61 6d  ead - first fram
36a0: 65 20 69 6e 20 74 68 65 20 6c 6f 67 20 74 68 61  e in the log tha
36b0: 74 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63  t has not been c
36c0: 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 20 20 3c  heckpointed..  <
36d0: 6c 69 3e 3c 70 3e 69 46 69 72 73 74 52 65 63 6f  li><p>iFirstReco
36e0: 76 65 72 20 2d 20 66 69 72 73 74 20 66 72 61 6d  ver - first fram
36f0: 65 20 69 6e 20 74 68 65 20 6c 6f 67 20 74 68 61  e in the log tha
3700: 74 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63  t has not been c
3710: 68 65 63 6b 70 6f 69 6e 74 65 64 0a 20 20 20 20  heckpointed.    
3720: 20 20 20 20 20 61 6e 64 20 73 79 6e 63 65 64 20       and synced 
3730: 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
3740: 65 20 66 69 6c 65 2e 0a 3c 2f 75 6c 3e 0a 0a 3c  e file..</ul>..<
3750: 70 3e 41 66 74 65 72 20 61 20 63 68 65 63 6b 70  p>After a checkp
3760: 6f 69 6e 74 65 72 20 66 69 6e 69 73 68 65 73 20  ointer finishes 
3770: 63 6f 70 79 69 6e 67 20 64 61 74 61 20 66 72 6f  copying data fro
3780: 6d 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 69  m the log file i
3790: 6e 74 6f 20 74 68 65 0a 64 61 74 61 62 61 73 65  nto the.database
37a0: 2c 20 69 74 20 75 70 64 61 74 65 73 20 69 46 69  , it updates iFi
37b0: 72 73 74 52 65 61 64 2e 20 49 66 20 69 74 20 74  rstRead. If it t
37c0: 68 65 6e 20 73 79 6e 63 73 20 74 68 65 20 64 61  hen syncs the da
37d0: 74 61 62 61 73 65 20 66 69 6c 65 20 28 6f 72 20  tabase file (or 
37e0: 69 66 20 69 74 0a 69 73 20 72 75 6e 6e 69 6e 67  if it.is running
37f0: 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d   in synchronous=
3800: 4f 46 46 20 6d 6f 64 65 29 2c 20 69 74 20 75 70  OFF mode), it up
3810: 64 61 74 65 73 20 69 46 69 72 73 74 52 65 63 6f  dates iFirstReco
3820: 76 65 72 20 61 73 20 77 65 6c 6c 2e 0a 0a 3c 70  ver as well...<p
3830: 3e 54 68 65 20 61 72 72 61 79 20 6f 66 20 72 65  >The array of re
3840: 61 64 2d 6c 6f 63 6b 20 73 6c 6f 74 73 20 69 73  ad-lock slots is
3850: 20 74 68 65 20 73 61 6d 65 20 61 73 20 69 6e 20   the same as in 
3860: 53 51 4c 69 74 65 2e 0a 0a 3c 68 34 20 69 64 3d  SQLite...<h4 id=
3870: 73 68 6d 2d 66 69 6c 65 5f 68 61 73 68 5f 74 61  shm-file_hash_ta
3880: 62 6c 65 73 3e 32 2e 31 2e 32 2e 34 2e 20 53 68  bles>2.1.2.4. Sh
3890: 6d 2d 46 69 6c 65 20 48 61 73 68 20 54 61 62 6c  m-File Hash Tabl
38a0: 65 73 3c 2f 68 34 3e 0a 0a 3c 70 3e 49 6e 20 53  es</h4>..<p>In S
38b0: 51 4c 69 74 65 2c 20 74 68 65 20 73 68 6d 20 66  QLite, the shm f
38c0: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 73  ile contains a s
38d0: 65 72 69 65 73 20 6f 66 20 68 61 73 68 20 74 61  eries of hash ta
38e0: 62 6c 65 73 2e 20 52 6f 75 67 68 6c 79 20 6f 6e  bles. Roughly on
38f0: 65 20 68 61 73 68 0a 74 61 62 6c 65 20 66 6f 72  e hash.table for
3900: 20 65 61 63 68 20 34 30 39 36 20 66 72 61 6d 65   each 4096 frame
3910: 73 20 69 6e 20 74 68 65 20 57 41 4c 20 66 69 6c  s in the WAL fil
3920: 65 2e 20 49 6e 20 53 51 4c 69 74 65 2c 20 65 61  e. In SQLite, ea
3930: 63 68 20 33 32 4b 42 20 68 61 73 68 20 74 61 62  ch 32KB hash tab
3940: 6c 65 20 69 73 0a 6d 61 64 65 20 75 70 20 6f 66  le is.made up of
3950: 20 61 6e 20 6f 72 64 65 72 65 64 20 6c 69 73 74   an ordered list
3960: 20 6f 66 20 70 61 67 65 20 6e 75 6d 62 65 72 73   of page numbers
3970: 20 28 31 36 4b 42 29 20 61 6e 64 20 61 20 74 61   (16KB) and a ta
3980: 62 6c 65 20 6f 66 20 38 31 39 32 20 31 36 2d 62  ble of 8192 16-b
3990: 69 74 0a 73 6c 6f 74 73 2e 20 54 68 69 73 20 61  it.slots. This a
39a0: 70 70 72 6f 61 63 68 20 6d 75 73 74 20 62 65 20  pproach must be 
39b0: 6d 6f 64 69 66 69 65 64 20 66 6f 72 20 74 68 65  modified for the
39c0: 20 63 75 72 72 65 6e 74 20 64 65 73 69 67 6e 2c   current design,
39d0: 20 61 73 20 69 74 20 69 74 20 6e 6f 74 0a 67 65   as it it not.ge
39e0: 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  nerally possible
39f0: 20 74 6f 20 73 61 66 65 6c 79 20 72 65 6d 6f 76   to safely remov
3a00: 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 61  e entries from a
3a10: 20 68 61 73 68 20 74 61 62 6c 65 20 77 68 69 6c   hash table whil
3a20: 65 20 69 74 20 69 73 20 69 6e 0a 75 73 65 2e 0a  e it is in.use..
3a30: 0a 3c 70 3e 49 6e 73 74 65 61 64 20 6f 66 20 61  .<p>Instead of a
3a40: 20 73 69 6e 67 6c 65 20 31 36 4b 42 20 74 61 62   single 16KB tab
3a50: 6c 65 20 6f 66 20 68 61 73 68 20 73 6c 6f 74 73  le of hash slots
3a60: 2c 20 65 61 63 68 20 31 36 4b 42 20 6f 72 64 65  , each 16KB orde
3a70: 72 65 64 20 6c 69 73 74 20 6f 66 20 0a 70 61 67  red list of .pag
3a80: 65 20 6e 75 6d 62 65 72 73 20 69 73 20 66 6f 6c  e numbers is fol
3a90: 6c 6f 77 65 64 20 62 79 20 74 77 6f 20 73 75 63  lowed by two suc
3aa0: 68 20 74 61 62 6c 65 73 2e 20 4d 65 61 6e 69 6e  h tables. Meanin
3ab0: 67 20 74 68 61 74 20 66 6f 72 20 65 61 63 68 20  g that for each 
3ac0: 34 30 39 36 0a 66 72 61 6d 65 73 20 6f 72 20 70  4096.frames or p
3ad0: 61 72 74 20 74 68 65 72 65 6f 66 20 69 6e 20 74  art thereof in t
3ae0: 68 65 20 57 41 4c 20 66 69 6c 65 20 74 68 65 72  he WAL file ther
3af0: 65 20 69 73 20 61 20 34 38 4b 42 20 28 69 6e 73  e is a 48KB (ins
3b00: 74 65 61 64 20 6f 66 20 33 32 4b 42 29 20 0a 68  tead of 32KB) .h
3b10: 61 73 68 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ash table in the
3b20: 20 73 68 6d 20 66 69 6c 65 2e 0a 0a 3c 70 3e 57   shm file...<p>W
3b30: 68 65 6e 20 74 68 65 20 57 41 4c 20 66 69 6c 65  hen the WAL file
3b40: 20 69 73 20 66 69 72 73 74 20 77 72 69 74 74 65   is first writte
3b50: 6e 2c 20 74 68 65 20 66 69 72 73 74 20 6f 66 20  n, the first of 
3b60: 65 61 63 68 20 70 61 69 72 20 6f 66 20 68 61 73  each pair of has
3b70: 68 20 73 6c 6f 74 0a 74 61 62 6c 65 73 20 69 73  h slot.tables is
3b80: 20 75 73 65 64 2e 20 45 61 63 68 20 74 69 6d 65   used. Each time
3b90: 20 61 20 77 72 69 74 65 72 20 77 72 61 70 73 20   a writer wraps 
3ba0: 61 72 6f 75 6e 64 20 74 6f 20 74 68 65 20 73 74  around to the st
3bb0: 61 72 74 20 6f 66 20 74 68 65 20 57 41 4c 20 0a  art of the WAL .
3bc0: 66 69 6c 65 2c 20 69 74 20 74 6f 67 67 6c 65 73  file, it toggles
3bd0: 20 77 68 69 63 68 20 6f 66 20 74 68 65 20 70 61   which of the pa
3be0: 69 72 20 69 73 20 75 70 64 61 74 65 64 20 28 69  ir is updated (i
3bf0: 2e 65 2e 20 74 68 65 20 66 69 72 73 74 20 74 69  .e. the first ti
3c00: 6d 65 20 74 68 65 0a 57 41 4c 20 66 69 6c 65 20  me the.WAL file 
3c10: 69 73 20 77 72 61 70 70 65 64 20 74 68 65 20 77  is wrapped the w
3c20: 72 69 74 65 72 20 73 74 61 72 74 73 20 75 73 69  riter starts usi
3c30: 6e 67 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 66  ng the second of
3c40: 20 65 61 63 68 20 70 61 69 72 2c 20 74 68 65 6e   each pair, then
3c50: 0a 61 66 74 65 72 20 69 74 20 69 73 20 77 72 61  .after it is wra
3c60: 70 70 65 64 20 61 20 73 65 63 6f 6e 64 20 74 69  pped a second ti
3c70: 6d 65 20 69 74 20 75 73 65 73 20 74 68 65 20 66  me it uses the f
3c80: 69 72 73 74 20 61 67 61 69 6e 2c 20 61 6e 64 20  irst again, and 
3c90: 73 6f 20 6f 6e 29 2e 0a 53 69 6e 63 65 20 61 20  so on)..Since a 
3ca0: 77 72 69 74 65 72 20 6d 61 79 20 6f 6e 6c 79 20  writer may only 
3cb0: 77 72 61 70 20 61 72 6f 75 6e 64 20 74 6f 20 74  wrap around to t
3cc0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
3cd0: 57 41 4c 20 66 69 6c 65 20 77 68 65 6e 20 74 68  WAL file when th
3ce0: 65 0a 6c 6f 67 20 63 6f 6e 73 69 73 74 73 20 6f  e.log consists o
3cf0: 66 20 61 20 73 69 6e 67 6c 65 20 72 65 67 69 6f  f a single regio
3d00: 6e 2c 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74  n, this makes it
3d10: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 76 6f   possible to avo
3d20: 69 64 20 65 76 65 72 0a 6e 65 65 64 69 6e 67 20  id ever.needing 
3d30: 74 6f 20 64 65 6c 65 74 65 20 69 6e 64 69 76 69  to delete indivi
3d40: 64 75 61 6c 20 65 6c 65 6d 65 6e 74 73 20 66 72  dual elements fr
3d50: 6f 6d 20 68 61 73 68 20 73 6c 6f 74 20 74 61 62  om hash slot tab
3d60: 6c 65 73 2e 20 49 74 20 61 6c 73 6f 20 0a 6d 61  les. It also .ma
3d70: 6b 65 73 20 74 68 65 20 73 68 6d 20 66 69 6c 65  kes the shm file
3d80: 20 35 30 25 20 6c 61 72 67 65 72 2e 0a 0a 3c 68   50% larger...<h
3d90: 33 20 69 64 3d 63 68 61 6e 67 65 73 5f 74 6f 5f  3 id=changes_to_
3da0: 6c 6f 63 6b 69 6e 67 3e 32 2e 31 2e 33 2e 20 43  locking>2.1.3. C
3db0: 68 61 6e 67 65 73 20 74 6f 20 4c 6f 63 6b 69 6e  hanges to Lockin
3dc0: 67 3c 2f 68 33 3e 0a 0a 3c 70 3e 54 68 65 20 64  g</h3>..<p>The d
3dd0: 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
3de0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 65  n the current de
3df0: 73 69 67 6e 20 61 6e 64 20 53 51 4c 69 74 65 20  sign and SQLite 
3e00: 69 6e 20 57 41 4c 20 6d 6f 64 65 20 69 73 0a 74  in WAL mode is.t
3e10: 68 61 74 20 74 68 69 73 20 64 65 73 69 67 6e 20  hat this design 
3e20: 73 75 70 70 6f 72 74 73 20 72 65 61 64 2d 6f 6e  supports read-on
3e30: 6c 79 20 63 6c 69 65 6e 74 73 2e 0a 0a 3c 70 3e  ly clients...<p>
3e40: 4c 69 6b 65 20 53 51 4c 69 74 65 20 57 41 4c 20  Like SQLite WAL 
3e50: 6d 6f 64 65 2c 20 74 68 69 73 20 73 79 73 74 65  mode, this syste
3e60: 6d 20 68 61 73 20 65 73 73 65 6e 74 69 61 6c 6c  m has essentiall
3e70: 79 20 74 77 6f 20 73 74 61 74 65 73 20 2d 20 6c  y two states - l
3e80: 69 76 65 20 0a 61 6e 64 20 68 61 6c 74 65 64 2e  ive .and halted.
3e90: 20 54 68 65 20 73 79 73 74 65 6d 20 69 73 20 6c   The system is l
3ea0: 69 76 65 20 77 68 65 6e 20 74 68 65 72 65 20 69  ive when there i
3eb0: 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  s at least one o
3ec0: 70 65 6e 20 64 61 74 61 62 61 73 65 0a 63 6f 6e  pen database.con
3ed0: 6e 65 63 74 69 6f 6e 20 61 6e 64 20 74 68 65 20  nection and the 
3ee0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
3ef0: 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
3f00: 67 69 6f 6e 20 61 72 65 20 64 65 65 6d 65 64 20  gion are deemed 
3f10: 0a 74 72 75 73 74 77 6f 72 74 68 79 2e 20 4f 74  .trustworthy. Ot
3f20: 68 65 72 77 69 73 65 2c 20 69 74 20 69 73 20 68  herwise, it is h
3f30: 61 6c 74 65 64 2e 0a 0a 3c 70 3e 54 6f 20 73 69  alted...<p>To si
3f40: 6d 70 6c 69 66 79 20 74 68 69 6e 67 73 20 61 20  mplify things a 
3f50: 62 69 74 2c 20 74 68 69 73 20 64 65 73 69 67 6e  bit, this design
3f60: 20 63 6f 6d 62 69 6e 65 73 20 72 65 63 6f 76 65   combines recove
3f70: 72 79 20 77 69 74 68 20 63 6f 6e 6e 65 63 74 69  ry with connecti
3f80: 6e 67 0a 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng.to the databa
3f90: 73 65 2e 20 49 6e 20 53 51 4c 69 74 65 2c 20 77  se. In SQLite, w
3fa0: 68 65 6e 20 61 6e 20 64 61 74 61 62 61 73 65 20  hen an database 
3fb0: 69 73 20 6f 70 65 6e 65 64 20 74 68 65 20 6c 69  is opened the li
3fc0: 62 72 61 72 79 20 63 68 65 63 6b 73 0a 74 6f 20  brary checks.to 
3fd0: 73 65 65 20 69 66 20 74 68 65 20 6e 65 77 20 63  see if the new c
3fe0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 74 68 65  onnection is the
3ff0: 20 6f 6e 6c 79 20 6f 6e 65 20 74 6f 20 74 68 65   only one to the
4000: 20 64 61 74 61 62 61 73 65 20 69 6e 20 71 75 65   database in que
4010: 73 74 69 6f 6e 2e 0a 49 66 20 69 74 20 69 73 2c  stion..If it is,
4020: 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
4030: 72 79 20 72 65 67 69 6f 6e 20 69 73 20 7a 65 72  ry region is zer
4040: 6f 65 64 2c 20 77 68 69 63 68 20 66 6f 72 63 65  oed, which force
4050: 73 20 72 65 63 6f 76 65 72 79 20 74 6f 20 62 65  s recovery to be
4060: 0a 72 75 6e 20 6c 61 74 65 72 20 6f 6e 20 2d 20  .run later on - 
4070: 70 65 72 68 61 70 73 20 62 79 20 61 6e 6f 74 68  perhaps by anoth
4080: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49  er connection. I
4090: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 65  n the current de
40a0: 73 69 67 6e 2c 0a 72 65 63 6f 76 65 72 79 20 73  sign,.recovery s
40b0: 68 61 6c 6c 20 62 65 20 72 75 6e 20 69 6d 6d 65  hall be run imme
40c0: 64 69 61 74 65 6c 79 20 75 70 6f 6e 20 64 65 74  diately upon det
40d0: 65 72 6d 69 6e 69 6e 67 20 74 68 61 74 20 74 68  ermining that th
40e0: 65 20 63 75 72 72 65 6e 74 20 0a 63 6f 6e 6e 65  e current .conne
40f0: 63 74 69 6f 6e 20 69 73 20 74 68 65 20 66 69 72  ction is the fir
4100: 73 74 2e 20 55 73 69 6e 67 20 74 68 65 20 6c 6f  st. Using the lo
4110: 63 6b 69 6e 67 20 6e 6f 74 61 74 69 6f 6e 20 66  cking notation f
4120: 6f 72 20 53 51 4c 69 74 65 2c 20 74 68 65 0a 63  or SQLite, the.c
4130: 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 65 64  onnection proced
4140: 75 72 65 20 66 6f 72 20 72 65 61 64 2d 77 72 69  ure for read-wri
4150: 74 65 20 63 6c 69 65 6e 74 73 20 69 73 20 74 68  te clients is th
4160: 65 72 65 66 6f 72 65 3a 0a 0a 3c 70 72 65 3e 0a  erefore:..<pre>.
4170: 20 20 4c 6f 63 6b 28 44 4d 53 31 2c 20 45 58 43    Lock(DMS1, EXC
4180: 4c 55 53 49 56 45 29 20 20 20 20 20 20 2f 2a 20  LUSIVE)      /* 
4190: 62 6c 6f 63 6b 69 6e 67 20 6c 6f 63 6b 20 2a 2f  blocking lock */
41a0: 0a 20 20 20 20 4c 6f 63 6b 28 44 4d 53 32 2c 20  .    Lock(DMS2, 
41b0: 45 58 43 4c 55 53 49 56 45 29 20 20 20 20 2f 2a  EXCLUSIVE)    /*
41c0: 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 20 6c 6f   non-blocking lo
41d0: 63 6b 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75  ck */.    if( su
41e0: 63 63 65 73 73 66 75 6c 20 29 7b 20 52 75 6e 20  ccessful ){ Run 
41f0: 72 65 63 6f 76 65 72 79 20 7d 0a 20 20 20 20 4c  recovery }.    L
4200: 6f 63 6b 28 44 4d 53 32 2c 20 53 48 41 52 45 44  ock(DMS2, SHARED
4210: 29 20 20 20 20 20 20 20 2f 2a 20 22 63 61 6e 6e  )       /* "cann
4220: 6f 74 22 20 66 61 69 6c 20 2a 2f 0a 20 20 55 6e  ot" fail */.  Un
4230: 6c 6f 63 6b 28 44 4d 53 31 29 0a 3c 2f 70 72 65  lock(DMS1).</pre
4240: 3e 0a 0a 3c 70 3e 54 68 69 73 20 6d 61 6b 65 73  >..<p>This makes
4250: 20 74 68 69 6e 67 73 20 73 69 6d 70 6c 65 72 20   things simpler 
4260: 62 79 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74  by ensuring that
4270: 20 72 65 63 6f 76 65 72 79 20 6e 65 76 65 72 20   recovery never 
4280: 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 72 75 6e  needs to be .run
4290: 20 62 79 20 61 20 28 70 6f 73 73 69 62 6c 79 20   by a (possibly 
42a0: 72 65 61 64 2d 6f 6e 6c 79 29 20 63 6c 69 65 6e  read-only) clien
42b0: 74 20 6f 6e 63 65 20 69 74 20 69 73 20 63 6f 6e  t once it is con
42c0: 6e 65 63 74 65 64 20 74 6f 20 61 20 6c 69 76 65  nected to a live
42d0: 20 73 79 73 74 65 6d 2e 0a 0a 3c 68 34 20 69 64   system...<h4 id
42e0: 3d 72 65 61 64 2d 6f 6e 6c 79 5f 63 6c 69 65 6e  =read-only_clien
42f0: 74 73 5f 61 6e 64 5f 68 61 6c 74 65 64 5f 64 61  ts_and_halted_da
4300: 74 61 62 61 73 65 73 3e 32 2e 31 2e 33 2e 35 2e  tabases>2.1.3.5.
4310: 20 52 65 61 64 2d 6f 6e 6c 79 20 43 6c 69 65 6e   Read-only Clien
4320: 74 73 20 61 6e 64 20 48 61 6c 74 65 64 20 44 61  ts and Halted Da
4330: 74 61 62 61 73 65 73 3c 2f 68 34 3e 0a 0a 3c 70  tabases</h4>..<p
4340: 3e 49 6e 20 6f 72 64 65 72 20 74 6f 20 72 65 61  >In order to rea
4350: 64 20 66 72 6f 6d 20 61 20 68 61 6c 74 65 64 20  d from a halted 
4360: 64 61 74 61 62 61 73 65 2c 20 61 20 72 65 61 64  database, a read
4370: 2d 6f 6e 6c 79 20 63 6c 69 65 6e 74 20 72 75 6e  -only client run
4380: 73 20 61 20 70 72 6f 63 65 73 73 0a 76 65 72 79  s a process.very
4390: 20 73 69 6d 69 6c 61 72 20 74 6f 20 64 61 74 61   similar to data
43a0: 62 61 73 65 20 72 65 63 6f 76 65 72 79 20 74 6f  base recovery to
43b0: 20 63 72 65 61 74 65 20 61 20 70 72 69 76 61 74   create a privat
43c0: 65 20 77 61 6c 2d 69 6e 64 65 78 20 69 6e 20 68  e wal-index in h
43d0: 65 61 70 20 0a 6d 65 6d 6f 72 79 2e 20 53 69 6e  eap .memory. Sin
43e0: 63 65 20 74 68 65 72 65 20 75 73 75 61 6c 6c 79  ce there usually
43f0: 20 69 73 20 6e 6f 20 57 41 4c 20 66 69 6c 65 20   is no WAL file 
4400: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
4410: 61 20 68 61 6c 74 65 64 20 73 79 73 74 65 6d 20  a halted system 
4420: 0a 74 68 69 73 20 69 73 20 6f 66 74 65 6e 20 61  .this is often a
4430: 20 6e 6f 2d 6f 70 2e 20 0a 0a 3c 70 3e 49 6e 20   no-op. ..<p>In 
4440: 6f 72 64 65 72 20 74 6f 20 73 61 66 65 6c 79 20  order to safely 
4450: 72 65 61 64 20 66 72 6f 6d 20 61 20 68 61 6c 74  read from a halt
4460: 65 64 20 64 61 74 61 62 61 73 65 2c 20 61 20 72  ed database, a r
4470: 65 61 64 2d 6f 6e 6c 79 20 63 6c 69 65 6e 74 20  ead-only client 
4480: 0a 72 65 71 75 69 72 65 73 20 74 68 65 20 73 79  .requires the sy
4490: 73 74 65 6d 20 74 6f 20 67 75 61 72 61 6e 74 65  stem to guarante
44a0: 65 20 74 68 61 74 20 66 6f 72 20 74 68 65 20 64  e that for the d
44b0: 75 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  uration of the r
44c0: 65 61 64 20 0a 74 72 61 6e 73 61 63 74 69 6f 6e  ead .transaction
44d0: 20 6e 6f 20 72 65 61 64 2d 77 72 69 74 65 20 63   no read-write c
44e0: 6c 69 65 6e 74 20 63 6f 6e 6e 65 63 74 73 20 61  lient connects a
44f0: 6e 64 20 6f 76 65 72 77 72 69 74 65 73 20 61 6e  nd overwrites an
4500: 79 20 64 61 74 61 62 61 73 65 20 6f 72 20 0a 57  y database or .W
4510: 41 4c 20 64 61 74 61 20 74 68 61 74 20 74 68 65  AL data that the
4520: 20 72 65 61 64 2d 6f 6e 6c 79 20 63 6f 6e 6e 65   read-only conne
4530: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73 69  ction may be usi
4540: 6e 67 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74  ng. To achieve t
4550: 68 69 73 2c 20 61 0a 72 65 61 64 2d 6f 6e 6c 79  his, a.read-only
4560: 20 63 6c 69 65 6e 74 20 67 72 61 62 73 20 74 68   client grabs th
4570: 65 20 43 48 45 43 4b 50 4f 49 4e 54 45 52 20 6c  e CHECKPOINTER l
4580: 6f 63 6b 20 66 6f 72 20 74 68 65 20 64 75 72 61  ock for the dura
4590: 74 69 6f 6e 20 6f 66 20 69 74 73 20 0a 74 72 61  tion of its .tra
45a0: 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64  nsaction (includ
45b0: 69 6e 67 2c 20 69 66 20 72 65 71 75 69 72 65 64  ing, if required
45c0: 2c 20 74 68 65 20 70 61 72 74 20 77 68 65 72 65  , the part where
45d0: 20 69 74 20 62 75 69 6c 64 73 20 61 20 70 72 69   it builds a pri
45e0: 76 61 74 65 0a 77 61 6c 2d 69 6e 64 65 78 29 2e  vate.wal-index).
45f0: 20 48 6f 6c 64 69 6e 67 20 74 68 65 20 43 48 45   Holding the CHE
4600: 43 4b 50 4f 49 4e 54 45 52 20 6c 6f 63 6b 20 67  CKPOINTER lock g
4610: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 3a 0a  uarantees that:.
4620: 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 3c 70 3e 54  .<ul>.  <li><p>T
4630: 68 61 74 20 6e 6f 20 63 68 65 63 6b 70 6f 69 6e  hat no checkpoin
4640: 74 20 63 61 6e 20 62 65 20 72 75 6e 2e 20 45 6e  t can be run. En
4650: 73 75 72 69 6e 67 20 74 68 61 74 20 64 61 74 61  suring that data
4660: 62 61 73 65 20 70 61 67 65 73 20 69 6e 0a 20 20  base pages in.  
4670: 20 20 20 20 20 75 73 65 20 62 79 20 74 68 65 20       use by the 
4680: 72 65 61 64 2d 6f 6e 6c 79 20 63 6c 69 65 6e 74  read-only client
4690: 20 72 65 6d 61 69 6e 20 75 6e 64 69 73 74 75 72   remain undistur
46a0: 62 65 64 20 66 6f 72 20 74 68 65 20 64 75 72 61  bed for the dura
46b0: 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 20 20  tion of the.    
46c0: 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a     transaction..
46d0: 0a 20 20 3c 6c 69 3e 3c 70 3e 54 68 65 20 6c 6f  .  <li><p>The lo
46e0: 67 69 63 61 6c 20 63 6f 6e 74 65 6e 74 73 20 6f  gical contents o
46f0: 66 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 68  f the WAL file h
4700: 65 61 64 65 72 20 6d 61 79 20 6e 6f 74 20 62 65  eader may not be
4710: 20 6d 6f 64 69 66 69 65 64 2e 20 54 68 69 73 0a   modified. This.
4720: 20 20 20 20 20 20 20 65 6e 73 75 72 65 73 20 74         ensures t
4730: 68 61 74 20 69 66 20 61 20 77 72 69 74 65 72 20  hat if a writer 
4740: 70 72 6f 63 65 73 73 20 64 6f 65 73 20 77 72 61  process does wra
4750: 70 20 61 72 6f 75 6e 64 20 74 6f 20 74 68 65 20  p around to the 
4760: 73 74 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20  start of the.   
4770: 20 20 20 20 57 41 4c 20 66 69 6c 65 2c 20 69 74      WAL file, it
4780: 20 6d 61 79 20 6e 6f 74 20 6f 76 65 72 77 72 69   may not overwri
4790: 74 65 20 61 6e 79 20 57 41 4c 20 66 72 61 6d 65  te any WAL frame
47a0: 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73  s that may be us
47b0: 65 64 20 62 79 0a 20 20 20 20 20 20 20 74 68 65  ed by.       the
47c0: 20 72 65 61 64 2d 6f 6e 6c 79 20 63 6f 6e 6e 65   read-only conne
47d0: 63 74 69 6f 6e 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 70  ction..</ul>..<p
47e0: 3e 41 20 72 65 61 64 2d 6f 6e 6c 79 20 63 6c 69  >A read-only cli
47f0: 65 6e 74 20 6d 61 79 20 74 68 65 72 65 66 6f 72  ent may therefor
4800: 65 20 73 61 66 65 6c 79 20 72 65 61 64 20 66 72  e safely read fr
4810: 6f 6d 20 61 20 64 61 74 61 62 61 73 65 20 28 6c  om a database (l
4820: 69 76 65 20 0a 6f 72 20 68 61 6c 74 65 64 29 20  ive .or halted) 
4830: 70 72 6f 76 69 64 65 64 20 74 68 61 74 20 69 74  provided that it
4840: 20 6f 62 74 61 69 6e 73 20 61 20 73 68 61 72 65   obtains a share
4850: 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 43 48  d lock on the CH
4860: 45 43 4b 50 4f 49 4e 54 45 52 2e 20 49 66 0a 61  ECKPOINTER. If.a
4870: 20 77 61 6c 2d 69 6e 64 65 78 20 69 73 20 72 65   wal-index is re
4880: 71 75 69 72 65 64 2c 20 74 68 65 20 72 65 61 64  quired, the read
4890: 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20 69 74  er constructs it
48a0: 20 69 6e 20 68 65 61 70 20 6d 65 6d 6f 72 79 20   in heap memory 
48b0: 61 66 74 65 72 0a 6f 62 74 61 69 6e 69 6e 67 20  after.obtaining 
48c0: 74 68 65 20 43 48 45 43 4b 50 4f 49 4e 54 45 52  the CHECKPOINTER
48d0: 20 6c 6f 63 6b 2e 0a 0a 3c 68 34 20 69 64 3d 72   lock...<h4 id=r
48e0: 65 61 64 2d 6f 6e 6c 79 5f 63 6c 69 65 6e 74 73  ead-only_clients
48f0: 5f 61 6e 64 5f 6c 69 76 65 5f 64 61 74 61 62 61  _and_live_databa
4900: 73 65 73 3e 32 2e 31 2e 33 2e 36 2e 20 52 65 61  ses>2.1.3.6. Rea
4910: 64 2d 6f 6e 6c 79 20 43 6c 69 65 6e 74 73 20 61  d-only Clients a
4920: 6e 64 20 4c 69 76 65 20 44 61 74 61 62 61 73 65  nd Live Database
4930: 73 3c 2f 68 34 3e 0a 0a 3c 70 3e 52 65 61 64 2d  s</h4>..<p>Read-
4940: 6f 6e 6c 79 20 63 6c 69 65 6e 74 73 20 63 6f 75  only clients cou
4950: 6c 64 20 73 69 6d 70 6c 79 20 61 73 73 75 6d 65  ld simply assume
4960: 20 74 68 61 74 20 61 6c 6c 20 64 61 74 61 62 61   that all databa
4970: 73 65 73 20 61 72 65 20 68 61 6c 74 65 64 20 61  ses are halted a
4980: 6e 64 0a 73 61 66 65 6c 79 20 61 63 63 65 73 73  nd.safely access
4990: 20 74 68 65 6d 20 61 73 20 64 65 73 63 72 69 62   them as describ
49a0: 65 64 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  ed in the previo
49b0: 75 73 20 73 65 63 74 69 6f 6e 2e 20 48 6f 77 65  us section. Howe
49c0: 76 65 72 2c 20 74 68 69 73 20 69 73 0a 75 6e 64  ver, this is.und
49d0: 65 73 69 72 61 62 6c 65 20 61 73 20 28 61 29 20  esirable as (a) 
49e0: 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 20 61 6e  checkpointers an
49f0: 64 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e  d read-only tran
4a00: 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 6c  sactions will bl
4a10: 6f 63 6b 20 65 61 63 68 0a 6f 74 68 65 72 2c 20  ock each.other, 
4a20: 61 6e 64 20 28 62 29 20 72 65 63 6f 76 65 72 69  and (b) recoveri
4a30: 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
4a40: 6f 66 20 61 20 57 41 4c 20 66 69 6c 65 20 61 74  of a WAL file at
4a50: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
4a60: 66 0a 65 61 63 68 20 74 72 61 6e 73 61 63 74 69  f.each transacti
4a70: 6f 6e 20 77 69 6c 6c 20 64 65 67 72 61 64 65 20  on will degrade 
4a80: 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 0a 3c 70  performance...<p
4a90: 3e 53 69 6e 63 65 20 72 65 63 6f 76 65 72 79 20  >Since recovery 
4aa0: 69 73 20 6e 65 76 65 72 20 72 65 71 75 69 72 65  is never require
4ab0: 64 20 6f 6e 63 65 20 61 20 64 61 74 61 62 61 73  d once a databas
4ac0: 65 20 69 73 20 6c 69 76 65 2c 20 72 65 61 64 2d  e is live, read-
4ad0: 6f 6e 6c 79 20 0a 63 6c 69 65 6e 74 73 20 6d 61  only .clients ma
4ae0: 79 20 63 6f 6e 6e 65 63 74 20 74 6f 20 61 6e 64  y connect to and
4af0: 20 61 63 63 65 73 73 20 61 20 64 61 74 61 62 61   access a databa
4b00: 73 65 20 69 6e 20 6d 75 63 68 20 74 68 65 20 73  se in much the s
4b10: 61 6d 65 20 77 61 79 20 61 73 20 0a 72 65 61 64  ame way as .read
4b20: 2d 77 72 69 74 65 20 63 6c 69 65 6e 74 73 2e 20  -write clients. 
4b30: 54 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20  There are still 
4b40: 74 77 6f 20 64 69 66 66 65 72 65 6e 63 65 73 3a  two differences:
4b50: 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 3c 70 3e  ..<ul>.  <li><p>
4b60: 53 69 6e 63 65 20 61 20 72 65 61 64 2d 6f 6e 6c  Since a read-onl
4b70: 79 20 63 6c 69 65 6e 74 20 6d 61 79 20 6e 6f 74  y client may not
4b80: 20 61 74 74 65 6d 70 74 20 61 6e 20 45 58 43 4c   attempt an EXCL
4b90: 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 0a  USIVE lock, the.
4ba0: 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 2f 64 69 73    connection/dis
4bb0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 74 6f  connection proto
4bc0: 63 6f 6c 20 6d 75 73 74 20 62 65 20 63 68 61 6e  col must be chan
4bd0: 67 65 64 2c 20 61 6e 64 20 0a 0a 20 20 3c 6c 69  ged, and ..  <li
4be0: 3e 3c 70 3e 41 20 72 65 61 64 2d 6f 6e 6c 79 20  ><p>A read-only 
4bf0: 63 6c 69 65 6e 74 20 6d 61 79 20 6e 6f 74 20 6d  client may not m
4c00: 6f 64 69 66 79 20 74 68 65 20 76 61 6c 75 65 20  odify the value 
4c10: 73 74 6f 72 65 64 20 69 6e 20 61 20 72 65 61 64  stored in a read
4c20: 2d 6c 6f 63 6b 20 0a 20 20 73 6c 6f 74 2e 20 52  -lock .  slot. R
4c30: 65 61 64 2d 6f 6e 6c 79 20 63 6c 69 65 6e 74 73  ead-only clients
4c40: 20 6d 75 73 74 20 61 6c 77 61 79 73 20 75 73 65   must always use
4c50: 20 61 20 73 6c 6f 74 20 74 68 61 74 20 61 6c 72   a slot that alr
4c60: 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 0a 20  eady contains . 
4c70: 20 61 20 73 75 69 74 61 62 6c 65 20 76 61 6c 75   a suitable valu
4c80: 65 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e 54 6f 20  e..</ul>..<p>To 
4c90: 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 66 69  deal with the fi
4ca0: 72 73 74 20 70 72 6f 62 6c 65 6d 2c 20 74 68 69  rst problem, thi
4cb0: 73 20 64 65 73 69 67 6e 20 75 73 65 73 20 61 20  s design uses a 
4cc0: 62 6c 6f 63 6b 20 6f 66 20 4e 20 22 44 4d 53 33  block of N "DMS3
4cd0: 22 20 0a 6c 6f 63 6b 73 2c 20 77 68 65 72 65 20  " .locks, where 
4ce0: 4e 20 69 73 20 72 65 6c 61 74 69 76 65 6c 79 20  N is relatively 
4cf0: 6c 61 72 67 65 20 28 73 61 79 20 36 34 20 6f 72  large (say 64 or
4d00: 20 31 32 38 29 2c 20 61 6e 64 20 73 70 6c 69 74   128), and split
4d10: 73 20 74 68 65 20 44 4d 53 32 0a 6c 6f 63 6b 20  s the DMS2.lock 
4d20: 69 6e 74 6f 20 74 77 6f 20 73 65 70 61 72 61 74  into two separat
4d30: 65 20 6c 6f 63 6b 73 3a 20 22 44 4d 53 32 2f 52  e locks: "DMS2/R
4d40: 57 20 41 4e 44 20 44 4d 53 32 2f 52 4f 22 2e 20  W AND DMS2/RO". 
4d50: 0a 0a 3c 70 3e 57 68 65 6e 20 61 20 72 65 61 64  ..<p>When a read
4d60: 2d 77 72 69 74 65 20 63 6c 69 65 6e 74 20 63 6f  -write client co
4d70: 6e 6e 65 63 74 73 20 74 6f 20 74 68 65 20 64 61  nnects to the da
4d80: 74 61 62 61 73 65 2c 20 69 6d 6d 65 64 69 61 74  tabase, immediat
4d90: 65 6c 79 20 61 66 74 65 72 0a 6f 62 74 61 69 6e  ely after.obtain
4da0: 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
4db0: 6f 63 6b 20 6f 6e 20 44 4d 53 32 2c 20 69 74 20  ock on DMS2, it 
4dc0: 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 62 74 61  attempts to obta
4dd0: 69 6e 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  in an EXCLUSIVE 
4de0: 6c 6f 63 6b 20 6f 6e 0a 6f 6e 65 20 6f 66 20 74  lock on.one of t
4df0: 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
4e00: 44 4d 53 33 20 72 61 6e 67 65 2e 20 49 66 20 69  DMS3 range. If i
4e10: 74 20 63 61 6e 6e 6f 74 20 28 69 6e 64 69 63 61  t cannot (indica
4e20: 74 69 6e 67 20 74 68 61 74 20 74 68 65 72 65 20  ting that there 
4e30: 61 72 65 0a 61 6c 72 65 61 64 79 20 4e 20 72 65  are.already N re
4e40: 61 64 2d 77 72 69 74 65 20 63 6f 6e 6e 65 63 74  ad-write connect
4e50: 69 6f 6e 73 29 2c 20 74 68 65 6e 20 74 68 69 73  ions), then this
4e60: 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   is not an error
4e70: 2e 20 52 65 61 64 2d 6f 6e 6c 79 20 63 6c 69 65  . Read-only clie
4e80: 6e 74 73 0a 75 73 65 20 74 68 65 20 44 4d 53 33  nts.use the DMS3
4e90: 20 62 6c 6f 63 6b 20 74 6f 20 64 65 74 65 63 74   block to detect
4ea0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
4eb0: 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64  there are alread
4ec0: 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 72 65  y one or more.re
4ed0: 61 64 2d 77 72 69 74 65 20 63 6c 69 65 6e 74 73  ad-write clients
4ee0: 20 63 6f 6e 6e 65 63 74 65 64 2e 0a 0a 3c 70 72   connected...<pr
4ef0: 65 3e 0a 20 20 4c 6f 63 6b 28 44 4d 53 31 2c 20  e>.  Lock(DMS1, 
4f00: 53 48 41 52 45 44 29 20 20 20 20 20 20 20 20 20  SHARED)         
4f10: 20 20 20 2f 2a 20 62 6c 6f 63 6b 69 6e 67 20 6c     /* blocking l
4f20: 6f 63 6b 20 2a 2f 0a 20 20 20 20 4c 6f 63 6b 28  ock */.    Lock(
4f30: 44 4d 53 33 2e 2e 44 4d 53 33 2b 4e 2c 20 53 48  DMS3..DMS3+N, SH
4f40: 41 52 45 44 29 20 20 2f 2a 20 6e 6f 6e 2d 62 6c  ARED)  /* non-bl
4f50: 6f 63 6b 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20  ocking lock */. 
4f60: 20 20 20 69 66 28 20 75 6e 73 75 63 63 65 73 73     if( unsuccess
4f70: 66 75 6c 20 29 7b 20 0a 20 20 20 20 20 20 4c 6f  ful ){ .      Lo
4f80: 63 6b 28 44 4d 53 32 2f 52 4f 2c 20 53 48 41 52  ck(DMS2/RO, SHAR
4f90: 45 44 29 20 20 20 20 20 2f 2a 20 22 63 61 6e 6e  ED)     /* "cann
4fa0: 6f 74 22 20 66 61 69 6c 20 2a 2f 0a 20 20 20 20  ot" fail */.    
4fb0: 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
4fc0: 69 73 20 6e 6f 77 20 63 6f 6e 6e 65 63 74 65 64  is now connected
4fd0: 20 74 6f 20 61 20 6c 69 76 65 20 64 61 74 61 62   to a live datab
4fe0: 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 55  ase */.    }.  U
4ff0: 6e 6c 6f 63 6b 28 44 4d 53 31 29 0a 3c 2f 70 72  nlock(DMS1).</pr
5000: 65 3e 0a 0a 3c 70 3e 55 73 69 6e 67 20 74 68 65  e>..<p>Using the
5010: 20 61 62 6f 76 65 20 73 63 68 65 6d 65 2c 20 69   above scheme, i
5020: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
5030: 61 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  at a read-only c
5040: 6f 6e 6e 65 63 74 69 6f 6e 0a 69 6e 63 6f 72 72  onnection.incorr
5050: 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64 65 73 20  ectly concludes 
5060: 74 68 61 74 20 61 20 64 61 74 61 62 61 73 65 20  that a database 
5070: 69 73 20 68 61 6c 74 65 64 2e 20 54 68 69 73 20  is halted. This 
5080: 63 61 6e 20 68 61 70 70 65 6e 20 69 66 20 74 68  can happen if th
5090: 65 0a 6f 6e 6c 79 20 6f 74 68 65 72 20 63 6f 6e  e.only other con
50a0: 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  nections to the 
50b0: 64 61 74 61 62 61 73 65 20 61 72 65 20 65 69 74  database are eit
50c0: 68 65 72 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72  her read-only or
50d0: 20 65 6c 73 65 20 0a 72 65 61 64 2d 77 72 69 74   else .read-writ
50e0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
50f0: 61 74 20 66 61 69 6c 65 64 20 74 6f 20 67 72 61  at failed to gra
5100: 62 20 61 20 44 4d 53 33 20 6c 6f 63 6b 20 77 68  b a DMS3 lock wh
5110: 65 6e 20 63 6f 6e 6e 65 63 74 69 6e 67 2e 0a 0a  en connecting...
5120: 3c 70 3e 3c 69 3e 48 6f 77 20 69 73 20 74 68 65  <p><i>How is the
5130: 20 73 65 63 6f 6e 64 20 70 72 6f 62 6c 65 6d 20   second problem 
5140: 73 6f 6c 76 65 64 3f 20 43 61 6e 20 77 65 20 73  solved? Can we s
5150: 6f 6d 65 68 6f 77 20 67 75 61 72 61 6e 74 65 65  omehow guarantee
5160: 20 74 68 61 74 20 0a 20 20 74 68 65 72 65 20 69   that .  there i
5170: 73 20 61 6c 77 61 79 73 20 61 74 20 6c 65 61 73  s always at leas
5180: 74 20 6f 6e 65 20 75 73 61 62 6c 65 20 73 6c 6f  t one usable slo
5190: 74 20 61 76 61 69 6c 61 62 6c 65 3f 20 4f 72 20  t available? Or 
51a0: 61 20 66 61 6c 6c 62 61 63 6b 20 73 6c 6f 74 20  a fallback slot 
51b0: 0a 20 20 6c 6f 63 6b 65 64 20 74 6f 20 69 6e 64  .  locked to ind
51c0: 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 65  icate that the e
51d0: 6e 74 69 72 65 20 57 41 4c 20 6d 61 79 20 62 65  ntire WAL may be
51e0: 20 69 6e 20 75 73 65 2e 3c 2f 69 3e 0a 0a 3c 68   in use.</i>..<h
51f0: 32 20 69 64 3d 62 2d 74 72 65 65 5f 6c 65 76 65  2 id=b-tree_leve
5200: 6c 5f 63 68 61 6e 67 65 73 3e 32 2e 32 2e 20 42  l_changes>2.2. B
5210: 2d 54 72 65 65 20 4c 65 76 65 6c 20 43 68 61 6e  -Tree Level Chan
5220: 67 65 73 3c 2f 68 32 3e 0a 3c 68 33 20 69 64 3d  ges</h2>.<h3 id=
5230: 66 72 65 65 5f 70 61 67 65 5f 6d 61 6e 61 67 65  free_page_manage
5240: 6d 65 6e 74 3e 32 2e 32 2e 31 2e 20 46 72 65 65  ment>2.2.1. Free
5250: 20 50 61 67 65 20 4d 61 6e 61 67 65 6d 65 6e 74   Page Management
5260: 3c 2f 68 33 3e 0a 0a 3c 69 3e 0a 20 20 3c 70 3e  </h3>..<i>.  <p>
5270: 20 42 69 74 6d 61 70 73 3f 20 41 20 6c 69 6e 6b   Bitmaps? A link
5280: 65 64 2d 6c 69 73 74 20 73 69 6d 69 6c 61 72 20  ed-list similar 
5290: 74 6f 20 53 51 4c 69 74 65 3f 20 4f 74 68 65 72  to SQLite? Other
52a0: 3f 20 57 68 69 63 68 20 66 72 65 65 2d 6c 69 73  ? Which free-lis
52b0: 74 20 75 73 65 0a 20 20 63 61 73 65 73 20 63 6f  t use.  cases co
52c0: 75 6c 64 20 62 65 20 69 6d 70 72 6f 76 65 64 3f  uld be improved?
52d0: 20 20 0a 3c 2f 69 3e 0a 0a 3c 75 6c 3e 0a 20 20    .</i>..<ul>.  
52e0: 3c 6c 69 3e 20 46 72 65 65 20 61 20 70 61 67 65  <li> Free a page
52f0: 2e 0a 20 20 3c 6c 69 3e 20 41 6c 6c 6f 63 61 74  ..  <li> Allocat
5300: 65 20 61 20 70 61 67 65 2e 0a 20 20 3c 6c 69 3e  e a page..  <li>
5310: 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63   Allocate a bloc
5320: 6b 20 6f 66 20 70 61 67 65 73 2e 0a 20 20 3c 6c  k of pages..  <l
5330: 69 3e 20 51 75 65 72 79 20 74 6f 20 73 65 65 20  i> Query to see 
5340: 69 66 20 61 20 67 69 76 65 6e 20 70 61 67 65 20  if a given page 
5350: 69 73 20 66 72 65 65 3f 20 44 6f 65 73 20 74 68  is free? Does th
5360: 69 73 20 68 65 6c 70 20 77 69 74 68 20 61 6e 20  is help with an 
5370: 0a 20 20 20 20 20 20 20 69 6e 63 72 2d 76 61 63  .       incr-vac
5380: 75 75 6d 20 6c 69 6b 65 20 63 61 70 61 62 69 6c  uum like capabil
5390: 69 74 79 3f 0a 3c 2f 75 6c 3e 0a 0a 74 72 65 65  ity?.</ul>..tree
53a0: 20 70 61 67 65 73 2e 0a 66 72 65 65 20 70 61 67   pages..free pag
53b0: 65 73 2e 0a 6f 76 65 72 66 6c 6f 77 20 70 61 67  es..overflow pag
53c0: 65 73 2e 0a 0a 3c 68 33 20 69 64 3d 6c 61 72 67  es...<h3 id=larg
53d0: 65 5f 72 65 63 6f 72 64 73 3e 32 2e 32 2e 32 2e  e_records>2.2.2.
53e0: 20 4c 61 72 67 65 20 52 65 63 6f 72 64 73 3c 2f   Large Records</
53f0: 68 33 3e 0a 0a 3c 70 3e 20 54 68 65 20 74 72 65  h3>..<p> The tre
5400: 65 20 69 73 20 61 20 62 2b 74 72 65 65 2c 20 73  e is a b+tree, s
5410: 6f 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  o there are two 
5420: 74 79 70 65 73 20 6f 66 20 72 65 63 6f 72 64 73  types of records
5430: 20 74 6f 20 63 6f 6e 73 69 64 65 72 3a 0a 0a 3c   to consider:..<
5440: 75 6c 3e 0a 20 20 3c 6c 69 3e 4b 65 79 20 70 72  ul>.  <li>Key pr
5450: 65 66 69 78 65 73 20 73 74 6f 72 65 64 20 6f 6e  efixes stored on
5460: 20 69 6e 74 65 72 6e 61 6c 20 74 72 65 65 20 70   internal tree p
5470: 61 67 65 73 2e 0a 20 20 3c 6c 69 3e 52 65 61 6c  ages..  <li>Real
5480: 20 6b 65 79 2f 76 61 6c 75 65 20 70 61 69 72 73   key/value pairs
5490: 20 73 74 6f 72 65 64 20 6f 6e 20 6c 65 61 66 20   stored on leaf 
54a0: 70 61 67 65 73 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 70  pages..</ul>..<p
54b0: 3e 20 54 68 65 20 69 6e 74 65 72 6e 61 6c 20 74  > The internal t
54c0: 72 65 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ree is populated
54d0: 20 62 79 20 61 20 73 65 74 20 6f 66 20 6b 65 79   by a set of key
54e0: 2d 70 72 65 66 69 78 65 73 20 73 75 63 68 20 74  -prefixes such t
54f0: 68 61 74 20 66 6f 72 0a 65 61 63 68 20 70 61 69  hat for.each pai
5500: 72 20 6f 66 20 61 64 6a 61 63 65 6e 74 20 6c 65  r of adjacent le
5510: 61 66 20 70 61 67 65 73 20 74 68 65 72 65 20 65  af pages there e
5520: 78 69 73 74 73 20 65 78 61 63 74 6c 79 20 6f 6e  xists exactly on
5530: 65 20 6b 65 79 2d 70 72 65 66 69 78 20 77 69 74  e key-prefix wit
5540: 68 69 6e 20 0a 74 68 65 20 69 6e 74 65 72 6e 61  hin .the interna
5550: 6c 20 74 72 65 65 20 74 68 61 74 20 69 73 20 6c  l tree that is l
5560: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
5570: 6c 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 73  l to the smalles
5580: 74 20 6b 65 79 20 6f 6e 20 6f 6e 65 20 6f 66 20  t key on one of 
5590: 0a 74 68 65 20 6c 65 61 76 65 73 20 61 6e 64 20  .the leaves and 
55a0: 6c 61 72 67 65 72 20 74 68 61 6e 20 61 6c 6c 20  larger than all 
55b0: 74 68 65 20 6b 65 79 73 20 6f 6e 20 74 68 65 20  the keys on the 
55c0: 6f 74 68 65 72 2e 20 49 66 20 61 6e 79 20 73 75  other. If any su
55d0: 63 68 20 6b 65 79 2d 70 72 65 66 69 78 20 0a 69  ch key-prefix .i
55e0: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 4e 20  s larger than N 
55f0: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69  bytes in size, i
5600: 74 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f  t is omitted fro
5610: 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 74  m the internal t
5620: 72 65 65 2e 20 57 68 65 6e 0a 74 68 65 20 6b 65  ree. When.the ke
5630: 79 2d 70 72 65 66 69 78 20 69 73 20 72 65 71 75  y-prefix is requ
5640: 69 72 65 64 20 28 61 73 20 70 61 72 74 20 6f 66  ired (as part of
5650: 20 61 20 73 65 65 6b 20 6f 72 20 72 65 62 61 6c   a seek or rebal
5660: 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ancing operation
5670: 29 2c 20 69 74 0a 69 73 20 69 6e 73 74 65 61 64  ), it.is instead
5680: 20 72 65 61 64 20 64 79 6e 61 6d 69 63 61 6c 6c   read dynamicall
5690: 79 20 66 72 6f 6d 20 74 68 65 20 6c 65 61 66 20  y from the leaf 
56a0: 70 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  page containing 
56b0: 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79  the smallest key
56c0: 73 0a 6c 61 72 67 65 72 20 74 68 61 6e 20 6f 72  s.larger than or
56d0: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6f 6d   equal to the om
56e0: 69 74 74 65 64 20 6b 65 79 2d 70 72 65 66 69 78  itted key-prefix
56f0: 2e 20 54 68 69 73 20 6c 65 61 66 20 6d 61 79 20  . This leaf may 
5700: 62 65 20 66 6f 75 6e 64 20 62 79 0a 66 6f 6c 6c  be found by.foll
5710: 6f 77 69 6e 67 20 74 68 65 20 65 78 69 73 74 69  owing the existi
5720: 6e 67 20 74 72 65 65 20 70 6f 69 6e 74 65 72 73  ng tree pointers
5730: 2e 20 4e 20 69 73 20 73 65 6c 65 63 74 65 64 20  . N is selected 
5740: 73 6f 20 61 73 20 74 6f 20 67 75 61 72 61 6e 74  so as to guarant
5750: 65 65 20 61 0a 6d 69 6e 69 6d 75 6d 20 69 6e 74  ee a.minimum int
5760: 65 72 6e 61 6c 20 66 61 6e 6f 75 74 20 6f 66 20  ernal fanout of 
5770: 28 73 61 79 29 20 34 20 6f 72 20 38 2e 0a 0a 3c  (say) 4 or 8...<
5780: 70 3e 41 6e 79 20 72 65 61 6c 20 6b 65 79 2f 76  p>Any real key/v
5790: 61 6c 75 65 20 70 61 69 72 20 74 68 61 74 20 69  alue pair that i
57a0: 73 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20  s too large for 
57b0: 61 20 73 69 6e 67 6c 65 20 6c 65 61 66 20 70 61  a single leaf pa
57c0: 67 65 20 69 73 0a 73 70 72 65 61 64 20 61 63 72  ge is.spread acr
57d0: 6f 73 73 20 74 68 65 20 6c 65 61 66 20 61 6e 64  oss the leaf and
57e0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
57f0: 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 4f 76 65  rflow pages. Ove
5800: 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a  rflow pages are.
5810: 6f 72 67 61 6e 69 7a 65 64 20 64 69 66 66 65 72  organized differ
5820: 65 6e 74 6c 79 20 74 6f 20 74 68 6f 73 65 20 69  ently to those i
5830: 6e 20 53 51 4c 69 74 65 20 77 69 74 68 20 74 68  n SQLite with th
5840: 72 65 65 20 67 6f 61 6c 73 20 69 6e 20 6d 69 6e  ree goals in min
5850: 64 3a 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 20  d:..<ul>.  <li> 
5860: 54 6f 20 6d 61 6b 65 20 72 61 6e 64 6f 6d 20 61  To make random a
5870: 63 63 65 73 73 20 74 6f 20 6f 66 66 73 65 74 73  ccess to offsets
5880: 20 77 69 74 68 69 6e 20 6c 61 72 67 65 20 76 61   within large va
5890: 6c 75 65 73 20 6d 6f 72 65 20 65 66 66 69 63 69  lues more effici
58a0: 65 6e 74 2c 20 61 6e 64 0a 20 20 3c 6c 69 3e 20  ent, and.  <li> 
58b0: 54 6f 20 6d 61 6b 65 20 69 74 20 70 6f 73 73 69  To make it possi
58c0: 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 64 61  ble to append da
58d0: 74 61 20 74 6f 20 61 6e 20 65 78 69 73 74 69 6e  ta to an existin
58e0: 67 20 76 61 6c 75 65 20 77 69 74 68 6f 75 74 0a  g value without.
58f0: 20 20 20 20 20 20 20 72 65 77 72 69 74 69 6e 67         rewriting
5900: 20 61 6c 6c 20 63 6f 6e 73 74 69 74 75 65 6e 74   all constituent
5910: 20 70 61 67 65 73 2e 0a 20 20 3c 6c 69 3e 20 54   pages..  <li> T
5920: 6f 20 6d 61 6b 65 20 69 74 20 70 6f 73 73 69 62  o make it possib
5930: 6c 65 20 74 6f 20 73 74 6f 72 65 20 6c 61 72 67  le to store larg
5940: 65 20 6f 62 6a 65 63 74 73 20 63 6f 6e 74 69 67  e objects contig
5950: 75 6f 75 73 6c 79 20 77 69 74 68 69 6e 20 74 68  uously within th
5960: 65 0a 20 20 20 20 20 20 20 64 61 74 61 62 61 73  e.       databas
5970: 65 20 66 69 6c 65 2e 20 53 6f 20 74 68 61 74 20  e file. So that 
5980: 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6d  if the file is m
5990: 65 6d 6f 72 79 20 6d 61 70 70 65 64 2c 20 61 20  emory mapped, a 
59a0: 70 6f 69 6e 74 65 72 20 74 6f 0a 20 20 20 20 20  pointer to.     
59b0: 20 20 74 68 65 20 6f 62 6a 65 63 74 20 63 61 6e    the object can
59c0: 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20   be returned to 
59d0: 74 68 65 20 75 73 65 72 20 77 69 74 68 6f 75 74  the user without
59e0: 20 63 6f 70 79 69 6e 67 20 69 74 20 69 6e 74 6f   copying it into
59f0: 0a 20 20 20 20 20 20 20 68 65 61 70 20 6d 65 6d  .       heap mem
5a00: 6f 72 79 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 69 3e 0a  ory..</ul>..<i>.
5a10: 20 20 3c 70 3e 20 49 6e 6f 64 65 2d 73 74 79 6c    <p> Inode-styl
5a20: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
5a30: 20 28 69 6e 73 74 65 61 64 20 6f 66 20 61 20 6c   (instead of a l
5a40: 69 6e 6b 65 64 20 6c 69 73 74 29 3f 0a 3c 2f 69  inked list)?.</i
5a50: 3e 0a 0a 3c 69 3e 0a 20 20 3c 70 3e 20 4f 72 20  >..<i>.  <p> Or 
5a60: 61 20 73 69 6e 67 6c 65 20 70 6f 69 6e 74 65 72  a single pointer
5a70: 20 6f 6e 20 74 68 65 20 69 6e 6f 64 65 20 74 6f   on the inode to
5a80: 20 61 20 74 72 65 65 20 6f 66 20 6f 76 65 72 66   a tree of overf
5a90: 6c 6f 77 20 70 61 67 65 73 2e 0a 3c 2f 69 3e 0a  low pages..</i>.
5aa0: 0a 3c 68 33 20 69 64 3d 62 2d 74 72 65 65 5f 70  .<h3 id=b-tree_p
5ab0: 61 67 65 5f 66 6f 72 6d 61 74 3e 32 2e 32 2e 33  age_format>2.2.3
5ac0: 2e 20 42 2d 54 72 65 65 20 50 61 67 65 20 46 6f  . B-Tree Page Fo
5ad0: 72 6d 61 74 3c 2f 68 33 3e 0a 0a 3c 75 6c 3e 0a  rmat</h3>..<ul>.
5ae0: 20 20 3c 6c 69 3e 3c 70 3e 20 4d 61 6b 65 20 69    <li><p> Make i
5af0: 74 20 65 61 73 79 20 74 6f 20 61 76 6f 69 64 20  t easy to avoid 
5b00: 6f 76 65 72 72 65 61 64 73 2e 0a 20 20 3c 6c 69  overreads..  <li
5b10: 3e 3c 70 3e 20 4d 61 6b 65 20 62 69 6e 61 72 79  ><p> Make binary
5b20: 20 73 65 61 72 63 68 65 73 20 61 73 20 66 61 73   searches as fas
5b30: 74 20 61 73 20 70 6f 73 73 69 62 6c 65 2e 0a 3c  t as possible..<
5b40: 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20 20 45 61 63 68  /ul>..<p>.  Each
5b50: 20 62 2d 74 72 65 65 20 70 61 67 65 20 68 61 73   b-tree page has
5b60: 20 61 20 66 69 78 65 64 2d 73 69 7a 65 20 68 65   a fixed-size he
5b70: 61 64 65 72 20 61 6e 64 20 61 20 76 61 72 69 61  ader and a varia
5b80: 62 6c 65 2d 73 69 7a 65 64 20 66 6f 6f 74 65 72  ble-sized footer
5b90: 2e 20 54 68 65 0a 20 20 70 75 72 70 6f 73 65 20  . The.  purpose 
5ba0: 6f 66 20 6d 6f 76 69 6e 67 20 73 6f 6d 65 20 68  of moving some h
5bb0: 65 61 64 65 72 20 64 61 74 61 20 74 6f 20 61 20  eader data to a 
5bc0: 66 6f 6f 74 65 72 20 69 73 20 74 6f 20 70 72 65  footer is to pre
5bd0: 76 65 6e 74 20 62 75 66 66 65 72 20 6f 76 65 72  vent buffer over
5be0: 72 65 61 64 73 0a 20 20 6f 63 63 75 72 69 6e 67  reads.  occuring
5bf0: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
5c00: 67 20 74 6f 20 72 65 61 64 20 76 61 72 69 6e 74  g to read varint
5c10: 20 66 69 65 6c 64 73 20 66 72 6f 6d 20 74 68 65   fields from the
5c20: 20 62 6f 64 79 20 6f 66 20 61 20 63 6f 72 72 75   body of a corru
5c30: 70 74 0a 20 20 62 2d 74 72 65 65 20 70 61 67 65  pt.  b-tree page
5c40: 2e 0a 0a 3c 68 34 20 69 64 3d 70 61 67 65 5f 66  ...<h4 id=page_f
5c50: 6f 72 6d 61 74 73 3e 32 2e 32 2e 33 2e 37 2e 20  ormats>2.2.3.7. 
5c60: 50 61 67 65 20 46 6f 72 6d 61 74 73 3c 2f 68 34  Page Formats</h4
5c70: 3e 0a 0a 3c 70 3e 3c 62 3e 50 61 67 65 20 48 65  >..<p><b>Page He
5c80: 61 64 65 72 3c 2f 62 3e 0a 0a 3c 70 3e 50 61 67  ader</b>..<p>Pag
5c90: 65 20 68 65 61 64 65 72 73 20 61 72 65 20 73 69  e headers are si
5ca0: 6d 69 6c 61 72 20 74 6f 20 74 68 6f 73 65 20 69  milar to those i
5cb0: 6e 20 53 51 4c 69 74 65 33 3a 20 0a 0a 3c 75 6c  n SQLite3: ..<ul
5cc0: 3e 0a 20 20 3c 6c 69 3e 20 31 20 62 79 74 65 20  >.  <li> 1 byte 
5cd0: 2d 20 66 6c 61 67 73 2e 0a 20 20 3c 6c 69 3e 20  - flags..  <li> 
5ce0: 49 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 20 6f  Internal nodes o
5cf0: 6e 6c 79 3a 20 34 20 62 79 74 65 73 20 2d 20 50  nly: 4 bytes - P
5d00: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 69  age number of ri
5d10: 67 68 74 6d 6f 73 74 20 63 68 69 6c 64 20 6e 6f  ghtmost child no
5d20: 64 65 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e 3c 62  de..</ul>..<p><b
5d30: 3e 50 61 67 65 20 46 6f 6f 74 65 72 3c 2f 62 3e  >Page Footer</b>
5d40: 0a 0a 3c 70 3e 20 53 74 61 72 74 69 6e 67 20 66  ..<p> Starting f
5d50: 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74  rom the end of t
5d60: 68 65 20 70 61 67 65 2c 20 74 68 65 20 66 69 65  he page, the fie
5d70: 6c 64 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  lds in the page 
5d80: 66 6f 6f 74 65 72 20 61 72 65 3a 0a 0a 3c 75 6c  footer are:..<ul
5d90: 3e 0a 20 20 3c 6c 69 3e 20 32 20 62 79 74 65 73  >.  <li> 2 bytes
5da0: 20 2d 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c   - Number of cel
5db0: 6c 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2e  ls on this page.
5dc0: 0a 20 20 3c 6c 69 3e 20 32 20 62 79 74 65 73 20  .  <li> 2 bytes 
5dd0: 2d 20 54 6f 74 61 6c 20 66 72 65 65 20 73 70 61  - Total free spa
5de0: 63 65 20 6f 6e 20 70 61 67 65 2c 20 69 6e 20 62  ce on page, in b
5df0: 79 74 65 73 2e 0a 20 20 3c 6c 69 3e 20 32 20 62  ytes..  <li> 2 b
5e00: 79 74 65 73 20 2d 20 4f 66 66 73 65 74 20 6f 66  ytes - Offset of
5e10: 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65   first byte afte
5e20: 72 20 6c 61 73 74 20 63 65 6c 6c 2e 0a 20 20 3c  r last cell..  <
5e30: 6c 69 3e 20 32 20 62 79 74 65 73 20 66 6f 72 20  li> 2 bytes for 
5e40: 65 61 63 68 20 63 65 6c 6c 20 2d 20 74 68 65 20  each cell - the 
5e50: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
5e60: 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  art of the cell.
5e70: 0a 3c 2f 75 6c 3e 0a 0a 3c 68 34 20 69 64 3d 63  .</ul>..<h4 id=c
5e80: 65 6c 6c 5f 66 6f 72 6d 61 74 73 3e 32 2e 32 2e  ell_formats>2.2.
5e90: 33 2e 38 2e 20 43 65 6c 6c 20 46 6f 72 6d 61 74  3.8. Cell Format
5ea0: 73 3c 2f 68 34 3e 0a 0a 3c 70 3e 3c 62 3e 42 2d  s</h4>..<p><b>B-
5eb0: 54 72 65 65 20 4e 6f 64 65 73 3c 2f 62 3e 0a 0a  Tree Nodes</b>..
5ec0: 3c 70 3e 43 65 6c 6c 20 66 6f 72 6d 61 74 3a 0a  <p>Cell format:.
5ed0: 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 20 4e 75 6d  .<ul>.  <li> Num
5ee0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
5ef0: 74 68 65 20 6b 65 79 2d 70 72 65 66 69 78 20 28  the key-prefix (
5f00: 6e 4b 65 79 29 2c 20 61 73 20 61 20 76 61 72 69  nKey), as a vari
5f10: 6e 74 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 6b  nt. Or, if the k
5f20: 65 79 2d 70 72 65 66 69 78 20 66 6f 72 0a 20 20  ey-prefix for.  
5f30: 20 20 20 20 20 74 68 69 73 20 63 65 6c 6c 20 69       this cell i
5f40: 73 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62  s too large to b
5f50: 65 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69  e stored on an i
5f60: 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 28 73 65  nternal node (se
5f70: 65 20 61 62 6f 76 65 29 2c 20 7a 65 72 6f 2e 0a  e above), zero..
5f80: 20 20 3c 6c 69 3e 20 6e 4b 65 79 20 62 79 74 65    <li> nKey byte
5f90: 73 20 6f 66 20 6b 65 79 20 64 61 74 61 2e 0a 20  s of key data.. 
5fa0: 20 3c 6c 69 3e 20 50 61 67 65 20 6e 75 6d 62 65   <li> Page numbe
5fb0: 72 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65  r of b-tree page
5fc0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6b 65 79 73   containing keys
5fd0: 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 73 6d 61   equal to or sma
5fe0: 6c 6c 65 72 20 74 68 61 6e 20 0a 20 20 20 20 20  ller than .     
5ff0: 20 20 74 68 65 20 6b 65 79 2d 70 72 65 66 69 78    the key-prefix
6000: 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 3c 2f   as a varint..</
6010: 75 6c 3e 0a 0a 3c 70 3e 3c 62 3e 42 2d 54 72 65  ul>..<p><b>B-Tre
6020: 65 20 4c 65 61 76 65 73 3c 2f 62 3e 0a 0a 3c 70  e Leaves</b>..<p
6030: 3e 43 65 6c 6c 20 66 6f 72 6d 61 74 3a 0a 0a 3c  >Cell format:..<
6040: 70 3e 54 68 65 72 65 20 61 72 65 20 74 68 72 65  p>There are thre
6050: 65 20 74 79 70 65 73 20 6f 66 20 63 65 6c 6c 73  e types of cells
6060: 20 6f 6e 20 62 2d 74 72 65 65 20 6c 65 61 76 65   on b-tree leave
6070: 73 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  s, depending on 
6080: 68 6f 77 20 6f 76 65 72 66 6c 6f 77 0a 70 61 67  how overflow.pag
6090: 65 73 20 61 72 65 20 75 73 65 64 20 2d 20 28 61  es are used - (a
60a0: 29 20 63 65 6c 6c 73 20 74 68 61 74 20 64 6f 20  ) cells that do 
60b0: 6e 6f 74 20 75 73 65 20 6f 76 65 72 66 6c 6f 77  not use overflow
60c0: 20 70 61 67 65 73 20 61 74 20 61 6c 6c 2c 20 28   pages at all, (
60d0: 62 29 20 63 65 6c 6c 73 0a 74 68 61 74 20 75 73  b) cells.that us
60e0: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
60f0: 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f   for the value o
6100: 6e 6c 79 2c 20 61 6e 64 20 28 63 29 20 63 65 6c  nly, and (c) cel
6110: 6c 73 20 74 68 61 74 20 75 73 65 20 6f 76 65 72  ls that use over
6120: 66 6c 6f 77 0a 70 61 67 65 73 20 66 6f 72 20 74  flow.pages for t
6130: 68 65 20 6b 65 79 20 61 6e 64 20 76 61 6c 75 65  he key and value
6140: 2e 0a 0a 3c 70 3e 43 65 6c 6c 20 74 79 70 65 20  ...<p>Cell type 
6150: 28 61 29 3a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e  (a):.<ul>.  <li>
6160: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
6170: 20 6f 66 20 74 68 65 20 65 6e 74 72 69 65 73 20   of the entries 
6180: 6b 65 79 20 28 6e 4b 65 79 29 2c 20 61 73 20 61  key (nKey), as a
6190: 20 76 61 72 69 6e 74 2e 0a 20 20 3c 6c 69 3e 20   varint..  <li> 
61a0: 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b 65  nKey bytes of ke
61b0: 79 20 64 61 74 61 2e 0a 20 20 3c 6c 69 3e 20 4e  y data..  <li> N
61c0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
61d0: 6e 20 65 6e 74 72 69 65 73 20 76 61 6c 75 65 20  n entries value 
61e0: 70 6c 75 73 20 74 77 6f 20 28 6e 56 61 6c 75 65  plus two (nValue
61f0: 2b 32 29 2c 20 61 73 20 61 20 76 61 72 69 6e 74  +2), as a varint
6200: 2e 20 4f 72 2c 0a 20 20 20 20 20 20 20 66 6f 72  . Or,.       for
6210: 20 61 20 64 65 6c 65 74 65 20 6b 65 79 2c 20 61   a delete key, a
6220: 20 73 69 6e 67 6c 65 20 30 78 30 31 20 62 79 74   single 0x01 byt
6230: 65 2e 0a 20 20 3c 6c 69 3e 20 55 6e 6c 65 73 73  e..  <li> Unless
6240: 20 74 68 69 73 20 69 73 20 61 20 64 65 6c 65 74   this is a delet
6250: 65 20 6b 65 79 2c 20 6e 56 61 6c 75 65 20 62 79  e key, nValue by
6260: 74 65 73 20 6f 66 20 76 61 6c 75 65 20 64 61 74  tes of value dat
6270: 61 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e 43 65 6c  a..</ul>..<p>Cel
6280: 6c 20 74 79 70 65 20 28 62 29 3a 0a 3c 75 6c 3e  l type (b):.<ul>
6290: 0a 20 20 3c 6c 69 3e 20 4e 75 6d 62 65 72 20 6f  .  <li> Number o
62a0: 66 20 62 79 74 65 73 20 69 6e 20 65 6e 74 72 69  f bytes in entri
62b0: 65 73 20 6b 65 79 20 28 6e 4b 65 79 29 2c 20 61  es key (nKey), a
62c0: 73 20 61 20 76 61 72 69 6e 74 2e 0a 20 20 3c 6c  s a varint..  <l
62d0: 69 3e 20 6e 4b 65 79 20 62 79 74 65 73 20 6f 66  i> nKey bytes of
62e0: 20 6b 65 79 20 64 61 74 61 2e 0a 20 20 3c 6c 69   key data..  <li
62f0: 3e 20 53 69 6e 67 6c 65 20 30 78 30 30 20 62 79  > Single 0x00 by
6300: 74 65 2e 0a 20 20 3c 6c 69 3e 20 4e 75 6d 62 65  te..  <li> Numbe
6310: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 65 6e  r of bytes in en
6320: 74 72 69 65 73 20 76 61 6c 75 65 20 73 74 6f 72  tries value stor
6330: 65 64 20 6c 6f 63 61 6c 6c 79 20 28 6e 4c 56 61  ed locally (nLVa
6340: 6c 29 2c 20 61 73 20 61 20 76 61 72 69 6e 74 2e  l), as a varint.
6350: 0a 20 20 3c 6c 69 3e 20 6e 4c 56 61 6c 20 62 79  .  <li> nLVal by
6360: 74 65 73 20 6f 66 20 76 61 6c 75 65 20 64 61 74  tes of value dat
6370: 61 2e 0a 20 20 3c 6c 69 3e 20 4e 75 6d 62 65 72  a..  <li> Number
6380: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 65 6e 74   of bytes in ent
6390: 72 69 65 73 20 76 61 6c 75 65 20 73 74 6f 72 65  ries value store
63a0: 64 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  d on overflow pa
63b0: 67 65 73 2c 20 61 73 20 61 20 76 61 72 69 6e 74  ges, as a varint
63c0: 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e 43 65 6c 6c  ..</ul>..<p>Cell
63d0: 20 74 79 70 65 20 28 63 29 3a 0a 3c 75 6c 3e 0a   type (c):.<ul>.
63e0: 20 20 3c 6c 69 3e 20 53 69 6e 67 6c 65 20 30 78    <li> Single 0x
63f0: 30 30 20 62 79 74 65 2e 0a 20 20 3c 6c 69 3e 20  00 byte..  <li> 
6400: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
6410: 6f 66 20 74 68 65 20 65 6e 74 72 69 65 73 20 6b  of the entries k
6420: 65 79 20 28 6e 4c 6f 63 61 6c 4b 65 79 29 20 73  ey (nLocalKey) s
6430: 74 6f 72 65 64 20 6c 6f 63 61 6c 6c 79 2c 20 0a  tored locally, .
6440: 20 20 20 20 20 20 20 61 73 20 61 20 76 61 72 69         as a vari
6450: 6e 74 2e 0a 20 20 3c 6c 69 3e 20 6e 4c 6f 63 61  nt..  <li> nLoca
6460: 6c 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b 65  lKey bytes of ke
6470: 79 20 64 61 74 61 2e 0a 20 20 3c 6c 69 3e 20 4e  y data..  <li> N
6480: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
6490: 66 20 74 68 65 20 65 6e 74 72 69 65 73 20 6b 65  f the entries ke
64a0: 79 20 73 74 6f 72 65 64 20 6f 6e 20 6f 76 65 72  y stored on over
64b0: 66 6c 6f 77 20 70 61 67 65 73 2c 20 61 73 20 61  flow pages, as a
64c0: 20 76 61 72 69 6e 74 2e 0a 20 20 3c 6c 69 3e 20   varint..  <li> 
64d0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
64e0: 69 6e 20 74 68 65 20 65 6e 74 72 69 65 73 20 76  in the entries v
64f0: 61 6c 75 65 20 70 6c 75 73 20 6f 6e 65 20 28 6e  alue plus one (n
6500: 56 61 6c 75 65 2b 31 29 2c 20 61 73 20 61 20 76  Value+1), as a v
6510: 61 72 69 6e 74 2e 0a 20 20 20 20 20 20 20 4f 72  arint..       Or
6520: 2c 20 66 6f 72 20 61 20 64 65 6c 65 74 65 20 6b  , for a delete k
6530: 65 79 2c 20 61 20 73 69 6e 67 6c 65 20 30 78 30  ey, a single 0x0
6540: 30 20 62 79 74 65 2e 0a 3c 2f 75 6c 3e 0a 0a 3c  0 byte..</ul>..<
6550: 70 3e 43 65 6c 6c 20 74 79 70 65 73 20 28 62 29  p>Cell types (b)
6560: 20 61 6e 64 20 28 63 29 20 61 72 65 20 66 6f 6c   and (c) are fol
6570: 6c 6f 77 65 64 20 62 79 20 61 6e 20 61 72 72 61  lowed by an arra
6580: 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  y of pointers to
6590: 20 6f 76 65 72 66 6c 6f 77 0a 70 61 67 65 73 2e   overflow.pages.
65a0: 20 54 68 65 20 6f 76 65 72 66 6c 6f 77 20 64 61   The overflow da
65b0: 74 61 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ta for a single 
65c0: 65 6e 74 72 79 20 69 73 20 64 69 73 74 72 69 62  entry is distrib
65d0: 75 74 65 64 20 62 65 74 77 65 65 6e 20 75 70 20  uted between up 
65e0: 74 6f 20 31 36 0a 22 64 69 72 65 63 74 22 20 6f  to 16."direct" o
65f0: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 6e  verflow pages an
6600: 64 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66  d a single overf
6610: 6c 6f 77 20 74 72 65 65 2e 20 41 20 64 69 72 65  low tree. A dire
6620: 63 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ct overflow page
6630: 0a 69 73 20 6a 75 73 74 20 74 68 61 74 20 2d 20  .is just that - 
6640: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
6650: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 74 68  overflow page th
6660: 61 74 20 63 6f 6e 74 61 69 6e 73 20 64 61 74 61  at contains data
6670: 2e 20 41 6e 20 6f 76 65 72 66 6c 6f 77 0a 22 74  . An overflow."t
6680: 72 65 65 22 20 69 73 20 61 20 74 72 65 65 20 73  ree" is a tree s
6690: 74 72 75 63 74 75 72 65 20 77 68 65 72 65 20 6c  tructure where l
66a0: 65 61 76 65 73 20 63 6f 6e 74 61 69 6e 20 6f 76  eaves contain ov
66b0: 65 72 66 6c 6f 77 20 64 61 74 61 20 61 6e 64 20  erflow data and 
66c0: 6e 6f 64 65 73 20 0a 63 6f 6e 74 61 69 6e 20 70  nodes .contain p
66d0: 6f 69 6e 74 65 72 73 20 74 6f 20 6c 65 61 76 65  ointers to leave
66e0: 73 20 6f 72 20 73 75 62 2d 74 72 65 65 73 2e 20  s or sub-trees. 
66f0: 41 6c 6c 20 6c 65 61 76 65 73 20 61 72 65 20 74  All leaves are t
6700: 68 65 20 73 61 6d 65 20 64 69 73 74 61 6e 63 65  he same distance
6710: 0a 66 72 6f 6d 20 74 68 65 20 72 6f 6f 74 20 6f  .from the root o
6720: 66 20 74 68 65 20 74 72 65 65 2e 0a 0a 3c 70 3e  f the tree...<p>
6730: 54 68 65 20 6f 76 65 72 66 6c 6f 77 20 61 72 72  The overflow arr
6740: 61 79 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ay that follows 
6750: 63 65 6c 6c 20 74 79 70 65 73 20 28 62 29 20 61  cell types (b) a
6760: 6e 64 20 28 63 29 20 69 73 20 66 6f 72 6d 61 74  nd (c) is format
6770: 74 65 64 20 61 73 0a 66 6f 6c 6c 6f 77 73 3a 0a  ted as.follows:.
6780: 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 20 53 69 6e 67  <ul>.  <li> Sing
6790: 6c 65 20 6f 76 65 72 66 6c 6f 77 20 64 65 73 63  le overflow desc
67a0: 72 69 70 74 6f 72 20 62 79 74 65 2e 20 54 68 65  riptor byte. The
67b0: 20 6c 65 61 73 74 2d 73 69 67 6e 69 66 69 63 61   least-significa
67c0: 6e 74 20 34 20 62 69 74 73 20 63 6f 6e 74 61 69  nt 4 bits contai
67d0: 6e 0a 20 20 20 20 20 20 20 74 68 65 20 6e 75 6d  n.       the num
67e0: 62 65 72 20 6f 66 20 64 69 72 65 63 74 20 6f 76  ber of direct ov
67f0: 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68  erflow pages. Th
6800: 65 20 6d 6f 73 74 2d 73 69 67 6e 69 66 69 63 61  e most-significa
6810: 6e 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 0a  nt contain the .
6820: 20 20 20 20 20 20 20 64 65 70 74 68 20 6f 66 20         depth of 
6830: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 74 72 65  the overflow tre
6840: 65 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 72  e (0 means the r
6850: 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65 65 20  oot of the tree 
6860: 63 6f 6e 74 61 69 6e 73 20 64 61 74 61 29 2e 20  contains data). 
6870: 0a 20 20 3c 6c 69 3e 20 54 68 65 20 70 61 67 65  .  <li> The page
6880: 20 6e 75 6d 62 65 72 73 20 6f 66 20 74 68 65 20   numbers of the 
6890: 4e 20 64 69 72 65 63 74 20 6f 76 65 72 66 6c 6f  N direct overflo
68a0: 77 20 70 61 67 65 73 2c 20 66 6f 72 6d 61 74 74  w pages, formatt
68b0: 65 64 20 61 73 20 76 61 72 69 6e 74 73 2e 0a 20  ed as varints.. 
68c0: 20 3c 6c 69 3e 20 54 68 65 20 70 61 67 65 20 6e   <li> The page n
68d0: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 6f 6f  umber of the roo
68e0: 74 20 6f 66 20 74 68 65 20 6f 76 65 72 66 6c 6f  t of the overflo
68f0: 77 20 74 72 65 65 2e 0a 3c 2f 75 6c 3e 0a 0a 0a  w tree..</ul>...
6900: 0a 3c 68 31 20 69 64 3d 6d 65 72 67 65 2d 74 72  .<h1 id=merge-tr
6910: 65 65 5f 64 61 74 61 62 61 73 65 5f 6e 6f 74 65  ee_database_note
6920: 73 3e 33 2e 20 4d 65 72 67 65 2d 54 72 65 65 20  s>3. Merge-Tree 
6930: 44 61 74 61 62 61 73 65 20 4e 6f 74 65 73 3c 2f  Database Notes</
6940: 68 31 3e 0a 0a 3c 70 3e 0a 20 20 49 6e 20 67 65  h1>..<p>.  In ge
6950: 6e 65 72 61 6c 2c 20 4c 53 4d 20 61 6e 64 20 6f  neral, LSM and o
6960: 74 68 65 72 20 6d 65 72 67 65 2d 74 72 65 65 20  ther merge-tree 
6970: 64 61 74 61 62 61 73 65 73 20 6f 62 74 61 69 6e  databases obtain
6980: 20 74 68 65 69 72 20 70 65 72 66 6f 72 6d 61 6e   their performan
6990: 63 65 0a 20 20 61 64 76 61 6e 74 61 67 65 73 20  ce.  advantages 
69a0: 62 79 3a 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 3e  by:..<ol>.  <li>
69b0: 20 3c 70 3e 55 73 69 6e 67 20 61 20 6d 65 72 67   <p>Using a merg
69c0: 65 2d 74 72 65 65 20 66 6f 72 6d 61 74 20 74 6f  e-tree format to
69d0: 20 69 6d 70 72 6f 76 65 20 6c 6f 63 61 6c 69 74   improve localit
69e0: 79 20 6f 66 20 77 72 69 74 65 73 2e 0a 0a 20 20  y of writes...  
69f0: 3c 6c 69 3e 20 3c 70 3e 41 63 63 75 6d 75 6c 61  <li> <p>Accumula
6a00: 74 69 6e 67 20 61 20 6e 75 6d 62 65 72 20 6f 66  ting a number of
6a10: 20 77 72 69 74 65 73 20 69 6e 20 6d 61 69 6e 2d   writes in main-
6a20: 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 66 6c  memory before fl
6a30: 75 73 68 69 6e 67 20 74 68 65 6d 20 74 6f 0a 20  ushing them to. 
6a40: 20 64 69 73 6b 2e 20 4c 53 4d 20 64 6f 65 73 20   disk. LSM does 
6a50: 74 68 69 73 20 75 73 69 6e 67 20 69 74 73 20 22  this using its "
6a60: 69 6e 2d 6d 65 6d 6f 72 79 20 74 72 65 65 22 20  in-memory tree" 
6a70: 69 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  in shared-memory
6a80: 2e 20 4c 65 76 65 6c 44 62 20 75 73 65 73 0a 20  . LevelDb uses. 
6a90: 20 61 20 73 6b 69 70 2d 6c 69 73 74 20 73 74 6f   a skip-list sto
6aa0: 72 65 64 20 69 6e 20 68 65 61 70 20 6d 65 6d 6f  red in heap memo
6ab0: 72 79 2e 20 46 54 53 34 20 75 73 65 73 20 61 6e  ry. FTS4 uses an
6ac0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
6ad0: 74 61 62 6c 65 2e 0a 0a 20 20 3c 6c 69 3e 20 3c  table...  <li> <
6ae0: 70 3e 53 68 69 66 74 69 6e 67 20 73 69 67 6e 69  p>Shifting signi
6af0: 66 69 63 61 6e 74 20 61 6d 6f 75 6e 74 73 20 6f  ficant amounts o
6b00: 66 20 77 6f 72 6b 20 74 6f 20 61 20 62 61 63 6b  f work to a back
6b10: 67 72 6f 75 6e 64 20 74 68 72 65 61 64 20 6f 72  ground thread or
6b20: 20 70 72 6f 63 65 73 73 2e 0a 20 20 4c 65 76 65   process..  Leve
6b30: 6c 44 42 20 75 73 65 73 20 61 20 64 65 64 69 63  lDB uses a dedic
6b40: 61 74 65 64 20 62 61 63 6b 67 72 6f 75 6e 64 20  ated background 
6b50: 74 68 72 65 61 64 2e 20 4c 53 4d 20 61 6c 6c 6f  thread. LSM allo
6b60: 77 73 20 61 20 73 65 70 61 72 61 74 65 20 64 61  ws a separate da
6b70: 74 61 62 61 73 65 20 0a 20 20 63 6f 6e 6e 65 63  tabase .  connec
6b80: 74 69 6f 6e 73 20 6f 70 65 6e 65 64 20 69 6e 20  tions opened in 
6b90: 74 68 65 20 73 61 6d 65 20 6f 72 20 64 69 66 66  the same or diff
6ba0: 65 72 65 6e 74 20 70 72 6f 63 65 73 73 65 73 20  erent processes 
6bb0: 74 6f 20 70 65 72 66 6f 72 6d 20 22 77 6f 72 6b  to perform "work
6bc0: 22 20 6f 6e 0a 20 20 74 68 65 20 64 61 74 61 62  " on.  the datab
6bd0: 61 73 65 20 6f 6e 20 64 65 6d 61 6e 64 2e 20 46  ase on demand. F
6be0: 54 53 34 20 61 6c 73 6f 20 61 6c 6c 6f 77 73 20  TS4 also allows 
6bf0: 61 6e 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  any connection t
6c00: 6f 20 70 65 72 66 6f 72 6d 20 6d 65 72 67 65 0a  o perform merge.
6c10: 20 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 62 75    operations, bu
6c20: 74 20 74 68 65 20 6d 65 72 67 69 6e 67 20 61 6e  t the merging an
6c30: 64 20 77 72 69 74 69 6e 67 20 63 61 6e 6e 6f 74  d writing cannot
6c40: 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 63 6f   be performed co
6c50: 6e 63 75 72 72 65 6e 74 6c 79 2e 0a 3c 2f 6f 6c  ncurrently..</ol
6c60: 3e 0a 0a 3c 70 3e 0a 46 54 53 34 20 62 75 69 6c  >..<p>.FTS4 buil
6c70: 64 73 20 61 20 6d 65 72 67 65 2d 74 72 65 65 20  ds a merge-tree 
6c80: 6f 6e 20 74 6f 70 20 6f 66 20 53 51 4c 69 74 65  on top of SQLite
6c90: 27 73 20 53 51 4c 20 6c 61 79 65 72 2e 20 57 68  's SQL layer. Wh
6ca0: 65 6e 20 63 6f 6d 70 61 72 65 64 20 74 6f 0a 4c  en compared to.L
6cb0: 65 76 65 6c 44 42 20 6f 72 20 4c 53 4d 2c 20 74  evelDB or LSM, t
6cc0: 68 69 73 20 69 73 20 6c 69 6d 69 74 65 64 20 69  his is limited i
6cd0: 6e 20 74 77 6f 20 77 61 79 73 3a 0a 0a 3c 75 6c  n two ways:..<ul
6ce0: 3e 0a 20 20 3c 6c 69 3e 3c 70 3e 43 68 61 6e 67  >.  <li><p>Chang
6cf0: 65 73 20 61 72 65 20 6f 6e 6c 79 20 61 63 63 75  es are only accu
6d00: 6d 75 6c 61 74 65 64 20 69 6e 20 6d 65 6d 6f 72  mulated in memor
6d10: 79 20 77 69 74 68 69 6e 20 61 20 73 69 6e 67 6c  y within a singl
6d20: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
6d30: 20 41 6c 6c 20 63 68 61 6e 67 65 73 20 6d 75 73   All changes mus
6d40: 74 20 62 65 20 66 6c 75 73 68 65 64 20 74 6f 20  t be flushed to 
6d50: 64 69 73 6b 20 62 79 20 74 68 65 20 77 72 69 74  disk by the writ
6d60: 65 72 20 70 72 6f 63 65 73 73 20 77 68 65 6e 20  er process when 
6d70: 74 68 65 20 0a 20 20 74 72 61 6e 73 61 63 74 69  the .  transacti
6d80: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
6d90: 0a 0a 20 20 3c 6c 69 3e 3c 70 3e 41 6c 74 68 6f  ..  <li><p>Altho
6da0: 75 67 68 20 65 78 69 73 74 69 6e 67 20 73 65 67  ugh existing seg
6db0: 6d 65 6e 74 73 20 6d 61 79 20 62 65 20 6d 65 72  ments may be mer
6dc0: 67 65 64 20 74 6f 67 65 74 68 65 72 20 61 74 20  ged together at 
6dd0: 61 6e 79 20 74 69 6d 65 0a 20 20 28 62 61 63 6b  any time.  (back
6de0: 67 72 6f 75 6e 64 20 77 6f 72 6b 29 2c 20 64 6f  ground work), do
6df0: 69 6e 67 20 73 6f 20 72 65 71 75 69 72 65 73 20  ing so requires 
6e00: 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 20 61 73  the same lock as
6e10: 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 77   for any other w
6e20: 72 69 74 65 0a 20 20 74 6f 20 74 68 65 20 64 61  rite.  to the da
6e30: 74 61 62 61 73 65 2e 0a 3c 2f 75 6c 3e 0a 0a 3c  tabase..</ul>..<
6e40: 68 32 20 69 64 3d 6d 65 72 67 65 2d 74 72 65 65  h2 id=merge-tree
6e50: 5f 66 6f 72 6d 61 74 3e 33 2e 31 2e 20 4d 65 72  _format>3.1. Mer
6e60: 67 65 2d 54 72 65 65 20 46 6f 72 6d 61 74 3c 2f  ge-Tree Format</
6e70: 68 32 3e 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e  h2>..<ul>.  <li>
6e80: 3c 70 3e 44 61 74 61 20 69 73 20 73 74 6f 72 65  <p>Data is store
6e90: 64 20 69 6e 20 73 65 67 6d 65 6e 74 73 2e 20 45  d in segments. E
6ea0: 61 63 68 20 73 65 67 6d 65 6e 74 20 69 73 20 61  ach segment is a
6eb0: 20 74 69 67 68 74 6c 79 20 70 61 63 6b 65 64 20   tightly packed 
6ec0: 0a 20 20 72 65 61 64 2d 6f 6e 6c 79 20 62 2d 74  .  read-only b-t
6ed0: 72 65 65 20 74 68 61 74 20 66 69 74 73 20 65 6e  ree that fits en
6ee0: 74 69 72 65 6c 79 20 69 6e 20 61 20 73 69 6e 67  tirely in a sing
6ef0: 6c 65 20 62 6c 6f 63 6b 2e 20 41 20 62 6c 6f 63  le block. A bloc
6f00: 6b 20 69 73 20 0a 20 20 28 73 61 79 29 20 31 4d  k is .  (say) 1M
6f10: 42 20 69 6e 20 73 69 7a 65 2e 0a 0a 20 20 3c 6c  B in size...  <l
6f20: 69 3e 3c 70 3e 45 61 63 68 20 73 65 67 6d 65 6e  i><p>Each segmen
6f30: 74 20 69 73 20 61 73 73 69 67 6e 65 64 20 74 6f  t is assigned to
6f40: 20 61 20 6c 65 76 65 6c 2e 20 45 61 63 68 20 6c   a level. Each l
6f50: 65 76 65 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20  evel contains a 
6f60: 0a 20 20 73 65 74 20 6f 66 20 6e 6f 6e 2d 6f 76  .  set of non-ov
6f70: 65 72 6c 61 70 70 69 6e 67 20 73 65 67 6d 65 6e  erlapping segmen
6f80: 74 73 2e 20 41 6c 6c 20 73 65 67 6d 65 6e 74 73  ts. All segments
6f90: 20 69 6e 20 6c 65 76 65 6c 20 4e 20 61 72 65 20   in level N are 
6fa0: 6e 65 77 65 72 0a 20 20 74 68 61 6e 20 74 68 6f  newer.  than tho
6fb0: 73 65 20 69 6e 20 73 65 67 6d 65 6e 74 20 28 4e  se in segment (N
6fc0: 2b 31 29 2e 0a 0a 20 20 3c 6c 69 3e 3c 70 3e 53  +1)...  <li><p>S
6fd0: 65 67 6d 65 6e 74 73 20 61 72 65 20 6c 69 6e 6b  egments are link
6fe0: 65 64 20 74 6f 67 65 74 68 65 72 20 75 73 69 6e  ed together usin
6ff0: 67 20 61 20 74 72 65 65 2d 6c 69 6b 65 20 64 61  g a tree-like da
7000: 74 61 20 73 74 72 75 63 74 75 72 65 0a 20 20 73  ta structure.  s
7010: 74 6f 72 65 64 20 6f 6e 20 72 65 67 75 6c 61 72  tored on regular
7020: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73 20   database pages 
7030: 28 6d 69 78 65 64 20 69 6e 20 77 69 74 68 20 62  (mixed in with b
7040: 2d 74 72 65 65 20 64 61 74 61 20 70 61 67 65 73  -tree data pages
7050: 29 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 68 33 3e 20 4d  )..</ul>..<h3> M
7060: 65 74 61 2d 54 72 65 65 20 46 6f 72 6d 61 74 3c  eta-Tree Format<
7070: 2f 68 33 3e 0a 0a 3c 70 3e 20 54 68 65 20 6d 65  /h3>..<p> The me
7080: 74 61 2d 74 72 65 65 20 69 73 20 61 20 62 2d 74  ta-tree is a b-t
7090: 72 65 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ree stored in th
70a0: 65 20 73 61 6d 65 20 66 6f 72 6d 61 74 20 61 73  e same format as
70b0: 20 74 68 65 20 6d 61 69 6e 20 75 73 65 72 0a 62   the main user.b
70c0: 2d 74 72 65 65 2e 20 49 74 20 73 65 72 76 65 73  -tree. It serves
70d0: 20 61 73 20 61 6e 20 69 6e 64 65 78 20 66 6f 72   as an index for
70e0: 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e   all segments in
70f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 54   the database. T
7100: 68 65 20 6b 65 79 73 0a 69 6e 20 74 68 65 20 6d  he keys.in the m
7110: 65 74 61 2d 74 72 65 65 20 61 72 65 20 66 6f 72  eta-tree are for
7120: 6d 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  mated as follows
7130: 3a 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 20 53  :..<ul>.  <li> S
7140: 65 67 6d 65 6e 74 20 61 67 65 20 28 62 69 67 2d  egment age (big-
7150: 65 6e 64 69 61 6e 20 33 32 2d 62 69 74 20 69 6e  endian 32-bit in
7160: 74 65 67 65 72 29 2e 0a 20 20 3c 6c 69 3e 20 4c  teger)..  <li> L
7170: 65 76 65 6c 20 6e 75 6d 62 65 72 20 28 6f 6e 65  evel number (one
7180: 73 2d 63 6f 6d 70 6c 69 6d 65 6e 74 20 6f 66 20  s-compliment of 
7190: 76 61 6c 75 65 20 61 73 20 61 20 62 69 67 2d 65  value as a big-e
71a0: 6e 64 69 61 6e 20 33 32 2d 62 69 74 20 69 6e 74  ndian 32-bit int
71b0: 65 67 65 72 29 2e 0a 20 20 3c 6c 69 3e 20 53 65  eger)..  <li> Se
71c0: 70 61 72 61 74 6f 72 20 6b 65 79 2e 20 41 6c 6c  parator key. All
71d0: 20 6b 65 79 73 20 77 69 74 68 69 6e 20 74 68 65   keys within the
71e0: 20 73 65 67 6d 65 6e 74 20 61 72 65 20 67 75 61   segment are gua
71f0: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 73  ranteed to be as
7200: 0a 20 20 20 20 20 20 20 6c 61 72 67 65 20 6f 72  .       large or
7210: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
7220: 20 73 65 70 61 72 61 74 6f 72 20 6b 65 79 2e 20   separator key. 
7230: 54 68 65 20 73 65 70 61 72 61 74 6f 72 20 6b 65  The separator ke
7240: 79 20 6d 61 79 20 62 65 0a 20 20 20 20 20 20 20  y may be.       
7250: 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69  zero bytes in si
7260: 7a 65 2e 0a 3c 2f 75 6c 3e 0a 0a 0a 3c 68 32 20  ze..</ul>...<h2 
7270: 69 64 3d 69 6e 2d 6d 65 6d 6f 72 79 5f 74 72 65  id=in-memory_tre
7280: 65 3e 33 2e 32 2e 20 49 6e 2d 4d 65 6d 6f 72 79  e>3.2. In-Memory
7290: 20 54 72 65 65 3c 2f 68 32 3e 0a 0a 3c 70 3e 54   Tree</h2>..<p>T
72a0: 68 69 73 20 64 65 73 69 67 6e 20 75 73 65 73 20  his design uses 
72b0: 74 68 65 20 73 61 6d 65 20 6d 75 6c 74 69 2d 76  the same multi-v
72c0: 65 72 73 69 6f 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ersion in-memory
72d0: 20 74 72 65 65 20 74 68 61 74 20 4c 53 4d 20 64   tree that LSM d
72e0: 6f 65 73 2e 20 0a 54 68 65 20 74 72 65 65 20 73  oes. .The tree s
72f0: 74 72 75 63 74 75 72 65 20 6d 61 79 20 62 65 20  tructure may be 
7300: 6c 6f 63 61 74 65 64 20 69 6e 20 68 65 61 70 20  located in heap 
7310: 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  or shared memory
7320: 2e 20 49 66 20 73 68 61 72 65 64 20 6d 65 6d 6f  . If shared memo
7330: 72 79 0a 69 73 20 75 73 65 64 20 74 68 65 6e 20  ry.is used then 
7340: 61 20 73 65 70 61 72 61 74 65 20 66 69 6c 65 20  a separate file 
7350: 28 2a 2d 73 68 6d 32 20 6f 72 20 73 6f 6d 65 20  (*-shm2 or some 
7360: 73 75 63 68 29 20 69 73 20 75 73 65 64 20 66 6f  such) is used fo
7370: 72 20 74 68 65 20 64 61 74 61 2e 20 54 68 65 20  r the data. The 
7380: 0a 74 72 65 65 2d 68 65 61 64 65 72 20 75 73 65  .tree-header use
7390: 64 20 62 79 20 4c 53 4d 20 74 6f 20 69 64 65 6e  d by LSM to iden
73a0: 74 69 66 79 20 74 68 65 20 6c 61 74 65 73 74 20  tify the latest 
73b0: 74 72 65 65 20 76 65 72 73 69 6f 6e 20 69 73 20  tree version is 
73c0: 63 6f 6d 62 69 6e 65 64 20 77 69 74 68 0a 74 68  combined with.th
73d0: 65 20 77 61 6c 2d 69 6e 64 65 78 20 68 65 61 64  e wal-index head
73e0: 65 72 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  er stored in the
73f0: 20 2a 2d 73 68 6d 20 66 69 6c 65 2e 20 54 68 69   *-shm file. Thi
7400: 73 20 6d 61 6b 65 73 20 6f 70 65 6e 69 6e 67 20  s makes opening 
7410: 61 0a 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a.read-transacti
7420: 6f 6e 20 73 69 6d 70 6c 65 72 20 74 68 61 6e 20  on simpler than 
7430: 69 6e 20 4c 53 4d 2c 20 61 73 20 74 68 65 72 65  in LSM, as there
7440: 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 65   is no need to e
7450: 6e 73 75 72 65 20 74 68 61 74 0a 63 6f 6d 70 61  nsure that.compa
7460: 74 69 62 6c 65 20 76 65 72 73 69 6f 6e 73 20 6f  tible versions o
7470: 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  f the in-memory 
7480: 61 6e 64 20 6f 6e 2d 64 69 73 6b 20 64 61 74 61  and on-disk data
7490: 62 61 73 65 73 20 61 72 65 20 6c 6f 63 6b 65 64  bases are locked
74a0: 2e 0a 0a 3c 68 32 20 69 64 3d 75 73 65 5f 6f 66  ...<h2 id=use_of
74b0: 5f 61 5f 62 61 63 6b 67 72 6f 75 6e 64 5f 74 68  _a_background_th
74c0: 72 65 61 64 5f 6f 72 5f 70 72 6f 63 65 73 73 3e  read_or_process>
74d0: 33 2e 33 2e 20 55 73 65 20 6f 66 20 61 20 42 61  3.3. Use of a Ba
74e0: 63 6b 67 72 6f 75 6e 64 20 54 68 72 65 61 64 20  ckground Thread 
74f0: 6f 72 20 50 72 6f 63 65 73 73 3c 2f 68 32 3e 0a  or Process</h2>.
7500: 0a 3c 70 3e 54 68 65 20 62 2d 74 72 65 65 20 64  .<p>The b-tree d
7510: 61 74 61 62 61 73 65 20 64 65 73 63 72 69 62 65  atabase describe
7520: 64 20 61 62 6f 76 65 20 73 75 70 70 6f 72 74 73  d above supports
7530: 20 74 68 65 20 75 73 65 20 6f 66 20 61 20 62 61   the use of a ba
7540: 63 6b 67 72 6f 75 6e 64 20 74 68 72 65 61 64 0a  ckground thread.
7550: 6f 72 20 70 72 6f 63 65 73 73 20 74 6f 20 70 65  or process to pe
7560: 72 66 6f 72 6d 20 63 68 65 63 6b 70 6f 69 6e 74  rform checkpoint
7570: 73 2e 20 54 6f 20 61 63 68 65 69 76 65 20 4c 53  s. To acheive LS
7580: 4d 2f 4c 65 76 65 6c 44 42 20 74 79 70 65 20 70  M/LevelDB type p
7590: 65 72 66 6f 72 6d 61 6e 63 65 2c 0a 74 68 69 73  erformance,.this
75a0: 20 77 6f 75 6c 64 20 62 65 20 65 78 74 65 6e 64   would be extend
75b0: 65 64 20 73 6f 20 74 68 61 74 3a 0a 0a 3c 75 6c  ed so that:..<ul
75c0: 3e 0a 20 20 3c 6c 69 3e 20 3c 70 3e 54 68 65 20  >.  <li> <p>The 
75d0: 75 73 65 72 20 74 68 72 65 61 64 20 28 57 52 49  user thread (WRI
75e0: 54 45 52 20 6c 6f 63 6b 29 20 69 73 20 72 65 73  TER lock) is res
75f0: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 75 70 64  ponsible for upd
7600: 61 74 69 6e 67 20 74 68 65 0a 20 20 69 6e 2d 6d  ating the.  in-m
7610: 65 6d 6f 72 79 20 74 72 65 65 20 61 6e 64 20 66  emory tree and f
7620: 6f 72 20 77 72 69 74 69 6e 67 20 6c 6f 67 69 63  or writing logic
7630: 61 6c 20 6c 6f 67 20 65 6e 74 72 69 65 73 20 74  al log entries t
7640: 6f 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a  o the WAL file..
7650: 0a 20 20 3c 6c 69 3e 20 3c 70 3e 54 68 65 20 63  .  <li> <p>The c
7660: 68 65 63 6b 70 6f 69 6e 74 65 72 20 28 43 48 45  heckpointer (CHE
7670: 43 4b 50 4f 49 4e 54 45 52 20 6c 6f 63 6b 29 20  CKPOINTER lock) 
7680: 74 68 72 65 61 64 20 69 73 20 72 65 73 70 6f 6e  thread is respon
7690: 73 69 62 6c 65 20 6f 72 20 0a 20 20 63 6f 70 79  sible or .  copy
76a0: 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 74 68  ing data from th
76b0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 74 72 65 65  e in-memory tree
76c0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
76d0: 20 66 69 6c 65 2e 0a 0a 20 20 3c 6c 69 3e 20 3c   file...  <li> <
76e0: 70 3e 54 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  p>The checkpoint
76f0: 65 72 20 28 43 48 45 43 4b 50 4f 49 4e 54 45 52  er (CHECKPOINTER
7700: 20 6c 6f 63 6b 29 20 74 68 72 65 61 64 20 69 73   lock) thread is
7710: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
7720: 0a 20 20 6d 65 72 67 69 6e 67 20 74 6f 67 65 74  .  merging toget
7730: 68 65 72 20 65 78 69 73 74 69 6e 67 20 73 65 67  her existing seg
7740: 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74 68 65  ments within the
7750: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
7760: 3c 2f 75 6c 3e 0a 0a 3c 70 3e 54 68 65 20 69 6d  </ul>..<p>The im
7770: 6d 65 64 69 61 74 65 20 70 72 6f 62 6c 65 6d 20  mediate problem 
7780: 69 73 20 74 68 61 74 20 66 6f 72 20 62 2d 74 72  is that for b-tr
7790: 65 65 20 77 72 69 74 65 73 2c 20 73 70 61 63 65  ee writes, space
77a0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a 77 69   is allocated.wi
77b0: 74 68 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  thin the databas
77c0: 65 20 66 69 6c 65 20 62 79 20 74 68 65 20 74 68  e file by the th
77d0: 72 65 61 64 20 68 6f 6c 64 69 6e 67 20 74 68 65  read holding the
77e0: 20 57 52 49 54 45 52 20 6c 6f 63 6b 2e 20 42 75   WRITER lock. Bu
77f0: 74 20 74 68 65 0a 73 65 63 6f 6e 64 20 61 6e 64  t the.second and
7800: 20 74 68 69 72 64 20 70 6f 69 6e 74 73 20 61 62   third points ab
7810: 6f 76 65 20 77 6f 75 6c 64 20 62 65 20 6d 6f 72  ove would be mor
7820: 65 20 65 61 73 69 6c 79 20 69 6d 70 6c 65 6d 65  e easily impleme
7830: 6e 74 65 64 20 69 66 20 74 68 65 0a 74 68 72 65  nted if the.thre
7840: 61 64 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 43  ad holding the C
7850: 48 45 43 4b 50 4f 49 4e 54 45 52 20 74 68 72 65  HECKPOINTER thre
7860: 61 64 20 77 65 72 65 20 74 6f 20 64 6f 20 73 6f  ad were to do so
7870: 2e 0a 0a 3c 70 3e 42 65 63 61 75 73 65 20 6f 66  ...<p>Because of
7880: 20 74 68 69 73 2c 20 61 6c 74 68 6f 75 67 68 20   this, although 
7890: 61 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 20 64  a checkpointer d
78a0: 6f 65 73 20 74 68 65 20 61 63 74 75 61 6c 20 77  oes the actual w
78b0: 6f 72 6b 20 6f 66 20 63 6f 70 79 69 6e 67 0a 64  ork of copying.d
78c0: 61 74 61 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d  ata from the in-
78d0: 6d 65 6d 6f 72 79 20 74 72 65 65 20 74 6f 20 74  memory tree to t
78e0: 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
78f0: 6d 65 72 67 69 6e 67 20 65 78 69 73 74 69 6e 67  merging existing
7900: 20 73 65 67 6d 65 6e 74 73 0a 74 6f 67 65 74 68   segments.togeth
7910: 65 72 2c 20 74 68 65 73 65 20 6f 70 65 72 61 74  er, these operat
7920: 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 73 63 68  ions must be sch
7930: 65 64 75 6c 65 64 20 61 6e 64 20 73 70 61 63 65  eduled and space
7940: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
7950: 68 65 6d 20 62 79 20 61 0a 77 72 69 74 65 72 2e  hem by a.writer.
7960: 20 54 6f 20 64 6f 20 74 68 69 73 2c 20 61 20 77   To do this, a w
7970: 72 69 74 65 72 20 61 70 70 65 6e 64 73 20 61 20  riter appends a 
7980: 73 70 65 63 69 61 6c 20 66 72 61 6d 65 20 74 6f  special frame to
7990: 20 74 68 65 20 57 41 4c 20 73 70 65 63 69 66 79   the WAL specify
79a0: 69 6e 67 3a 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69  ing:..<ul>.  <li
79b0: 3e 3c 70 3e 54 68 65 20 6f 70 65 72 61 74 69 6f  ><p>The operatio
79c0: 6e 20 74 6f 20 70 65 72 66 6f 72 6d 2e 20 46 6f  n to perform. Fo
79d0: 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20 66 6c  r example, to fl
79e0: 75 73 68 20 64 61 74 61 20 66 72 6f 6d 20 74 68  ush data from th
79f0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20  e in-memory.    
7a00: 20 20 20 74 72 65 65 20 74 6f 20 64 69 73 6b 2c     tree to disk,
7a10: 20 6f 72 20 74 6f 20 6d 65 72 67 65 20 74 77 6f   or to merge two
7a20: 20 6f 72 20 6d 6f 72 65 20 73 70 65 63 69 66 69   or more specifi
7a30: 65 64 20 73 65 67 6d 65 6e 74 73 20 74 6f 67 65  ed segments toge
7a40: 74 68 65 72 2e 0a 0a 20 20 3c 6c 69 3e 3c 70 3e  ther...  <li><p>
7a50: 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 73  The address of s
7a60: 70 61 63 65 20 77 69 74 68 69 6e 20 74 68 65 20  pace within the 
7a70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6c  database file al
7a80: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
7a90: 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 6f 66  output.       of
7aa0: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20   the operation. 
7ab0: 46 6f 72 20 61 20 66 6c 75 73 68 20 6f 66 20 74  For a flush of t
7ac0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 74 72 65  he in-memory tre
7ad0: 65 2c 20 69 74 20 69 73 20 6e 6f 74 20 28 3f 29  e, it is not (?)
7ae0: 20 65 61 73 79 0a 20 20 20 20 20 20 20 74 6f 20   easy.       to 
7af0: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 61 6d  determine the am
7b00: 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 72 65  ount of space re
7b10: 71 75 69 72 65 64 20 69 6e 20 61 64 76 61 6e 63  quired in advanc
7b20: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
7b30: 61 6e 0a 20 20 20 20 20 20 20 75 70 70 65 72 20  an.       upper 
7b40: 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 70 61  bound on the spa
7b50: 63 65 20 72 65 71 75 69 72 65 64 20 69 73 20 64  ce required is d
7b60: 65 74 65 72 6d 69 6e 65 64 20 61 6e 64 20 73 70  etermined and sp
7b70: 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e  ace allocated on
7b80: 0a 20 20 20 20 20 20 20 74 68 69 73 20 62 61 73  .       this bas
7b90: 69 73 2e 0a 0a 20 20 20 20 20 20 20 3c 70 3e 49  is...       <p>I
7ba0: 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  f the operation 
7bb0: 69 73 20 61 20 6d 65 72 67 65 20 6f 66 20 65 78  is a merge of ex
7bc0: 69 73 74 69 6e 67 20 73 65 67 6d 65 6e 74 73 2c  isting segments,
7bd0: 20 74 68 65 6e 20 61 20 73 69 6e 67 6c 65 20 0a   then a single .
7be0: 20 20 20 20 20 20 20 62 6c 6f 63 6b 20 6f 66 20         block of 
7bf0: 73 70 61 63 65 20 69 6e 20 74 68 65 20 64 62 20  space in the db 
7c00: 66 69 6c 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  file is allocate
7c10: 64 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74  d for the output
7c20: 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 20   of the .       
7c30: 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68  operation. If th
7c40: 69 73 20 69 73 20 69 6e 73 75 66 66 69 63 69 65  is is insufficie
7c50: 6e 74 2c 20 6d 65 72 67 69 6e 67 20 73 74 6f 70  nt, merging stop
7c60: 73 20 6f 6e 63 65 20 69 74 20 69 73 20 66 75 6c  s once it is ful
7c70: 6c 2e 0a 20 20 20 20 20 20 20 54 68 65 20 72 65  l..       The re
7c80: 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 64  mainder of the d
7c90: 61 74 61 20 69 6e 20 74 68 65 20 69 6e 70 75 74  ata in the input
7ca0: 20 73 65 67 6d 65 6e 74 73 20 69 73 20 68 61 6e   segments is han
7cb0: 64 6c 65 64 20 62 79 20 61 20 0a 20 20 20 20 20  dled by a .     
7cc0: 20 20 73 75 62 73 65 71 75 65 6e 74 20 6d 65 72    subsequent mer
7cd0: 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 3c 2f  ge operation..</
7ce0: 75 6c 3e 0a 0a 3c 70 3e 54 68 65 20 6c 61 73 74  ul>..<p>The last
7cf0: 20 70 61 67 65 20 6f 66 20 65 61 63 68 20 62 6c   page of each bl
7d00: 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 61 20 64  ock contains a d
7d10: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 69 74  escription of it
7d20: 73 20 63 6f 6e 74 65 6e 74 73 2e 20 41 66 74 65  s contents. Afte
7d30: 72 20 61 0a 63 68 65 63 6b 70 6f 69 6e 74 20 68  r a.checkpoint h
7d40: 61 73 20 70 6f 70 75 6c 61 74 65 64 20 61 20 62  as populated a b
7d50: 6c 6f 63 6b 20 77 69 74 68 20 74 68 65 20 72 65  lock with the re
7d60: 73 75 6c 74 73 20 6f 66 20 61 20 66 6c 75 73 68  sults of a flush
7d70: 20 6f 72 20 6d 65 72 67 65 20 6f 70 65 72 61 74   or merge operat
7d80: 69 6f 6e 2c 0a 74 68 65 20 6e 65 78 74 20 77 72  ion,.the next wr
7d90: 69 74 65 72 20 63 6c 69 65 6e 74 20 74 6f 20 6f  iter client to o
7da0: 70 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  pen a transactio
7db0: 6e 20 72 65 63 6f 67 6e 69 7a 65 73 20 74 68 69  n recognizes thi
7dc0: 73 20 61 6e 64 20 72 65 61 64 73 20 74 68 65 0a  s and reads the.
7dd0: 64 65 73 63 72 69 70 74 69 6f 6e 20 66 72 6f 6d  description from
7de0: 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f   the last page o
7df0: 66 20 74 68 65 20 70 6f 70 75 6c 61 74 65 64 20  f the populated 
7e00: 62 6c 6f 63 6b 20 6f 72 20 62 6c 6f 63 6b 73 2e  block or blocks.
7e10: 20 49 74 20 74 68 65 6e 0a 75 70 64 61 74 65 73   It then.updates
7e20: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 74   the structure t
7e30: 68 61 74 20 6c 69 6e 6b 73 20 61 6c 6c 20 70 6f  hat links all po
7e40: 70 75 6c 61 74 65 64 20 62 6c 6f 63 6b 73 20 74  pulated blocks t
7e50: 6f 67 65 74 68 65 72 20 28 62 79 20 61 70 70 65  ogether (by appe
7e60: 6e 64 69 6e 67 0a 6e 65 77 20 76 65 72 73 69 6f  nding.new versio
7e70: 6e 73 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74  ns of pages to t
7e80: 68 65 20 57 41 4c 29 2e 20 49 6e 20 6f 74 68 65  he WAL). In othe
7e90: 72 20 77 6f 72 64 73 2c 20 66 6c 75 73 68 69 6e  r words, flushin
7ea0: 67 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  g the in-memory 
7eb0: 0a 74 72 65 65 20 6f 72 20 6d 65 72 67 69 6e 67  .tree or merging
7ec0: 20 62 6c 6f 63 6b 73 20 74 6f 67 65 74 68 65 72   blocks together
7ed0: 20 69 73 20 61 20 74 68 72 65 65 2d 73 74 65 70   is a three-step
7ee0: 20 6f 70 65 72 61 74 69 6f 6e 3a 0a 0a 3c 6f 6c   operation:..<ol
7ef0: 3e 0a 20 20 3c 6c 69 3e 3c 70 3e 20 41 20 77 72  >.  <li><p> A wr
7f00: 69 74 65 72 20 70 72 6f 63 65 73 73 20 73 63 68  iter process sch
7f10: 65 64 75 6c 65 73 20 74 68 65 20 6f 70 65 72 61  edules the opera
7f20: 74 69 6f 6e 20 62 79 20 61 64 64 69 6e 67 20 61  tion by adding a
7f30: 20 66 72 61 6d 65 20 74 6f 20 74 68 65 20 57 41   frame to the WA
7f40: 4c 2e 0a 20 20 3c 6c 69 3e 3c 70 3e 20 41 20 63  L..  <li><p> A c
7f50: 68 65 63 6b 70 6f 69 6e 74 65 72 20 64 6f 65 73  heckpointer does
7f60: 20 74 68 65 20 66 6c 75 73 68 20 6f 72 20 6d 65   the flush or me
7f70: 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 20 61 73  rge operation as
7f80: 20 70 61 72 74 20 6f 66 20 61 20 63 68 65 63 6b   part of a check
7f90: 70 6f 69 6e 74 2e 0a 20 20 3c 6c 69 3e 3c 70 3e  point..  <li><p>
7fa0: 20 41 20 77 72 69 74 65 72 20 6f 62 73 65 72 76   A writer observ
7fb0: 65 73 20 74 68 61 74 20 74 68 65 20 6f 70 65 72  es that the oper
7fc0: 61 74 69 6f 6e 20 68 61 73 20 66 69 6e 69 73 68  ation has finish
7fd0: 65 64 20 61 6e 64 20 75 70 64 61 74 65 73 20 74  ed and updates t
7fe0: 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 74 6f  he database.  to
7ff0: 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 73 65   link the new se
8000: 67 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 6d  gment into the m
8010: 65 72 67 65 2d 74 72 65 65 2e 0a 3c 2f 6f 6c 3e  erge-tree..</ol>
8020: 0a 0a 3c 68 31 20 69 64 3d 64 65 73 69 67 6e 5f  ..<h1 id=design_
8030: 73 75 6d 6d 61 72 79 3e 34 2e 20 44 65 73 69 67  summary>4. Desig
8040: 6e 20 53 75 6d 6d 61 72 79 3c 2f 68 31 3e 0a 0a  n Summary</h1>..
8050: 3c 68 32 20 69 64 3d 6c 6f 63 6b 69 6e 67 3e 34  <h2 id=locking>4
8060: 2e 31 2e 20 4c 6f 63 6b 69 6e 67 3c 2f 68 32 3e  .1. Locking</h2>
8070: 0a 0a 3c 70 3e 4c 6f 63 6b 73 20 61 72 65 20 64  ..<p>Locks are d
8080: 69 76 69 64 65 64 20 69 6e 74 6f 20 74 77 6f 20  ivided into two 
8090: 67 72 6f 75 70 73 20 2d 20 74 68 6f 73 65 20 74  groups - those t
80a0: 68 61 74 20 61 72 65 20 75 73 65 64 20 61 73 20  hat are used as 
80b0: 70 61 72 74 20 6f 66 0a 63 6f 6e 6e 65 63 74 69  part of.connecti
80c0: 6e 67 20 74 6f 20 61 6e 64 20 69 6e 69 74 69 61  ng to and initia
80d0: 6c 69 7a 69 6e 67 20 74 68 65 20 73 79 73 74 65  lizing the syste
80e0: 6d 20 28 72 75 6e 6e 69 6e 67 20 72 65 63 6f 76  m (running recov
80f0: 65 72 79 29 2c 20 61 6e 64 20 74 68 6f 73 65 20  ery), and those 
8100: 0a 74 68 61 74 20 61 72 65 20 75 73 65 64 20 62  .that are used b
8110: 79 20 72 65 61 64 65 72 2c 20 77 72 69 74 65 72  y reader, writer
8120: 20 61 6e 64 20 63 68 65 63 6b 70 6f 69 6e 74 65   and checkpointe
8130: 72 20 63 6c 69 65 6e 74 73 20 6f 6e 63 65 20 74  r clients once t
8140: 68 65 79 20 61 72 65 0a 63 6f 6e 6e 65 63 74 65  hey are.connecte
8150: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
8160: 65 2e 0a 0a 3c 70 3e 20 4c 6f 63 6b 73 20 75 73  e...<p> Locks us
8170: 65 64 20 64 75 72 69 6e 67 20 63 6f 6e 6e 65 63  ed during connec
8180: 74 69 6f 6e 2f 64 69 73 63 6f 6e 6e 65 63 74 69  tion/disconnecti
8190: 6f 6e 3a 0a 0a 3c 70 3e 3c 74 61 62 6c 65 20 73  on:..<p><table s
81a0: 74 79 6c 65 3d 22 77 69 64 74 68 3a 39 30 25 3b  tyle="width:90%;
81b0: 6d 61 72 67 69 6e 3a 61 75 74 6f 22 20 62 6f 72  margin:auto" bor
81c0: 64 65 72 3d 31 3e 0a 20 20 3c 74 72 3e 3c 74 64  der=1>.  <tr><td
81d0: 20 73 74 79 6c 65 3d 22 77 69 64 74 68 3a 31 35   style="width:15
81e0: 65 78 22 3e 44 4d 53 31 0a 20 20 3c 74 64 3e 54  ex">DMS1.  <td>T
81f0: 68 69 73 20 73 6c 6f 74 20 69 73 20 75 73 65 64  his slot is used
8200: 20 6c 69 6b 65 20 61 20 6d 75 74 65 78 20 74 6f   like a mutex to
8210: 20 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 63   serialize the c
8220: 6f 6e 6e 65 63 74 69 6f 6e 2f 64 69 73 63 6f 6e  onnection/discon
8230: 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 6f 66  nection.      of
8240: 20 72 65 61 64 2f 77 72 69 74 65 20 63 6c 69 65   read/write clie
8250: 6e 74 73 2e 20 0a 0a 20 20 3c 74 72 3e 3c 74 64  nts. ..  <tr><td
8260: 3e 44 4d 53 32 2f 72 77 0a 20 20 3c 74 64 3e 4f  >DMS2/rw.  <td>O
8270: 6e 63 65 20 63 6f 6e 6e 65 63 74 65 64 2c 20 61  nce connected, a
8280: 6c 6c 20 72 65 61 64 2f 77 72 69 74 65 20 63 6c  ll read/write cl
8290: 69 65 6e 74 73 20 68 6f 6c 64 20 61 20 53 48 41  ients hold a SHA
82a0: 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73  RED lock on this
82b0: 20 73 6c 6f 74 0a 20 20 20 20 20 20 75 6e 74 69   slot.      unti
82c0: 6c 20 74 68 65 79 20 64 69 73 63 6f 6e 6e 65 63  l they disconnec
82d0: 74 2e 0a 0a 20 20 3c 74 72 3e 3c 74 64 3e 44 4d  t...  <tr><td>DM
82e0: 53 32 2f 72 6f 0a 20 20 3c 74 64 3e 4f 6e 63 65  S2/ro.  <td>Once
82f0: 20 63 6f 6e 6e 65 63 74 65 64 2c 20 61 6c 6c 20   connected, all 
8300: 72 65 61 64 2d 6f 6e 6c 79 20 63 6c 69 65 6e 74  read-only client
8310: 73 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44 20  s hold a SHARED 
8320: 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 73 6c 6f  lock on this slo
8330: 74 0a 20 20 20 20 20 20 75 6e 74 69 6c 20 74 68  t.      until th
8340: 65 79 20 64 69 73 63 6f 6e 6e 65 63 74 2e 0a 0a  ey disconnect...
8350: 20 20 3c 74 72 3e 3c 74 64 3e 44 4d 53 33 0a 20    <tr><td>DMS3. 
8360: 20 3c 74 64 3e 54 68 69 73 20 69 73 20 61 20 6c   <td>This is a l
8370: 61 72 67 65 20 62 6c 6f 63 6b 20 6f 66 20 6c 6f  arge block of lo
8380: 63 6b 73 20 28 73 61 79 20 36 34 20 6f 72 20 6d  cks (say 64 or m
8390: 6f 72 65 29 2e 20 55 70 6f 6e 20 63 6f 6e 6e 65  ore). Upon conne
83a0: 63 74 69 6f 6e 2c 20 65 61 63 68 0a 20 20 20 20  ction, each.    
83b0: 72 65 61 64 2f 77 72 69 74 65 20 63 6f 6e 6e 65  read/write conne
83c0: 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
83d0: 6f 20 6f 62 74 61 69 6e 20 61 6e 20 45 58 43 4c  o obtain an EXCL
83e0: 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 6f 6e  USIVE lock on on
83f0: 65 20 6f 66 20 0a 20 20 20 20 74 68 65 73 65 20  e of .    these 
8400: 73 6c 6f 74 73 2e 20 49 66 20 74 68 65 72 65 20  slots. If there 
8410: 61 72 65 20 61 6c 72 65 61 64 79 20 6d 6f 72 65  are already more
8420: 20 74 68 61 6e 20 36 34 20 72 65 61 64 2f 77 72   than 64 read/wr
8430: 69 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2c  ite connections,
8440: 20 74 68 69 73 0a 20 20 20 20 6d 61 79 20 6e 6f   this.    may no
8450: 74 20 62 65 20 70 6f 73 73 69 62 6c 65 2e 20 49  t be possible. I
8460: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65  n that case, the
8470: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74   connection cont
8480: 69 6e 75 65 73 20 77 69 74 68 20 6f 75 74 20 74  inues with out t
8490: 68 65 0a 20 20 20 20 6c 6f 63 6b 2e 0a 3c 2f 74  he.    lock..</t
84a0: 61 62 6c 65 3e 0a 0a 3c 70 3e 20 4c 6f 63 6b 73  able>..<p> Locks
84b0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 6e 6f 72   used during nor
84c0: 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73 3a 0a  mal operations:.
84d0: 0a 3c 70 3e 3c 74 61 62 6c 65 20 73 74 79 6c 65  .<p><table style
84e0: 3d 22 77 69 64 74 68 3a 39 30 25 3b 6d 61 72 67  ="width:90%;marg
84f0: 69 6e 3a 61 75 74 6f 22 20 62 6f 72 64 65 72 3d  in:auto" border=
8500: 31 3e 0a 20 20 3c 74 72 3e 3c 74 64 20 73 74 79  1>.  <tr><td sty
8510: 6c 65 3d 22 77 69 64 74 68 3a 31 35 65 78 22 3e  le="width:15ex">
8520: 52 45 41 44 45 52 0a 20 20 3c 74 64 3e 41 6e 20  READER.  <td>An 
8530: 61 72 72 61 79 20 6f 66 20 28 73 61 79 29 20 38  array of (say) 8
8540: 20 73 6c 6f 74 73 2c 20 65 61 63 68 20 6f 66 20   slots, each of 
8550: 77 68 69 63 68 20 69 73 20 61 73 73 6f 63 69 61  which is associa
8560: 74 65 64 20 77 69 74 68 20 61 20 33 32 2d 62 69  ted with a 32-bi
8570: 74 0a 20 20 20 20 69 6e 74 65 67 65 72 20 76 61  t.    integer va
8580: 6c 75 65 2e 20 41 73 20 69 6e 20 53 51 4c 69 74  lue. As in SQLit
8590: 65 20 57 41 4c 20 6d 6f 64 65 2e 0a 0a 20 20 3c  e WAL mode...  <
85a0: 74 72 3e 3c 74 64 3e 20 57 52 49 54 45 52 0a 20  tr><td> WRITER. 
85b0: 20 3c 74 64 3e 41 6e 20 45 58 43 4c 55 53 49 56   <td>An EXCLUSIV
85c0: 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 73  E lock on this s
85d0: 6c 6f 74 20 69 73 20 68 65 6c 64 20 77 68 65 6e  lot is held when
85e0: 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
85f0: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 0a 20  tion is open... 
8600: 20 3c 74 72 3e 3c 74 64 3e 20 43 48 45 43 4b 50   <tr><td> CHECKP
8610: 4f 49 4e 54 45 52 0a 20 20 3c 74 64 3e 41 6e 20  OINTER.  <td>An 
8620: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
8630: 6e 20 74 68 69 73 20 73 6c 6f 74 20 69 73 20 68  n this slot is h
8640: 65 6c 64 20 77 68 69 6c 65 20 61 20 63 68 65 63  eld while a chec
8650: 6b 70 6f 69 6e 74 20 69 73 20 75 6e 64 65 72 77  kpoint is underw
8660: 61 79 2e 0a 3c 2f 74 61 62 6c 65 3e 0a 0a 3c 70  ay..</table>..<p
8670: 3e 3c 62 3e 52 65 61 64 2d 6f 6e 6c 79 20 43 6f  ><b>Read-only Co
8680: 6e 6e 65 63 74 69 6f 6e 73 3c 2f 62 3e 0a 0a 3c  nnections</b>..<
8690: 70 3e 54 6f 20 6f 70 65 6e 20 61 20 72 65 61 64  p>To open a read
86a0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20  -transaction, a 
86b0: 64 69 73 63 6f 6e 6e 65 63 74 65 64 20 72 65 61  disconnected rea
86c0: 64 2d 6f 6e 6c 79 20 63 6c 69 65 6e 74 20 64 6f  d-only client do
86d0: 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
86e0: 3a 0a 0a 3c 70 72 65 3e 0a 20 20 4c 6f 63 6b 28  :..<pre>.  Lock(
86f0: 44 4d 53 33 2e 2e 44 4d 53 33 2b 4e 2c 20 53 48  DMS3..DMS3+N, SH
8700: 41 52 45 44 29 20 20 2f 2a 20 6e 6f 6e 2d 62 6c  ARED)  /* non-bl
8710: 6f 63 6b 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20  ocking lock */. 
8720: 20 69 66 28 20 73 75 63 63 65 73 73 66 75 6c 20   if( successful 
8730: 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 28 44 4d  ){.    Unlock(DM
8740: 53 33 2e 2e 44 4d 53 33 2b 4e 29 0a 20 20 20 20  S3..DMS3+N).    
8750: 4c 6f 63 6b 28 43 48 45 43 4b 50 4f 49 4e 54 45  Lock(CHECKPOINTE
8760: 52 2c 20 53 48 41 52 45 44 29 0a 20 20 20 20 69  R, SHARED).    i
8770: 66 28 20 73 75 63 63 65 73 73 66 75 6c 20 29 7b  f( successful ){
8780: 0a 20 20 20 20 20 20 22 72 65 63 6f 76 65 72 22  .      "recover"
8790: 20 74 68 65 20 64 62 20 69 6e 74 6f 20 70 72 69   the db into pri
87a0: 76 61 74 65 20 68 65 61 70 20 6d 65 6d 6f 72 79  vate heap memory
87b0: 2e 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ..      return S
87c0: 51 4c 49 54 45 34 5f 4f 4b 0a 20 20 20 20 7d 0a  QLITE4_OK.    }.
87d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
87e0: 49 54 45 34 5f 42 55 53 59 0a 3c 2f 70 72 65 3e  ITE4_BUSY.</pre>
87f0: 0a 0a 3c 70 3e 49 66 20 53 51 4c 49 54 45 34 5f  ..<p>If SQLITE4_
8800: 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
8810: 2c 20 74 68 65 6e 20 74 68 65 20 72 65 61 64 2d  , then the read-
8820: 6f 6e 6c 79 20 63 6c 69 65 6e 74 20 63 61 6e 20  only client can 
8830: 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 0a 74 68  conclude that.th
8840: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
8850: 77 20 6c 69 76 65 2e 20 49 74 20 73 68 6f 75 6c  w live. It shoul
8860: 64 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6e  d attempt to con
8870: 6e 65 63 74 20 74 6f 20 69 74 20 61 6e 64 20 74  nect to it and t
8880: 68 65 6e 0a 72 65 2d 61 74 74 65 6d 70 74 20 6f  hen.re-attempt o
8890: 70 65 6e 69 6e 67 20 74 68 65 20 72 65 61 64 2d  pening the read-
88a0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 6f 20  transaction. To 
88b0: 63 6f 6e 6e 65 63 74 20 74 6f 20 61 20 64 61 74  connect to a dat
88c0: 61 62 61 73 65 3a 0a 0a 3c 70 72 65 3e 0a 20 20  abase:..<pre>.  
88d0: 4c 6f 63 6b 28 44 4d 53 31 2c 20 53 48 41 52 45  Lock(DMS1, SHARE
88e0: 44 29 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  D)            /*
88f0: 20 62 6c 6f 63 6b 69 6e 67 20 6c 6f 63 6b 20 2a   blocking lock *
8900: 2f 0a 20 20 20 20 4c 6f 63 6b 28 44 4d 53 33 2e  /.    Lock(DMS3.
8910: 2e 44 4d 53 33 2b 4e 2c 20 53 48 41 52 45 44 29  .DMS3+N, SHARED)
8920: 20 20 2f 2a 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e    /* non-blockin
8930: 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 66  g lock */.    if
8940: 28 20 75 6e 73 75 63 63 65 73 73 66 75 6c 20 29  ( unsuccessful )
8950: 7b 20 0a 20 20 20 20 20 20 4c 6f 63 6b 28 44 4d  { .      Lock(DM
8960: 53 32 2f 52 4f 2c 20 53 48 41 52 45 44 29 20 20  S2/RO, SHARED)  
8970: 20 20 20 2f 2a 20 22 63 61 6e 6e 6f 74 22 20 66     /* "cannot" f
8980: 61 69 6c 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ail */.      /* 
8990: 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6e 6f  Connection is no
89a0: 77 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61  w connected to a
89b0: 20 6c 69 76 65 20 64 61 74 61 62 61 73 65 20 2a   live database *
89c0: 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /.    }else{.   
89d0: 20 20 20 55 6e 6c 6f 63 6b 28 44 4d 53 33 2e 2e     Unlock(DMS3..
89e0: 44 4d 53 33 2b 4e 29 0a 20 20 20 20 20 20 2f 2a  DMS3+N).      /*
89f0: 20 41 74 74 65 6d 70 74 20 74 6f 20 63 6f 6e 6e   Attempt to conn
8a00: 65 63 74 20 68 61 73 20 66 61 69 6c 65 64 20 2a  ect has failed *
8a10: 2f 0a 20 20 20 20 7d 0a 20 20 55 6e 6c 6f 63 6b  /.    }.  Unlock
8a20: 28 44 4d 53 31 29 0a 3c 2f 70 72 65 3e 0a 0a 3c  (DMS1).</pre>..<
8a30: 70 3e 0a 0a 3c 70 3e 3c 62 3e 52 65 61 64 2f 57  p>..<p><b>Read/W
8a40: 72 69 74 65 20 43 6f 6e 6e 65 63 74 69 6f 6e 73  rite Connections
8a50: 3c 2f 62 3e 0a 0a 3c 70 3e 54 6f 20 63 6f 6e 6e  </b>..<p>To conn
8a60: 65 63 74 3a 0a 3c 70 72 65 3e 0a 20 20 4c 6f 63  ect:.<pre>.  Loc
8a70: 6b 28 44 4d 53 31 2c 20 45 58 43 4c 55 53 49 56  k(DMS1, EXCLUSIV
8a80: 45 29 20 20 20 20 20 20 20 20 20 2f 2a 20 62 6c  E)         /* bl
8a90: 6f 63 6b 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20  ocking lock */. 
8aa0: 20 20 20 4c 6f 63 6b 28 44 4d 53 32 2f 52 4f 2e     Lock(DMS2/RO.
8ab0: 2e 44 4d 53 32 2f 52 57 2c 20 45 58 43 4c 55 53  .DMS2/RW, EXCLUS
8ac0: 49 56 45 29 0a 20 20 20 20 69 66 28 20 73 75 63  IVE).    if( suc
8ad0: 63 65 73 73 66 75 6c 20 29 7b 20 0a 20 20 20 20  cessful ){ .    
8ae0: 20 20 52 75 6e 20 72 65 63 6f 76 65 72 79 20 74    Run recovery t
8af0: 6f 20 73 65 74 20 75 70 20 73 68 61 72 65 64 20  o set up shared 
8b00: 6d 65 6d 6f 72 79 0a 20 20 20 20 20 20 55 6e 6c  memory.      Unl
8b10: 6f 63 6b 28 44 4d 53 32 2f 52 4f 2e 2e 44 4d 53  ock(DMS2/RO..DMS
8b20: 32 2f 52 57 29 0a 20 20 20 20 7d 0a 20 20 20 20  2/RW).    }.    
8b30: 4c 6f 63 6b 28 44 4d 53 32 2f 52 57 2c 20 53 48  Lock(DMS2/RW, SH
8b40: 41 52 45 44 29 20 20 20 20 20 20 20 2f 2a 20 22  ARED)       /* "
8b50: 63 61 6e 6e 6f 74 22 20 66 61 69 6c 20 2a 2f 0a  cannot" fail */.
8b60: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 26 6c      for(i=0; i&l
8b70: 74 3b 36 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  t;64; i++){.    
8b80: 20 20 4c 6f 63 6b 28 44 4d 53 33 2b 69 2c 20 45    Lock(DMS3+i, E
8b90: 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20  XCLUSIVE).      
8ba0: 69 66 28 20 73 75 63 63 65 73 73 66 75 6c 20 29  if( successful )
8bb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
8bc0: 55 6e 6c 6f 63 6b 28 44 4d 53 31 29 0a 3c 2f 70  Unlock(DMS1).</p
8bd0: 72 65 3e 0a 0a 3c 70 3e 54 6f 20 64 69 73 63 6f  re>..<p>To disco
8be0: 6e 6e 65 63 74 3a 0a 0a 3c 70 72 65 3e 0a 20 20  nnect:..<pre>.  
8bf0: 4c 6f 63 6b 28 44 4d 53 31 2c 20 45 58 43 4c 55  Lock(DMS1, EXCLU
8c00: 53 49 56 45 29 20 20 20 20 20 20 20 20 20 2f 2a  SIVE)         /*
8c10: 20 62 6c 6f 63 6b 69 6e 67 20 6c 6f 63 6b 20 2a   blocking lock *
8c20: 2f 0a 20 20 20 20 4c 6f 63 6b 28 44 4d 53 32 2f  /.    Lock(DMS2/
8c30: 52 57 2c 20 45 58 43 4c 55 53 49 56 45 29 0a 20  RW, EXCLUSIVE). 
8c40: 20 20 20 69 66 28 20 73 75 63 63 65 73 73 66 75     if( successfu
8c50: 6c 20 29 7b 20 0a 20 20 20 20 20 20 43 68 65 63  l ){ .      Chec
8c60: 6b 70 6f 69 6e 74 0a 20 20 20 20 20 20 4c 6f 63  kpoint.      Loc
8c70: 6b 28 44 4d 53 32 2f 52 4f 2c 20 45 58 43 4c 55  k(DMS2/RO, EXCLU
8c80: 53 49 56 45 29 0a 20 20 20 20 20 20 69 66 28 20  SIVE).      if( 
8c90: 73 75 63 63 65 73 73 66 75 6c 20 29 7b 20 0a 20  successful ){ . 
8ca0: 20 20 20 20 20 20 20 44 65 6c 65 74 65 20 57 41         Delete WA
8cb0: 4c 2b 53 48 4d 20 66 69 6c 65 73 20 0a 20 20 20  L+SHM files .   
8cc0: 20 20 20 20 20 55 6e 6c 6f 63 6b 28 44 4d 53 2f       Unlock(DMS/
8cd0: 52 4f 29 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  RO).      }.    
8ce0: 20 20 55 6e 6c 6f 63 6b 28 44 4d 53 2f 52 57 29    Unlock(DMS/RW)
8cf0: 0a 20 20 20 20 7d 0a 20 20 55 6e 6c 6f 63 6b 28  .    }.  Unlock(
8d00: 44 4d 53 31 29 0a 3c 2f 70 72 65 3e 0a 0a 3c 70  DMS1).</pre>..<p
8d10: 3e 54 6f 20 6f 70 65 6e 20 61 20 72 65 61 64 2d  >To open a read-
8d20: 74 72 61 6e 73 61 63 74 69 6f 6e 3a 0a 0a 3c 70  transaction:..<p
8d30: 72 65 3e 0a 20 20 52 65 61 64 20 77 61 6c 2d 69  re>.  Read wal-i
8d40: 6e 64 65 78 20 68 65 61 64 65 72 2e 0a 3c 2f 70  ndex header..</p
8d50: 72 65 3e 0a 0a 3c 70 3e 54 6f 20 6f 70 65 6e 20  re>..<p>To open 
8d60: 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
8d70: 69 6f 6e 3a 0a 0a 3c 70 3e 54 6f 20 63 6f 6d 6d  ion:..<p>To comm
8d80: 69 74 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  it a write-trans
8d90: 61 63 74 69 6f 6e 3a 0a 0a 0a 0a 0a 0a 3c 68 72  action:......<hr
8da0: 3e 0a 3c 68 72 3e 0a 3c 68 72 3e 0a 0a 3c 69 3e  >.<hr>.<hr>..<i>
8db0: 0a 3c 70 3e 0a 20 20 41 73 20 77 65 6c 6c 20 61  .<p>.  As well a
8dc0: 73 20 74 68 65 20 6d 65 72 67 65 2d 74 72 65 65  s the merge-tree
8dd0: 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c 20 4c 53   file format, LS
8de0: 4d 20 73 74 79 6c 65 20 65 6d 62 65 64 64 65 64  M style embedded
8df0: 20 64 61 74 61 62 61 73 65 73 20 64 65 72 69 76   databases deriv
8e00: 65 0a 20 20 74 68 65 69 72 20 70 65 72 66 6f 72  e.  their perfor
8e10: 6d 61 6e 63 65 20 61 64 76 61 6e 74 61 67 65 73  mance advantages
8e20: 20 62 79 3a 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69   by:..<ol>.  <li
8e30: 3e 20 3c 70 3e 41 63 63 75 6d 75 6c 61 74 69 6e  > <p>Accumulatin
8e40: 67 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 77 72  g a number of wr
8e50: 69 74 65 73 20 69 6e 20 6d 61 69 6e 2d 6d 65 6d  ites in main-mem
8e60: 6f 72 79 20 62 65 66 6f 72 65 20 66 6c 75 73 68  ory before flush
8e70: 69 6e 67 20 74 68 65 6d 20 74 6f 0a 20 20 64 69  ing them to.  di
8e80: 73 6b 2e 20 4c 53 4d 20 64 6f 65 73 20 74 68 69  sk. LSM does thi
8e90: 73 20 75 73 69 6e 67 20 69 74 73 20 22 69 6e 2d  s using its "in-
8ea0: 6d 65 6d 6f 72 79 20 74 72 65 65 22 20 69 6e 20  memory tree" in 
8eb0: 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 4c  shared-memory. L
8ec0: 65 76 65 6c 44 62 20 75 73 65 73 0a 20 20 61 20  evelDb uses.  a 
8ed0: 73 6b 69 70 2d 6c 69 73 74 20 73 74 6f 72 65 64  skip-list stored
8ee0: 20 69 6e 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e   in heap memory.
8ef0: 20 46 54 53 34 20 75 73 65 73 20 61 6e 20 69 6e   FTS4 uses an in
8f00: 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62  -memory hash tab
8f10: 6c 65 2e 0a 0a 20 20 3c 6c 69 3e 20 3c 70 3e 53  le...  <li> <p>S
8f20: 68 69 66 74 69 6e 67 20 73 69 67 6e 69 66 69 63  hifting signific
8f30: 61 6e 74 20 61 6d 6f 75 6e 74 73 20 6f 66 20 77  ant amounts of w
8f40: 6f 72 6b 20 74 6f 20 61 20 62 61 63 6b 67 72 6f  ork to a backgro
8f50: 75 6e 64 20 74 68 72 65 61 64 20 6f 72 20 70 72  und thread or pr
8f60: 6f 63 65 73 73 2e 0a 20 20 4c 65 76 65 6c 44 42  ocess..  LevelDB
8f70: 20 75 73 65 73 20 61 20 64 65 64 69 63 61 74 65   uses a dedicate
8f80: 64 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72  d background thr
8f90: 65 61 64 2e 20 4c 53 4d 20 61 6c 6c 6f 77 73 20  ead. LSM allows 
8fa0: 61 20 73 65 70 61 72 61 74 65 20 64 61 74 61 62  a separate datab
8fb0: 61 73 65 20 0a 20 20 63 6f 6e 6e 65 63 74 69 6f  ase .  connectio
8fc0: 6e 73 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65  ns opened in the
8fd0: 20 73 61 6d 65 20 6f 72 20 64 69 66 66 65 72 65   same or differe
8fe0: 6e 74 20 70 72 6f 63 65 73 73 65 73 20 74 6f 20  nt processes to 
8ff0: 70 65 72 66 6f 72 6d 20 22 77 6f 72 6b 22 20 6f  perform "work" o
9000: 6e 0a 20 20 74 68 65 20 64 61 74 61 62 61 73 65  n.  the database
9010: 20 6f 6e 20 64 65 6d 61 6e 64 2e 20 46 54 53 34   on demand. FTS4
9020: 20 61 6c 73 6f 20 61 6c 6c 6f 77 73 20 61 6e 79   also allows any
9030: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 70   connection to p
9040: 65 72 66 6f 72 6d 20 6d 65 72 67 65 0a 20 20 6f  erform merge.  o
9050: 70 65 72 61 74 69 6f 6e 73 2c 20 62 75 74 20 74  perations, but t
9060: 68 65 20 6d 65 72 67 69 6e 67 20 61 6e 64 20 77  he merging and w
9070: 72 69 74 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65  riting cannot be
9080: 20 70 65 72 66 6f 72 6d 65 64 20 63 6f 6e 63 75   performed concu
9090: 72 72 65 6e 74 6c 79 2e 0a 3c 2f 6f 6c 3e 0a 0a  rrently..</ol>..
90a0: 3c 70 3e 0a 20 20 54 68 65 20 62 61 73 69 63 20  <p>.  The basic 
90b0: 69 64 65 61 20 69 73 20 66 6f 72 20 74 68 65 20  idea is for the 
90c0: 66 69 6c 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20  file to contain 
90d0: 74 77 6f 20 73 65 70 61 72 61 74 65 20 74 72 65  two separate tre
90e0: 65 20 73 74 72 75 63 74 75 72 65 73 20 2d 20 61  e structures - a
90f0: 20 0a 20 20 62 2d 74 72 65 65 20 28 62 2b 74 72   .  b-tree (b+tr
9100: 65 65 29 20 61 6e 64 20 61 20 6d 65 72 67 65 2d  ee) and a merge-
9110: 74 72 65 65 2e 20 49 6e 20 6f 72 64 65 72 20 74  tree. In order t
9120: 6f 20 71 75 65 72 79 20 74 68 65 20 64 61 74 61  o query the data
9130: 62 61 73 65 2c 20 62 6f 74 68 0a 20 20 73 74 72  base, both.  str
9140: 75 63 74 75 72 65 73 20 61 72 65 20 71 75 65 72  uctures are quer
9150: 69 65 64 20 61 6e 64 20 74 68 65 20 72 65 73 75  ied and the resu
9160: 6c 74 73 20 6d 65 72 67 65 64 2c 20 77 69 74 68  lts merged, with
9170: 20 74 68 65 20 6d 65 72 67 65 2d 74 72 65 65 20   the merge-tree 
9180: 61 73 73 75 6d 65 64 20 74 6f 0a 20 20 63 6f 6e  assumed to.  con
9190: 74 61 69 6e 20 6e 65 77 65 72 20 64 61 74 61 20  tain newer data 
91a0: 74 68 61 6e 20 74 68 65 20 62 2d 74 72 65 65 2e  than the b-tree.
91b0: 20 4f 6e 63 65 20 65 6e 6f 75 67 68 20 64 61 74   Once enough dat
91c0: 61 20 68 61 73 20 61 63 63 75 6d 75 6c 61 74 65  a has accumulate
91d0: 64 20 69 6e 20 74 68 65 0a 20 20 6d 65 72 67 65  d in the.  merge
91e0: 2d 74 72 65 65 2c 20 69 74 20 6d 61 79 20 62 65  -tree, it may be
91f0: 20 6d 65 72 67 65 64 20 69 6e 74 6f 20 74 68 65   merged into the
9200: 20 62 2d 74 72 65 65 2e 0a 20 20 0a 3c 70 3e 0a   b-tree..  .<p>.
9210: 20 20 42 6c 69 6e 64 2d 77 72 69 74 65 73 20 69    Blind-writes i
9220: 73 73 75 65 64 20 62 79 20 74 68 65 20 61 70 70  ssued by the app
9230: 6c 69 63 61 74 69 6f 6e 20 61 72 65 20 77 72 69  lication are wri
9240: 74 74 65 6e 20 74 6f 20 74 68 65 20 6d 65 72 67  tten to the merg
9250: 65 2d 74 72 65 65 2e 20 42 2d 74 72 65 65 0a 20  e-tree. B-tree. 
9260: 20 77 72 69 74 65 73 20 61 72 65 20 77 72 69 74   writes are writ
9270: 74 65 6e 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ten directly to 
9280: 74 68 65 20 62 2d 74 72 65 65 2c 20 75 6e 6c 65  the b-tree, unle
9290: 73 73 20 74 68 65 20 6d 65 72 67 65 2d 74 72 65  ss the merge-tre
92a0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 0a 20 20 63  e contains a.  c
92b0: 6f 6e 66 6c 69 63 74 69 6e 67 20 6b 65 79 2c 20  onflicting key, 
92c0: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
92d0: 65 79 20 6d 75 73 74 20 62 65 20 77 72 69 74 74  ey must be writt
92e0: 65 6e 20 74 6f 20 74 68 65 20 6d 65 72 67 65 2d  en to the merge-
92f0: 74 72 65 65 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65  tree...<p>.  The
9300: 20 22 6d 65 72 67 65 2d 74 72 65 65 22 20 69 73   "merge-tree" is
9310: 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 20   written in the 
9320: 73 61 6d 65 20 6d 61 6e 6e 65 72 20 61 73 20 4c  same manner as L
9330: 53 4d 2f 46 54 53 34 2f 4c 65 76 65 6c 44 42 2e  SM/FTS4/LevelDB.
9340: 20 57 68 65 6e 0a 20 20 61 6e 20 61 70 70 6c 69   When.  an appli
9350: 63 61 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f  cation writes to
9360: 20 74 68 65 20 6d 65 72 67 65 2d 74 72 65 65 2c   the merge-tree,
9370: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6e   a copy of the n
9380: 65 77 20 4b 56 20 70 61 69 72 20 6f 72 20 64 65  ew KV pair or de
9390: 6c 65 74 65 0a 20 20 6d 61 72 6b 65 72 20 69 73  lete.  marker is
93a0: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
93b0: 20 64 61 74 61 62 61 73 65 20 6c 6f 67 20 61 6e   database log an
93c0: 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  d an in-memory d
93d0: 61 74 61 20 73 74 72 75 63 74 75 72 65 0a 20 20  ata structure.  
93e0: 75 70 64 61 74 65 64 2e 20 4f 6e 63 65 20 73 75  updated. Once su
93f0: 66 66 69 63 69 65 6e 74 20 64 61 74 61 2c 20 70  fficient data, p
9400: 65 72 68 61 70 73 20 62 65 6c 6f 6e 67 69 6e 67  erhaps belonging
9410: 20 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   to more than on
9420: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20  e transaction,. 
9430: 20 68 61 73 20 61 63 63 75 6d 75 6c 61 74 65 64   has accumulated
9440: 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
9450: 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  y data structure
9460: 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 20 61  , its contents a
9470: 72 65 20 77 72 69 74 74 65 6e 0a 20 20 6f 75 74  re written.  out
9480: 20 74 6f 20 64 69 73 6b 2e 20 41 6e 64 20 73 6f   to disk. And so
9490: 20 6f 6e 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20   on...<p>.  The 
94a0: 62 2d 74 72 65 65 20 69 73 20 77 72 69 74 74 65  b-tree is writte
94b0: 6e 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  n using the same
94c0: 20 6d 65 74 68 6f 64 73 20 61 73 20 53 51 4c 69   methods as SQLi
94d0: 74 65 33 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e  te3 in WAL mode.
94e0: 20 0a 20 20 4d 6f 64 69 66 69 65 64 20 70 61 67   .  Modified pag
94f0: 65 73 20 61 72 65 20 61 70 70 65 6e 64 65 64 20  es are appended 
9500: 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20  to the log file 
9510: 61 6e 64 20 61 20 68 61 73 68 20 74 61 62 6c 65  and a hash table
9520: 20 6f 66 20 74 68 65 0a 20 20 6c 61 74 65 73 74   of the.  latest
9530: 20 76 65 72 73 69 6f 6e 20 6f 66 20 65 61 63 68   version of each
9540: 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 6f 67   page in the log
9550: 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e 2d 6d   maintained in-m
9560: 65 6d 6f 72 79 2e 20 53 6f 6d 65 20 70 61 72 74  emory. Some part
9570: 73 0a 20 20 6f 66 20 74 68 65 20 6d 65 72 67 65  s.  of the merge
9580: 20 74 72 65 65 20 61 72 65 20 77 72 69 74 74 65   tree are writte
9590: 6e 20 75 73 69 6e 67 20 74 68 69 73 20 6d 65 74  n using this met
95a0: 68 6f 64 20 61 73 20 77 65 6c 6c 2e 0a 0a 3c 68  hod as well...<h
95b0: 20 69 64 3d 64 61 74 61 5f 73 74 72 75 63 74 75   id=data_structu
95c0: 72 65 73 3e 34 2e 20 44 61 74 61 20 53 74 72 75  res>4. Data Stru
95d0: 63 74 75 72 65 73 3c 2f 68 31 3e 0a 0a 3c 68 20  ctures</h1>..<h 
95e0: 69 64 3d 6c 6f 67 5f 66 69 6c 65 3e 34 2e 31 2e  id=log_file>4.1.
95f0: 20 4c 6f 67 20 66 69 6c 65 3c 2f 68 32 3e 0a 0a   Log file</h2>..
9600: 48 6f 77 20 64 6f 20 77 65 20 6d 61 6b 65 20 61  How do we make a
9610: 20 77 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 61   wal file into a
9620: 20 63 69 72 63 75 6c 61 72 20 6c 6f 67 20 6c 69   circular log li
9630: 6b 65 20 4c 53 4d 20 75 73 65 73 3f 0a 0a 49 6e  ke LSM uses?..In
9640: 20 4c 53 4d 2c 20 74 68 65 72 65 20 61 72 65 20   LSM, there are 
9650: 74 77 6f 20 77 61 79 73 20 74 68 65 20 6c 6f 67  two ways the log
9660: 20 66 69 6c 65 20 6d 61 79 20 62 65 20 72 65 61   file may be rea
9670: 64 2e 20 46 72 6f 6d 20 62 79 74 65 20 6f 66 66  d. From byte off
9680: 73 65 74 20 30 2c 20 77 69 74 68 0a 77 65 6c 6c  set 0, with.well
9690: 2d 6b 6e 6f 77 6e 20 63 68 65 63 6b 73 75 6d 20  -known checksum 
96a0: 69 6e 69 74 69 61 6c 69 7a 65 72 2c 20 6f 72 20  initializer, or 
96b0: 66 72 6f 6d 20 73 6f 6d 65 20 70 6f 69 6e 74 20  from some point 
96c0: 6d 69 64 77 61 79 20 74 68 72 6f 75 67 68 20 74  midway through t
96d0: 68 65 20 66 69 6c 65 20 0a 73 70 65 63 69 66 69  he file .specifi
96e0: 65 64 20 62 79 20 61 6e 20 6f 66 66 73 65 74 20  ed by an offset 
96f0: 61 6e 64 20 63 68 65 63 6b 73 75 6d 20 69 6e 69  and checksum ini
9700: 74 69 61 6c 69 7a 65 72 2e 20 0a 0a 54 68 65 20  tializer. ..The 
9710: 6c 6f 67 20 66 69 6c 65 20 61 6c 73 6f 20 66 65  log file also fe
9720: 61 74 75 72 65 73 20 22 6a 75 6d 70 20 6d 61 72  atures "jump mar
9730: 6b 65 72 73 22 20 75 73 65 64 20 74 6f 20 77 72  kers" used to wr
9740: 61 70 20 74 68 65 20 63 75 72 73 6f 72 20 65 74  ap the cursor et
9750: 63 2e 0a 0a 4b 65 79 20 70 6f 69 6e 74 20 69 73  c...Key point is
9760: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73   that there is s
9770: 6f 6d 65 20 6f 74 68 65 72 20 63 68 65 63 6b 73  ome other checks
9780: 75 6d 6d 65 64 20 72 65 63 6f 72 64 20 69 6e 20  ummed record in 
9790: 77 68 69 63 68 20 61 20 6c 6f 67 0a 6f 66 66 73  which a log.offs
97a0: 65 74 2f 63 68 65 63 6b 73 75 6d 20 6d 61 79 20  et/checksum may 
97b0: 62 65 20 73 74 6f 72 65 64 2e 0a 0a 53 6f 2c 20  be stored...So, 
97c0: 77 65 20 65 69 74 68 65 72 20 6e 65 65 64 20 74  we either need t
97d0: 6f 20 64 6f 20 74 68 69 73 20 6f 72 20 66 69 6e  o do this or fin
97e0: 64 20 61 20 6e 65 77 20 22 77 65 6c 6c 2d 6b 6e  d a new "well-kn
97f0: 6f 77 6e 20 6f 66 66 73 65 74 22 20 74 6f 20 73  own offset" to s
9800: 74 61 72 74 20 0a 61 74 2e 0a 0a 54 68 65 20 6f  tart .at...The o
9810: 62 76 69 6f 75 73 20 70 6f 69 6e 74 20 69 73 20  bvious point is 
9820: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
9830: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
9840: 54 77 6f 20 70 72 6f 62 6c 65 6d 73 3a 0a 0a 20  Two problems:.. 
9850: 20 2a 20 49 74 20 63 68 61 6e 67 65 73 20 74 6f   * It changes to
9860: 6f 20 6f 66 74 65 6e 2e 0a 20 20 2a 20 42 6c 61  o often..  * Bla
9870: 73 74 2d 72 61 64 69 75 73 20 6d 61 79 20 63 68  st-radius may ch
9880: 61 6e 67 65 20 61 66 74 65 72 20 64 62 20 69 73  ange after db is
9890: 20 63 72 65 61 74 65 64 2e 0a 0a 53 6f 2c 20 65   created...So, e
98a0: 6c 73 65 77 68 65 72 65 20 69 6e 20 74 68 65 20  lsewhere in the 
98b0: 6c 6f 67 20 66 69 6c 65 3f 20 53 70 61 63 65 20  log file? Space 
98c0: 72 65 73 65 72 76 65 64 20 61 74 20 74 68 65 20  reserved at the 
98d0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 67  start of the log
98e0: 3f 0a 41 74 20 74 68 65 20 73 74 61 72 74 20 6f  ?.At the start o
98f0: 66 20 74 68 65 20 6c 6f 67 20 77 65 20 72 65 73  f the log we res
9900: 65 72 76 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20  erve a block of 
9910: 73 69 7a 65 20 24 62 6c 61 73 74 72 61 64 69 75  size $blastradiu
9920: 73 2e 20 54 68 65 6e 20 0a 62 65 67 69 6e 20 77  s. Then .begin w
9930: 72 69 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 69  riting the log i
9940: 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
9950: 77 69 6e 67 20 74 68 69 73 2e 0a 0a 57 68 65 6e  wing this...When
9960: 20 72 65 63 6f 76 65 72 69 6e 67 2c 20 61 74 74   recovering, att
9970: 65 6d 70 74 20 74 6f 20 72 65 61 64 20 61 20 68  empt to read a h
9980: 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 73  eader from the s
9990: 74 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 67 20  tart of the log 
99a0: 66 69 6c 65 2e 0a 49 66 20 6f 6e 65 20 63 61 6e  file..If one can
99b0: 20 62 65 20 72 65 61 64 2c 20 69 74 20 63 6f 6e   be read, it con
99c0: 74 61 69 6e 73 20 61 6e 20 6f 66 66 73 65 74 20  tains an offset 
99d0: 74 6f 20 73 74 61 72 74 20 72 65 61 64 69 6e 67  to start reading
99e0: 20 74 68 65 20 6c 6f 67 20 61 74 2e 20 49 6e 0a   the log at. In.
99f0: 74 68 69 73 20 63 61 73 65 20 70 72 6f 63 65 65  this case procee
9a00: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 62 65  d. Otherwise, be
9a10: 67 69 6e 20 73 65 61 72 63 68 69 6e 67 20 66 6f  gin searching fo
9a20: 72 20 61 20 76 61 6c 69 64 20 68 65 61 64 65 72  r a valid header
9a30: 20 61 74 20 0a 76 61 72 69 6f 75 73 20 70 6f 77   at .various pow
9a40: 65 72 2d 6f 66 2d 74 77 6f 20 6f 66 66 73 65 74  er-of-two offset
9a50: 73 20 77 69 74 68 69 6e 20 74 68 65 20 6c 6f 67  s within the log
9a60: 20 66 69 6c 65 20 28 69 2e 65 2e 20 61 74 20 6f   file (i.e. at o
9a70: 66 66 73 65 74 20 35 31 32 2c 20 0a 74 68 65 6e  ffset 512, .then
9a80: 20 31 30 32 34 2c 20 65 74 63 2e 29 2e 20 54 68   1024, etc.). Th
9a90: 69 73 20 6d 61 79 20 62 65 20 6f 70 74 69 6d 69  is may be optimi
9aa0: 7a 65 64 20 74 6f 20 63 68 65 63 6b 20 74 68 65  zed to check the
9ab0: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66 66   sector-size off
9ac0: 73 65 74 0a 66 69 72 73 74 2e 0a 0a 3c 70 3e 3c  set.first...<p><
9ad0: 62 3e 4c 6f 67 20 66 69 6c 65 20 74 6f 70 6f 6c  b>Log file topol
9ae0: 6f 67 79 3c 2f 62 3e 0a 0a 0a 0a 3c 70 3e 3c 62  ogy</b>....<p><b
9af0: 3e 48 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64  >Hash tables and
9b00: 20 6c 6f 67 20 66 69 6c 65 20 77 72 61 70 70 69   log file wrappi
9b10: 6e 67 3c 2f 62 3e 0a 0a 3c 70 3e 49 6e 20 57 41  ng</b>..<p>In WA
9b20: 4c 20 6d 6f 64 65 2c 20 74 68 65 20 73 68 6d 20  L mode, the shm 
9b30: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  file contains a 
9b40: 6c 69 73 74 20 6f 66 20 74 68 65 20 70 61 67 65  list of the page
9b50: 20 6e 75 6d 62 65 72 73 20 63 6f 72 72 65 73 70   numbers corresp
9b60: 6f 6e 64 69 6e 67 0a 74 6f 20 74 68 65 20 66 72  onding.to the fr
9b70: 61 6d 65 73 20 69 6e 20 74 68 65 20 77 61 6c 20  ames in the wal 
9b80: 66 69 6c 65 2e 20 41 6e 64 20 61 20 68 61 73 68  file. And a hash
9b90: 20 74 61 62 6c 65 20 74 6f 20 61 69 64 20 69 6e   table to aid in
9ba0: 20 73 65 61 72 63 68 69 6e 67 20 74 68 69 73 20   searching this 
9bb0: 6c 69 73 74 2e 0a 0a 3c 70 3e 48 6f 77 20 64 6f  list...<p>How do
9bc0: 65 73 20 74 68 69 73 20 63 68 61 6e 67 65 20 77  es this change w
9bd0: 68 65 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65  hen the log file
9be0: 20 62 65 63 6f 6d 65 73 20 77 72 61 70 70 61 62   becomes wrappab
9bf0: 6c 65 2e 2e 2e 0a 0a 3c 70 3e 49 73 20 69 74 20  le.....<p>Is it 
9c00: 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 6c 65 61  possible to clea
9c10: 72 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74  r entries from t
9c20: 68 65 20 68 61 73 68 2d 74 61 62 6c 65 2f 73 6f  he hash-table/so
9c30: 72 74 65 64 2d 6c 69 73 74 20 61 74 0a 63 68 65  rted-list at.che
9c40: 63 6b 70 6f 69 6e 74 20 74 69 6d 65 3f 0a 0a 44  ckpoint time?..D
9c50: 6f 20 77 65 20 75 73 65 20 4c 53 4d 20 73 74 79  o we use LSM sty
9c60: 6c 65 20 43 48 45 43 4b 50 4f 49 4e 54 45 52 2f  le CHECKPOINTER/
9c70: 57 52 49 54 45 52 2f 57 4f 52 4b 45 52 20 6c 6f  WRITER/WORKER lo
9c80: 63 6b 69 6e 67 20 68 65 72 65 3f 0a 0a 0a 0a 3c  cking here?....<
9c90: 68 20 69 64 3d 6d 65 72 67 65 2d 74 72 65 65 5f  h id=merge-tree_
9ca0: 64 61 74 61 3e 34 2e 32 2e 20 4d 65 72 67 65 2d  data>4.2. Merge-
9cb0: 54 72 65 65 20 44 61 74 61 3c 2f 68 32 3e 0a 0a  Tree Data</h2>..
9cc0: 3c 70 3e 0a 20 20 4d 65 72 67 65 2d 74 72 65 65  <p>.  Merge-tree
9cd0: 20 64 61 74 61 20 69 73 20 73 74 6f 72 65 64 20   data is stored 
9ce0: 69 6e 20 73 65 67 6d 65 6e 74 73 2e 20 41 20 73  in segments. A s
9cf0: 65 67 6d 65 6e 74 20 69 73 20 61 20 74 69 67 68  egment is a tigh
9d00: 74 6c 79 0a 20 20 70 61 63 6b 65 64 20 72 65 61  tly.  packed rea
9d10: 64 2d 6f 6e 6c 79 20 62 2d 74 72 65 65 2e 20 45  d-only b-tree. E
9d20: 61 63 68 20 73 65 67 6d 65 6e 74 20 69 73 20 65  ach segment is e
9d30: 71 75 61 6c 20 74 6f 20 6f 72 20 6c 65 73 73 20  qual to or less 
9d40: 74 68 61 6e 20 73 6f 6d 65 0a 20 20 63 6f 6e 66  than some.  conf
9d50: 69 67 75 72 65 64 20 73 69 7a 65 20 28 73 61 79  igured size (say
9d60: 20 35 31 32 4b 42 20 6f 72 20 32 4d 42 20 2d 20   512KB or 2MB - 
9d70: 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 6d 6f 72  probably not mor
9d80: 65 29 2e 20 54 68 65 20 6d 61 6a 6f 72 69 74 79  e). The majority
9d90: 20 6f 66 0a 20 20 73 65 67 6d 65 6e 74 73 20 73   of.  segments s
9da0: 68 6f 75 6c 64 20 62 65 20 65 78 61 63 74 6c 79  hould be exactly
9db0: 20 74 68 69 73 20 73 69 7a 65 2e 20 54 68 69 73   this size. This
9dc0: 20 73 69 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 61   size is known a
9dd0: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  s the database. 
9de0: 20 62 6c 6f 63 6b 20 73 69 7a 65 2e 0a 0a 3c 70   block size...<p
9df0: 3e 0a 20 20 57 68 65 6e 20 61 20 6e 65 77 20 73  >.  When a new s
9e00: 65 67 6d 65 6e 74 20 69 73 20 63 72 65 61 74 65  egment is create
9e10: 64 2c 20 65 69 74 68 65 72 20 62 79 20 66 6c 75  d, either by flu
9e20: 73 68 69 6e 67 20 74 68 65 20 69 6e 2d 6d 65 6d  shing the in-mem
9e30: 6f 72 79 20 62 75 66 66 65 72 20 6f 72 20 62 79  ory buffer or by
9e40: 0a 20 20 6d 65 72 67 69 6e 67 20 64 61 74 61 20  .  merging data 
9e50: 66 72 6f 6d 20 74 77 6f 20 6f 72 20 6d 6f 72 65  from two or more
9e60: 20 65 78 69 73 74 69 6e 67 20 73 65 67 6d 65 6e   existing segmen
9e70: 74 73 20 74 6f 67 65 74 68 65 72 2c 20 69 74 20  ts together, it 
9e80: 69 73 20 77 72 69 74 74 65 6e 0a 20 20 64 69 72  is written.  dir
9e90: 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 64  ectly into the d
9ea0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 62 79  atabase file (by
9eb0: 70 61 73 73 69 6e 67 20 74 68 65 20 6c 6f 67 20  passing the log 
9ec0: 66 69 6c 65 29 2e 20 41 6c 6c 20 74 68 61 74 20  file). All that 
9ed0: 69 73 20 77 72 69 74 74 65 6e 0a 20 20 74 6f 20  is written.  to 
9ee0: 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20  the log file is 
9ef0: 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68  a checksum of th
9f00: 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 2c 20 66  e new segment, f
9f10: 6f 72 20 75 73 65 20 64 75 72 69 6e 67 20 72 65  or use during re
9f20: 63 6f 76 65 72 79 2e 0a 20 20 45 76 65 6e 20 69  covery..  Even i
9f30: 66 20 74 68 65 79 20 61 72 65 20 6c 65 73 73 20  f they are less 
9f40: 74 68 61 6e 20 61 20 62 6c 6f 63 6b 20 69 6e 20  than a block in 
9f50: 73 69 7a 65 2c 20 73 65 67 6d 65 6e 74 73 20 61  size, segments a
9f60: 72 65 20 61 6c 77 61 79 73 20 77 72 69 74 74 65  re always writte
9f70: 6e 20 69 6e 74 6f 0a 20 20 61 6c 69 67 6e 65 64  n into.  aligned
9f80: 20 62 6c 6f 63 6b 73 2e 0a 0a 3c 70 3e 0a 20 20   blocks...<p>.  
9f90: 54 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75  The data structu
9fa0: 72 65 20 75 73 65 64 20 74 6f 20 6b 65 65 70 20  re used to keep 
9fb0: 74 72 61 63 6b 20 6f 66 20 61 6c 6c 20 73 65 67  track of all seg
9fc0: 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 61 20 64  ments within a d
9fd0: 61 74 61 62 61 73 65 20 69 73 0a 20 20 75 70 64  atabase is.  upd
9fe0: 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 73  ated using the s
9ff0: 61 6d 65 20 28 57 41 4c 2d 6c 69 6b 65 29 20 6d  ame (WAL-like) m
a000: 65 74 68 6f 64 73 20 61 73 20 74 68 65 20 62 2d  ethods as the b-
a010: 74 72 65 65 20 64 61 74 61 2e 20 46 6f 72 20 65  tree data. For e
a020: 61 63 68 20 73 65 67 6d 65 6e 74 2c 0a 20 20 74  ach segment,.  t
a030: 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  he data structur
a040: 65 20 73 74 6f 72 65 73 3a 0a 0a 3c 75 6c 3e 0a  e stores:..<ul>.
a050: 20 20 3c 6c 69 3e 20 54 68 65 20 73 6d 61 6c 6c    <li> The small
a060: 65 73 74 20 6b 65 79 20 69 74 20 63 6f 6e 74 61  est key it conta
a070: 69 6e 73 2c 0a 20 20 3c 6c 69 3e 20 54 68 65 20  ins,.  <li> The 
a080: 6c 61 72 67 65 73 74 20 6b 65 79 20 69 74 20 63  largest key it c
a090: 6f 6e 74 61 69 6e 73 2c 20 61 6e 64 0a 20 20 3c  ontains, and.  <
a0a0: 6c 69 3e 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  li> A pointer to
a0b0: 20 74 68 65 20 73 65 67 6d 65 6e 74 20 77 69 74   the segment wit
a0c0: 68 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hin the database
a0d0: 20 66 69 6c 65 2e 0a 3c 2f 75 6c 3e 0a 0a 0a 0a   file..</ul>....
a0e0: 3c 68 72 3e 0a 20 20 0a 3c 70 3e 0a 20 20 54 68  <hr>.  .<p>.  Th
a0f0: 65 20 74 72 65 65 20 73 74 72 75 63 74 75 72 65  e tree structure
a100: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 61   is similar to a
a110: 20 62 2d 74 72 65 65 2e 20 45 61 63 68 20 69 6e   b-tree. Each in
a120: 74 65 72 6e 61 6c 20 6e 6f 64 65 20 68 61 73 20  ternal node has 
a130: 4e 20 0a 20 20 63 68 69 6c 64 72 65 6e 20 61 6e  N .  children an
a140: 64 20 4e 2d 31 20 64 69 76 69 64 65 72 20 6b 65  d N-1 divider ke
a150: 79 73 2e 20 54 68 65 20 49 74 68 20 64 69 76 69  ys. The Ith divi
a160: 64 65 72 20 6b 65 79 20 6f 6e 20 61 6e 20 69 6e  der key on an in
a170: 74 65 72 6e 61 6c 20 6e 6f 64 65 0a 20 20 69 73  ternal node.  is
a180: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c   a copy of the l
a190: 61 72 67 65 73 74 20 6b 65 79 20 6c 6f 63 61 74  argest key locat
a1a0: 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 49 74  ed within the It
a1b0: 68 20 63 68 69 6c 64 20 73 75 62 2d 74 72 65 65  h child sub-tree
a1c0: 20 6f 66 20 0a 20 20 74 68 65 20 6e 6f 64 65 2e   of .  the node.
a1d0: 0a 20 20 0a 3c 70 3e 0a 20 20 4f 74 68 65 72 20  .  .<p>.  Other 
a1e0: 49 6e 76 61 72 69 61 6e 74 73 3a 0a 20 20 0a 3c  Invariants:.  .<
a1f0: 75 6c 3e 0a 20 20 20 20 3c 6c 69 3e 20 41 6c 6c  ul>.    <li> All
a200: 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 61 20 63   segments on a c
a210: 68 69 6c 64 20 6e 6f 64 65 20 6d 75 73 74 20 62  hild node must b
a220: 65 20 6f 6c 64 65 72 20 74 68 61 6e 20 61 6c 6c  e older than all
a230: 20 6f 76 65 72 6c 61 70 70 69 6e 67 0a 20 20 20   overlapping.   
a240: 20 20 20 69 6e 74 65 72 76 61 6c 73 20 6f 6e 20     intervals on 
a250: 69 74 73 20 70 61 72 65 6e 74 2e 0a 20 20 0a 20  its parent..  . 
a260: 20 20 20 3c 6c 69 3e 20 46 6f 72 20 6b 65 79 20     <li> For key 
a270: 4b 2c 20 74 68 65 20 70 61 74 68 20 62 65 74 77  K, the path betw
a280: 65 65 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64  een the root nod
a290: 65 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20 74  e and the leaf t
a2a0: 68 61 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20  hat would.      
a2b0: 63 6f 6e 74 61 69 6e 20 4b 20 6d 75 73 74 20 76  contain K must v
a2c0: 69 73 69 74 20 61 6c 6c 20 6e 6f 64 65 73 20 74  isit all nodes t
a2d0: 68 61 74 20 63 6f 6e 74 61 69 6e 20 73 65 67 6d  hat contain segm
a2e0: 65 6e 74 73 20 6f 76 65 72 6c 61 70 70 69 6e 67  ents overlapping
a2f0: 20 4b 2e 0a 20 20 0a 20 20 20 20 3c 6c 69 3e 20   K..  .    <li> 
a300: 54 68 65 20 61 62 6f 76 65 20 69 6d 70 6c 69 65  The above implie
a310: 73 20 74 68 61 74 20 61 6c 74 68 6f 75 67 68 20  s that although 
a320: 69 6e 74 65 72 76 61 6c 73 20 6f 6e 20 61 20 6e  intervals on a n
a330: 6f 64 65 20 6d 61 79 20 6f 76 65 72 6c 61 70 20  ode may overlap 
a340: 77 69 74 68 0a 20 20 20 20 20 20 6f 74 68 65 72  with.      other
a350: 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 74 68 65   segments on the
a360: 20 73 61 6d 65 20 6e 6f 64 65 2c 20 61 6e 20 61   same node, an a
a370: 6e 63 65 73 74 6f 72 20 6e 6f 64 65 20 6f 72 20  ncestor node or 
a380: 61 20 64 65 73 63 65 6e 64 65 6e 74 0a 20 20 20  a descendent.   
a390: 20 20 20 6e 6f 64 65 2c 20 74 68 65 79 20 6d 61     node, they ma
a3a0: 79 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69  y not overlap wi
a3b0: 74 68 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 61  th segments on a
a3c0: 20 73 69 62 6c 69 6e 67 20 6e 6f 64 65 2e 0a 3c   sibling node..<
a3d0: 2f 75 6c 3e 0a 20 20 0a 3c 70 3e 0a 20 20 57 69  /ul>.  .<p>.  Wi
a3e0: 74 68 69 6e 20 61 20 6e 6f 64 65 2c 20 74 68 65  thin a node, the
a3f0: 20 72 65 6c 61 74 69 76 65 20 61 67 65 20 6f 66   relative age of
a400: 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 69 73   each segment is
a410: 20 73 74 6f 72 65 64 20 28 69 2e 65 2e 20 65 6e   stored (i.e. en
a420: 6f 75 67 68 0a 20 20 69 6e 66 6f 72 6d 61 74 69  ough.  informati
a430: 6f 6e 20 74 6f 20 73 6f 72 74 20 61 6c 6c 20 73  on to sort all s
a440: 65 67 6d 65 6e 74 73 20 69 6e 20 6f 72 64 65 72  egments in order
a450: 20 6f 66 20 61 67 65 29 2e 0a 0a 3c 70 3e 0a 20   of age)...<p>. 
a460: 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20   In some cases, 
a470: 61 20 6e 6f 64 65 20 6d 61 79 20 62 65 20 65 78  a node may be ex
a480: 74 65 6e 64 65 64 20 77 69 74 68 20 6f 6e 65 20  tended with one 
a490: 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77  or more overflow
a4a0: 20 70 61 67 65 73 20 0a 20 20 69 6e 20 6c 69 6e   pages .  in lin
a4b0: 6b 65 64 20 69 6e 74 6f 20 61 20 6c 69 73 74 2e  ked into a list.
a4c0: 20 4d 61 6b 69 6e 67 20 6e 6f 64 65 73 20 65 66   Making nodes ef
a4d0: 66 65 63 74 69 76 65 6c 79 20 76 61 72 69 61 62  fectively variab
a4e0: 6c 79 20 73 69 7a 65 64 2e 0a 0a 3c 70 3e 3c 62  ly sized...<p><b
a4f0: 3e 49 6e 73 65 72 74 2d 53 65 67 6d 65 6e 74 3a  >Insert-Segment:
a500: 3c 2f 62 3e 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69  </b>..<ol>.  <li
a510: 3e 3c 70 3e 20 49 6e 73 65 72 74 20 74 68 65 20  ><p> Insert the 
a520: 6e 65 77 20 73 65 67 6d 65 6e 74 20 69 6e 74 6f  new segment into
a530: 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20   the root node. 
a540: 49 66 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  If the root node
a550: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 61 6c 73   is not.     als
a560: 6f 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 69  o a leaf node, i
a570: 6d 6d 65 64 69 61 74 65 6c 79 20 61 74 74 65 6d  mmediately attem
a580: 70 74 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 68  pt to promote th
a590: 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 74 6f  e new segment to
a5a0: 0a 20 20 20 20 20 61 20 63 68 69 6c 64 20 6e 6f  .     a child no
a5b0: 64 65 2e 20 54 68 65 20 73 65 67 6d 65 6e 74 20  de. The segment 
a5c0: 6d 61 79 20 62 65 20 70 72 6f 6d 6f 74 65 64 20  may be promoted 
a5d0: 69 66 3a 0a 0a 20 20 20 20 3c 6f 6c 3e 0a 20 20  if:..    <ol>.  
a5e0: 20 20 20 20 20 3c 6c 69 3e 20 54 68 65 72 65 20       <li> There 
a5f0: 61 72 65 20 6e 6f 20 65 78 69 73 74 69 6e 67 20  are no existing 
a600: 28 6f 6c 64 65 72 29 20 73 65 67 6d 65 6e 74 73  (older) segments
a610: 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64   on the root nod
a620: 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  e that.         
a630: 6f 76 65 72 6c 61 70 20 77 69 74 68 20 69 74 2c  overlap with it,
a640: 20 61 6e 64 0a 0a 20 20 20 20 20 20 20 3c 6c 69   and..       <li
a650: 3e 20 62 6f 74 68 20 74 68 65 20 73 74 61 72 74  > both the start
a660: 20 61 6e 64 20 65 6e 64 20 6b 65 79 20 6f 66 20   and end key of 
a670: 74 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 20  the new segment 
a680: 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 0a 20  may be stored . 
a690: 20 20 20 20 20 20 20 20 77 69 74 68 69 6e 20 74          within t
a6a0: 68 65 20 73 61 6d 65 20 63 68 69 6c 64 20 73 75  he same child su
a6b0: 62 2d 74 72 65 65 2e 0a 20 20 20 20 3c 2f 6f 6c  b-tree..    </ol
a6c0: 3e 0a 0a 20 20 20 20 3c 70 3e 0a 20 20 20 20 20  >..    <p>.     
a6d0: 50 72 6f 6d 6f 74 65 20 74 68 65 20 6e 65 77 20  Promote the new 
a6e0: 73 65 67 6d 65 6e 74 20 61 73 20 6d 61 6e 79 20  segment as many 
a6f0: 74 69 6d 65 73 20 61 73 20 70 6f 73 73 69 62 6c  times as possibl
a700: 65 20 28 69 2e 65 2e 20 75 6e 74 69 6c 20 69 74  e (i.e. until it
a710: 0a 20 20 20 20 20 69 73 20 73 74 6f 72 65 64 20  .     is stored 
a720: 6f 6e 20 61 20 6c 65 61 66 20 6f 72 20 6f 6e 20  on a leaf or on 
a730: 61 20 6e 6f 64 65 20 66 6f 72 20 77 68 69 63 68  a node for which
a740: 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20   one of the two 
a750: 63 6f 6e 64 69 74 69 6f 6e 73 20 0a 20 20 20 20  conditions .    
a760: 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 6d 65   above is not me
a770: 74 29 2e 0a 0a 20 20 3c 6c 69 3e 3c 70 3e 20 43  t)...  <li><p> C
a780: 68 65 63 6b 20 69 66 20 74 68 65 20 6e 6f 64 65  heck if the node
a790: 20 73 65 6c 65 63 74 65 64 20 62 79 20 73 74 65   selected by ste
a7a0: 70 20 31 20 68 61 73 20 65 6e 6f 75 67 68 20 73  p 1 has enough s
a7b0: 70 61 63 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61  pace to accomoda
a7c0: 74 65 20 0a 20 20 20 20 20 74 68 65 20 6e 65 77  te .     the new
a7d0: 20 73 65 67 6d 65 6e 74 2e 20 49 66 20 73 6f 2c   segment. If so,
a7e0: 20 6e 6f 20 70 72 6f 62 6c 65 6d 2e 0a 0a 20 20   no problem...  
a7f0: 20 20 3c 70 3e 0a 20 20 20 20 20 4f 74 68 65 72    <p>.     Other
a800: 77 69 73 65 2c 20 74 68 65 20 6e 6f 64 65 20 63  wise, the node c
a810: 6f 6e 74 65 6e 74 20 69 73 20 72 65 64 69 73 74  ontent is redist
a820: 72 69 62 75 74 65 64 20 62 65 74 77 65 65 6e 20  ributed between 
a830: 69 74 73 65 6c 66 20 61 6e 64 0a 20 20 20 20 20  itself and.     
a840: 6f 6e 65 20 6f 72 20 74 77 6f 20 73 69 62 6c 69  one or two sibli
a850: 6e 67 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 73  ngs, and a new s
a860: 69 62 6c 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64  ibling allocated
a870: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   if necessary.. 
a880: 20 20 20 20 54 68 69 73 20 69 73 20 73 6c 69 67      This is slig
a890: 68 74 6c 79 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  htly more comple
a8a0: 78 20 74 68 61 6e 20 61 20 62 2d 74 72 65 65 20  x than a b-tree 
a8b0: 72 65 62 61 6c 61 6e 63 65 2c 20 61 73 20 74 68  rebalance, as th
a8c0: 65 0a 20 20 20 20 20 66 69 72 73 74 20 61 6e 64  e.     first and
a8d0: 20 6c 61 73 74 20 6b 65 79 73 20 6f 66 20 65 61   last keys of ea
a8e0: 63 68 20 73 65 67 6d 65 6e 74 20 6d 75 73 74 20  ch segment must 
a8f0: 72 65 6d 61 69 6e 20 6f 6e 20 74 68 65 20 73 61  remain on the sa
a900: 6d 65 20 6e 6f 64 65 2e 0a 20 20 20 20 20 57 68  me node..     Wh
a910: 65 72 65 20 74 68 69 73 20 6d 61 6b 65 73 20 74  ere this makes t
a920: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6d 70 6f 73  he content impos
a930: 73 69 62 6c 65 20 74 6f 20 64 69 73 74 72 69 62  sible to distrib
a940: 75 74 65 20 62 65 74 77 65 65 6e 0a 20 20 20 20  ute between.    
a950: 20 6e 6f 64 65 73 2c 20 74 68 65 20 6f 72 69 67   nodes, the orig
a960: 69 6e 61 6c 20 6e 6f 64 65 20 69 73 20 65 78 74  inal node is ext
a970: 65 6e 64 65 64 20 77 69 74 68 20 61 6e 20 6f 76  ended with an ov
a980: 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 3c 2f 6f  erflow page..</o
a990: 6c 3e 0a 0a 3c 70 3e 3c 62 3e 20 4d 65 72 67 65  l>..<p><b> Merge
a9a0: 2d 53 65 67 6d 65 6e 74 73 3a 3c 2f 62 3e 0a 0a  -Segments:</b>..
a9b0: 3c 6f 6c 3e 0a 20 20 3c 6c 69 3e 20 46 72 6f 6d  <ol>.  <li> From
a9c0: 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 6e 6f   the selected no
a9d0: 64 65 20 58 20 28 73 65 65 20 62 65 6c 6f 77 29  de X (see below)
a9e0: 2c 20 73 65 6c 65 63 74 20 74 77 6f 20 6f 72 20  , select two or 
a9f0: 6d 6f 72 65 20 6f 76 65 72 6c 61 70 70 69 6e 67  more overlapping
aa00: 20 0a 20 20 20 20 20 73 65 67 6d 65 6e 74 73 20   .     segments 
aa10: 74 6f 20 6d 65 72 67 65 2e 20 0a 0a 20 20 3c 6c  to merge. ..  <l
aa20: 69 3e 20 4d 65 72 67 65 20 74 68 65 20 63 6f 6e  i> Merge the con
aa30: 74 65 6e 74 20 6f 66 20 74 68 65 20 73 65 6c 65  tent of the sele
aa40: 63 74 65 64 20 73 65 67 6d 65 6e 74 73 20 74 6f  cted segments to
aa50: 67 65 74 68 65 72 20 69 6e 74 6f 20 61 20 73 65  gether into a se
aa60: 74 20 6f 66 20 7a 65 72 6f 20 6f 72 0a 20 20 20  t of zero or.   
aa70: 20 20 6d 6f 72 65 20 6e 6f 6e 2d 6f 76 65 72 6c    more non-overl
aa80: 61 70 70 69 6e 67 20 73 65 67 6d 65 6e 74 73 2e  apping segments.
aa90: 20 52 65 6d 6f 76 65 20 74 68 65 20 6f 72 69 67   Remove the orig
aaa0: 69 6e 61 6c 73 20 66 72 6f 6d 20 6e 6f 64 65 20  inals from node 
aab0: 58 2e 20 54 68 65 6e 0a 20 20 20 20 20 22 69 6e  X. Then.     "in
aac0: 73 65 72 74 22 20 65 61 63 68 20 6f 66 20 74 68  sert" each of th
aad0: 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 73 20 69  e new segments i
aae0: 6e 74 6f 20 74 68 65 20 73 75 62 2d 74 72 65 65  nto the sub-tree
aaf0: 20 68 65 61 64 65 64 20 62 79 20 6e 6f 64 65 20   headed by node 
ab00: 58 0a 20 20 20 20 20 28 69 6e 63 6c 75 64 69 6e  X.     (includin
ab10: 67 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  g attempting to 
ab20: 70 72 6f 6d 6f 74 65 20 74 68 65 20 6e 65 77 20  promote the new 
ab30: 73 65 67 6d 65 6e 74 73 20 65 74 63 2e 29 2e 20  segments etc.). 
ab40: 0a 0a 20 20 3c 6c 69 3e 20 49 66 2c 20 66 6f 6c  ..  <li> If, fol
ab50: 6c 6f 77 69 6e 67 20 74 68 69 73 2c 20 6e 6f 64  lowing this, nod
ab60: 65 20 58 20 69 73 20 6f 76 65 72 20 6f 72 20 75  e X is over or u
ab70: 6e 64 65 72 66 75 6c 6c 2c 20 72 65 62 61 6c 61  nderfull, rebala
ab80: 6e 63 65 20 69 74 20 77 69 74 68 0a 20 20 20 20  nce it with.    
ab90: 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20 69 6e   its siblings in
aba0: 20 74 68 65 20 6d 61 6e 6e 65 72 20 6f 66 20 61   the manner of a
abb0: 20 62 2d 74 72 65 65 2e 0a 3c 2f 6f 6c 3e 0a 0a   b-tree..</ol>..
abc0: 3c 70 3e 3c 62 3e 20 53 65 6c 65 63 74 2d 53 65  <p><b> Select-Se
abd0: 67 6d 65 6e 74 3a 3c 2f 62 3e 0a 0a 3c 70 3e 0a  gment:</b>..<p>.
abe0: 20 20 45 61 63 68 20 6e 6f 64 65 20 6d 61 69 6e    Each node main
abf0: 74 61 69 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66  tains a count of
ac00: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
ac10: 76 65 72 6c 61 70 70 69 6e 67 20 73 65 67 6d 65  verlapping segme
ac20: 6e 74 73 20 0a 20 20 63 75 72 72 65 6e 74 6c 79  nts .  currently
ac30: 20 73 74 6f 72 65 64 20 6f 6e 20 69 74 2e 20 41   stored on it. A
ac40: 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 65 61 63  dditionally, eac
ac50: 68 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  h pointer to a s
ac60: 75 62 2d 74 72 65 65 0a 20 20 6f 6e 20 61 6e 20  ub-tree.  on an 
ac70: 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 61 6c  internal node al
ac80: 73 6f 20 73 74 6f 72 65 73 20 74 68 65 20 6d 61  so stores the ma
ac90: 78 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 74  ximum value of t
aca0: 68 69 73 20 6d 65 74 72 69 63 20 66 6f 72 20 0a  his metric for .
acb0: 20 20 61 6c 6c 20 6e 6f 64 65 73 20 69 6e 20 74    all nodes in t
acc0: 68 65 20 73 75 62 2d 74 72 65 65 2e 0a 0a 3c 70  he sub-tree...<p
acd0: 3e 0a 20 20 54 68 69 73 20 69 6d 70 6c 69 65 73  >.  This implies
ace0: 20 74 68 61 74 20 77 68 65 6e 20 61 20 6e 6f 64   that when a nod
acf0: 65 20 69 73 20 75 70 64 61 74 65 64 20 62 79 20  e is updated by 
ad00: 61 20 62 6c 69 6e 64 20 77 72 69 74 65 20 6f 70  a blind write op
ad10: 65 72 61 74 69 6f 6e 2c 20 61 6c 6c 0a 20 20 6e  eration, all.  n
ad20: 6f 64 65 73 20 62 65 74 77 65 65 6e 20 69 74 20  odes between it 
ad30: 61 6e 64 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64  and the root nod
ad40: 65 20 6d 61 79 20 61 6c 73 6f 20 72 65 71 75 69  e may also requi
ad50: 72 65 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  re modification 
ad60: 28 68 6f 77 0a 20 20 6f 66 74 65 6e 3f 29 2e 0a  (how.  often?)..
ad70: 0a 3c 70 3e 0a 20 20 54 68 69 73 20 6d 65 74 72  .<p>.  This metr
ad80: 69 63 2c 20 61 6c 6f 6e 67 20 77 69 74 68 20 73  ic, along with s
ad90: 6f 6d 65 20 70 73 65 75 64 6f 2d 72 61 6e 64 6f  ome pseudo-rando
ada0: 6d 20 73 65 6c 65 63 74 69 6f 6e 20 77 68 65 6e  m selection when
adb0: 20 74 68 65 72 65 20 0a 20 20 65 78 69 73 74 20   there .  exist 
adc0: 6d 75 6c 74 69 70 6c 65 20 6e 6f 64 65 73 20 77  multiple nodes w
add0: 69 74 68 20 74 68 65 20 73 61 6d 65 20 76 61 6c  ith the same val
ade0: 75 65 2c 20 63 61 6e 20 62 65 20 75 73 65 64 20  ue, can be used 
adf0: 74 6f 20 73 65 6c 65 63 74 0a 20 20 61 20 72 65  to select.  a re
ae00: 61 73 6f 6e 61 62 6c 65 20 70 6c 61 63 65 20 74  asonable place t
ae10: 6f 20 6d 65 72 67 65 20 73 65 67 6d 65 6e 74 73  o merge segments
ae20: 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 6c   together with l
ae30: 69 74 74 6c 65 20 65 66 66 6f 72 74 2e 0a 0a 3c  ittle effort...<
ae40: 68 20 69 64 3d 62 2d 74 72 65 65 5f 64 61 74 61  h id=b-tree_data
ae50: 3e 34 2e 33 2e 20 42 2d 54 72 65 65 20 44 61 74  >4.3. B-Tree Dat
ae60: 61 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 42 2d  a</h2>..<p>.  B-
ae70: 74 72 65 65 20 4b 56 20 70 61 69 72 73 20 61 72  tree KV pairs ar
ae80: 65 20 73 74 6f 72 65 64 20 69 6e 20 6c 65 61 66  e stored in leaf
ae90: 20 70 61 67 65 73 2e 20 49 66 20 6e 6f 20 6d 65   pages. If no me
aea0: 72 67 65 2d 74 72 65 65 20 64 61 74 61 20 69 73  rge-tree data is
aeb0: 20 65 76 65 72 0a 20 20 77 72 69 74 74 65 6e 20   ever.  written 
aec0: 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 69 74  to a database it
aed0: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
aee0: 6f 20 61 20 62 2b 74 72 65 65 2e 20 54 68 65 20  o a b+tree. The 
aef0: 72 65 62 61 6c 61 6e 63 69 6e 67 20 61 6e 64 0a  rebalancing and.
af00: 20 20 6f 74 68 65 72 20 74 72 65 65 20 6d 61 6e    other tree man
af10: 69 70 75 6c 61 74 69 6f 6e 73 20 72 65 71 75 69  ipulations requi
af20: 72 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20  red as a result 
af30: 6f 66 20 62 2b 2d 74 72 65 65 20 73 74 79 6c 65  of b+-tree style
af40: 20 69 6e 73 65 72 74 20 61 6e 64 0a 20 20 64 65   insert and.  de
af50: 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 73 20  lete operations 
af60: 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  are the same as 
af70: 74 68 65 79 20 61 72 65 20 66 6f 72 20 72 65 67  they are for reg
af80: 75 6c 61 72 20 62 2b 2d 74 72 65 65 20 73 74 72  ular b+-tree str
af90: 75 63 74 75 72 65 73 2c 0a 20 20 65 78 63 65 70  uctures,.  excep
afa0: 74 20 74 68 61 74 20 63 61 72 65 20 6d 75 73 74  t that care must
afb0: 20 62 65 20 74 61 6b 65 6e 20 74 6f 20 6b 65 65   be taken to kee
afc0: 70 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20  p the start and 
afd0: 65 6e 64 20 6b 65 79 73 20 6f 66 20 61 6e 79 0a  end keys of any.
afe0: 20 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 74 68    segments on th
aff0: 65 20 73 61 6d 65 20 69 6e 74 65 72 6e 61 6c 20  e same internal 
b000: 6e 6f 64 65 20 28 73 65 65 20 61 62 6f 76 65 29  node (see above)
b010: 2e 0a 0a 3c 70 3e 0a 20 20 49 66 20 61 20 64 61  ...<p>.  If a da
b020: 74 61 62 61 73 65 20 69 73 20 6f 6e 6c 79 20 65  tabase is only e
b030: 76 65 72 20 77 72 69 74 74 65 6e 20 75 73 69 6e  ver written usin
b040: 67 20 62 6c 69 6e 64 20 77 72 69 74 65 73 2c 20  g blind writes, 
b050: 74 68 65 6e 20 69 74 20 69 73 20 69 6e 20 0a 20  then it is in . 
b060: 20 6f 70 74 69 6d 61 6c 20 66 6f 72 6d 20 77 68   optimal form wh
b070: 65 6e 20 6e 6f 20 74 77 6f 20 73 65 67 6d 65 6e  en no two segmen
b080: 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ts in the databa
b090: 73 65 20 6f 76 65 72 6c 61 70 2e 20 49 66 20 61  se overlap. If a
b0a0: 20 64 61 74 61 62 61 73 65 0a 20 20 63 6f 6e 74   database.  cont
b0b0: 61 69 6e 73 20 62 6f 74 68 20 62 2d 74 72 65 65  ains both b-tree
b0c0: 20 61 6e 64 20 62 6c 69 6e 64 20 77 72 69 74 65   and blind write
b0d0: 20 64 61 74 61 2c 20 74 68 65 6e 20 74 68 65 20   data, then the 
b0e0: 62 6c 69 6e 64 20 77 72 69 74 65 73 20 6d 75 73  blind writes mus
b0f0: 74 0a 20 20 62 65 20 6d 65 72 67 65 64 20 69 6e  t.  be merged in
b100: 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20 64 61  to the b-tree da
b110: 74 61 20 62 65 66 6f 72 65 20 74 68 65 20 64 61  ta before the da
b120: 74 61 62 61 73 65 20 69 73 20 69 6e 20 69 74 73  tabase is in its
b130: 20 6f 70 74 69 6d 61 6c 0a 20 20 73 74 61 74 65   optimal.  state
b140: 2e 0a 0a 3c 70 3e 0a 20 20 57 69 74 68 20 62 6c  ...<p>.  With bl
b150: 69 6e 64 20 77 72 69 74 65 20 64 61 74 61 20 6f  ind write data o
b160: 6e 6c 79 20 28 61 6e 64 20 6e 6f 20 6d 65 72 67  nly (and no merg
b170: 69 6e 67 20 77 69 74 68 20 62 2d 74 72 65 65 20  ing with b-tree 
b180: 64 61 74 61 29 2c 20 73 65 67 6d 65 6e 74 73 0a  data), segments.
b190: 20 20 6d 61 79 20 70 72 6f 70 61 67 61 74 65 20    may propagate 
b1a0: 61 6c 6c 20 74 68 65 20 77 61 79 20 74 6f 20 6c  all the way to l
b1b0: 65 61 66 20 6e 6f 64 65 73 2e 20 48 6f 77 65 76  eaf nodes. Howev
b1c0: 65 72 2c 20 69 66 20 74 68 65 20 74 72 65 65 20  er, if the tree 
b1d0: 63 6f 6e 74 61 69 6e 73 0a 20 20 62 6f 74 68 20  contains.  both 
b1e0: 73 65 67 6d 65 6e 74 20 61 6e 64 20 62 2d 74 72  segment and b-tr
b1f0: 65 65 20 64 61 74 61 2c 20 74 68 65 6e 20 73 65  ee data, then se
b200: 67 6d 65 6e 74 73 20 74 68 61 74 20 72 65 73 69  gments that resi
b210: 64 65 20 6f 6e 20 74 72 65 65 20 6e 6f 64 65 73  de on tree nodes
b220: 0a 20 20 74 68 61 74 20 61 72 65 20 74 68 65 20  .  that are the 
b230: 68 65 61 64 20 6f 66 20 61 20 73 75 62 2d 74 72  head of a sub-tr
b240: 65 65 20 72 6f 75 67 68 6c 79 20 74 68 65 20 73  ee roughly the s
b250: 69 7a 65 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ize of a single 
b260: 73 65 67 6d 65 6e 74 20 0a 20 20 73 68 6f 75 6c  segment .  shoul
b270: 64 20 62 65 20 6d 65 72 67 65 64 20 77 69 74 68  d be merged with
b280: 20 62 2d 74 72 65 65 20 64 61 74 61 20 61 74 20   b-tree data at 
b290: 74 68 61 74 20 70 6f 69 6e 74 2c 20 6e 6f 74 20  that point, not 
b2a0: 70 72 6f 6d 6f 74 65 64 20 66 75 72 74 68 65 72  promoted further
b2b0: 20 0a 20 20 64 6f 77 6e 20 74 68 65 20 74 72 65   .  down the tre
b2c0: 65 2e 20 53 6f 2c 20 61 66 74 65 72 20 61 20 6e  e. So, after a n
b2d0: 6f 64 65 27 73 20 73 65 67 6d 65 6e 74 73 20 61  ode's segments a
b2e0: 72 65 20 73 65 6c 65 63 74 65 64 20 66 6f 72 20  re selected for 
b2f0: 6d 65 72 67 69 6e 67 20 69 74 20 0a 20 20 6e 65  merging it .  ne
b300: 65 64 73 20 74 6f 20 62 65 20 70 6f 73 73 69 62  eds to be possib
b310: 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  le to determine 
b320: 69 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 73  if the content s
b330: 68 6f 75 6c 64 20 62 65 20 6d 65 72 67 65 64 20  hould be merged 
b340: 77 69 74 68 20 0a 20 20 74 68 65 20 73 75 62 2d  with .  the sub-
b350: 74 72 65 65 20 68 65 61 64 65 64 20 62 79 20 74  tree headed by t
b360: 68 65 20 6e 6f 64 65 20 61 73 20 77 65 6c 6c 20  he node as well 
b370: 61 73 20 77 69 74 68 20 6f 74 68 65 72 20 73 65  as with other se
b380: 67 6d 65 6e 74 73 2e 20 54 68 65 0a 20 20 61 6e  gments. The.  an
b390: 73 77 65 72 20 69 73 20 79 65 73 20 69 66 3a 0a  swer is yes if:.
b3a0: 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 20 54 68 65  .<ul>.  <li> The
b3b0: 20 73 75 62 2d 74 72 65 65 20 63 6f 6e 74 61 69   sub-tree contai
b3c0: 6e 73 20 6e 6f 20 73 65 67 6d 65 6e 74 73 20 28  ns no segments (
b3d0: 65 78 63 65 70 74 20 74 68 6f 73 65 20 6f 6e 20  except those on 
b3e0: 69 74 73 20 72 6f 6f 74 20 6e 6f 64 65 29 2e 0a  its root node)..
b3f0: 20 20 3c 6c 69 3e 20 54 68 65 20 73 75 62 2d 74    <li> The sub-t
b400: 72 65 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 69  ree is smaller i
b410: 6e 20 73 69 7a 65 20 74 68 61 6e 20 73 6f 6d 65  n size than some
b420: 20 74 68 72 65 73 68 6f 6c 64 20 62 61 73 65 64   threshold based
b430: 20 6f 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20   on the .       
b440: 73 65 67 6d 65 6e 74 20 73 69 7a 65 20 28 73 61  segment size (sa
b450: 79 20 32 20 6f 72 20 34 20 74 69 6d 65 73 29 2e  y 2 or 4 times).
b460: 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20 20 53 74  .</ul>..<p>.  St
b470: 6f 72 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  oring the number
b480: 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 6f 66 20   of segments of 
b490: 74 68 65 20 73 75 62 2d 74 72 65 65 20 6f 6e 20  the sub-tree on 
b4a0: 65 61 63 68 20 6e 6f 64 65 20 73 65 65 6d 73 20  each node seems 
b4b0: 4f 6b 2e 20 54 68 69 73 0a 20 20 6d 65 61 6e 73  Ok. This.  means
b4c0: 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 70 61   updating the pa
b4d0: 74 68 20 62 65 74 77 65 65 6e 20 74 68 65 20 75  th between the u
b4e0: 70 64 61 74 65 64 20 6e 6f 64 65 20 61 6e 64 20  pdated node and 
b4f0: 74 68 65 20 72 6f 6f 74 20 65 61 63 68 20 74 69  the root each ti
b500: 6d 65 20 74 68 65 0a 20 20 73 65 74 20 6f 66 20  me the.  set of 
b510: 73 65 67 6d 65 6e 74 73 20 6f 6e 20 61 20 6e 6f  segments on a no
b520: 64 65 20 69 73 20 6d 6f 64 69 66 69 65 64 2e 20  de is modified. 
b530: 53 69 6e 63 65 20 73 65 67 6d 65 6e 74 73 20 61  Since segments a
b540: 72 65 20 6d 75 63 68 20 6c 61 72 67 65 72 20 74  re much larger t
b550: 68 61 6e 0a 20 20 74 68 69 73 20 70 61 74 68 2c  han.  this path,
b560: 20 61 6e 64 20 75 70 64 61 74 65 64 20 72 65 6c   and updated rel
b570: 61 74 69 76 65 6c 79 20 69 6e 66 72 65 71 75 65  atively infreque
b580: 6e 74 6c 79 2c 20 74 68 69 73 20 69 73 20 61 63  ntly, this is ac
b590: 63 65 70 74 61 62 6c 65 2e 0a 0a 3c 70 3e 0a 20  ceptable...<p>. 
b5a0: 20 4d 61 69 6e 74 61 69 6e 69 6e 67 20 74 68 65   Maintaining the
b5b0: 20 74 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74   total size of t
b5c0: 68 65 20 73 75 62 2d 74 72 65 65 20 69 73 20 6d  he sub-tree is m
b5d0: 6f 72 65 20 64 69 66 66 69 63 75 6c 74 2e 20 43  ore difficult. C
b5e0: 61 6e 20 77 65 20 75 70 64 61 74 65 0a 20 20 65  an we update.  e
b5f0: 61 63 68 20 74 69 6d 65 20 61 20 6c 65 61 66 20  ach time a leaf 
b600: 69 73 20 61 64 64 65 64 20 6f 72 20 72 65 6d 6f  is added or remo
b610: 76 65 64 3f 20 53 6f 75 6e 64 73 20 6c 69 6b 65  ved? Sounds like
b620: 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 61   that might be a
b630: 20 6c 6f 74 20 6f 66 0a 20 20 65 78 74 72 61 20   lot of.  extra 
b640: 75 70 64 61 74 65 73 20 6f 76 65 72 20 61 20 73  updates over a s
b650: 74 72 61 69 67 68 74 20 62 2d 74 72 65 65 2e 0a  traight b-tree..
b660: 0a 3c 70 3e 0a 20 20 43 61 6e 20 77 65 20 6a 75  .<p>.  Can we ju
b670: 73 74 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  st estimate the 
b680: 71 75 61 6e 74 69 74 79 20 6f 66 20 64 61 74 61  quantity of data
b690: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6e 75   based on the nu
b6a0: 6d 62 65 72 20 6f 66 20 63 68 69 6c 64 72 65 6e  mber of children
b6b0: 0a 20 20 74 68 65 20 6e 6f 64 65 20 68 61 73 20  .  the node has 
b6c0: 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 64  along with the d
b6d0: 69 73 74 61 6e 63 65 20 66 72 6f 6d 20 74 68 65  istance from the
b6e0: 20 74 72 65 65 20 6c 65 61 76 65 73 3f 20 49 66   tree leaves? If
b6f0: 20 61 20 6e 6f 64 65 20 68 61 73 0a 20 20 6e 43   a node has.  nC
b700: 68 69 6c 64 20 63 68 69 6c 64 72 65 6e 20 61 6e  hild children an
b710: 64 20 74 68 65 20 73 75 62 2d 74 72 65 65 20 69  d the sub-tree i
b720: 73 20 6e 53 75 62 20 65 6c 65 6d 65 6e 74 73 20  s nSub elements 
b730: 68 69 67 68 2c 20 74 68 65 20 73 69 7a 65 20 6f  high, the size o
b740: 66 20 74 68 65 20 0a 20 20 73 75 62 2d 74 72 65  f the .  sub-tre
b750: 65 20 63 6f 75 6c 64 20 62 65 20 65 73 74 69 6d  e could be estim
b760: 61 74 65 64 20 61 73 20 6e 43 68 69 6c 64 20 72  ated as nChild r
b770: 61 69 73 65 64 20 74 6f 20 74 68 65 20 6e 53 75  aised to the nSu
b780: 62 27 74 68 20 70 6f 77 65 72 2e 20 54 68 69 73  b'th power. This
b790: 20 0a 20 20 65 73 74 69 6d 61 74 65 20 69 73 20   .  estimate is 
b7a0: 70 72 6f 62 61 62 6c 79 20 67 6f 6f 64 20 65 6e  probably good en
b7b0: 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65 73  ough for the tes
b7c0: 74 20 61 62 6f 76 65 2e 0a 0a 0a 3c 68 20 69 64  t above....<h id
b7d0: 3d 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 35 2e 20  =file_format>5. 
b7e0: 46 69 6c 65 20 46 6f 72 6d 61 74 3c 2f 68 31 3e  File Format</h1>
b7f0: 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 64 61 74 61  ..<p>.  The data
b800: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 73 74   structure is st
b810: 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 69 6e 20  ored on disk in 
b820: 61 20 6d 61 6e 6e 65 72 20 73 69 6d 69 6c 61 72  a manner similar
b830: 20 74 6f 20 53 51 4c 69 74 65 20 57 41 4c 0a 20   to SQLite WAL. 
b840: 20 64 61 74 61 62 61 73 65 73 2e 20 54 68 65 20   databases. The 
b850: 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 70  file-system is p
b860: 6f 70 75 6c 61 74 65 64 20 77 69 74 68 3a 0a 0a  opulated with:..
b870: 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 20 41 20 64 61  <ul>.  <li> A da
b880: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 3c  tabase file..  <
b890: 6c 69 3e 20 41 20 77 72 69 74 65 2d 61 68 65 61  li> A write-ahea
b8a0: 64 2d 6c 6f 67 20 66 69 6c 65 2c 20 63 6f 6e 74  d-log file, cont
b8b0: 61 69 6e 69 6e 67 20 72 65 63 65 6e 74 6c 79 20  aining recently 
b8c0: 6d 61 64 65 20 6d 6f 64 69 66 69 63 61 74 69 6f  made modificatio
b8d0: 6e 73 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ns to the.      
b8e0: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 3c 6c 69   database..  <li
b8f0: 3e 20 41 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  > A shared-memor
b900: 79 20 66 69 6c 65 2c 20 74 68 65 20 63 6f 6e 74  y file, the cont
b910: 65 6e 74 73 20 6f 66 20 77 68 69 63 68 20 6d 61  ents of which ma
b920: 79 20 62 65 20 72 65 63 6f 6e 73 74 72 75 63 74  y be reconstruct
b930: 65 64 20 62 79 0a 20 20 20 20 20 20 20 70 61 72  ed by.       par
b940: 73 69 6e 67 20 74 68 65 20 77 61 6c 20 66 69 6c  sing the wal fil
b950: 65 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20 20  e..</ul>..<p>.  
b960: 41 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 6e  As well as the n
b970: 65 77 20 70 61 67 65 20 69 6d 61 67 65 73 20 63  ew page images c
b980: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61 6e 20 53  ontained in an S
b990: 51 4c 69 74 65 20 57 41 4c 20 66 69 6c 65 2c 20  QLite WAL file, 
b9a0: 74 68 69 73 20 6c 6f 67 20 0a 20 20 66 69 6c 65  this log .  file
b9b0: 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 4b   also contains K
b9c0: 56 20 70 61 69 72 73 20 61 6e 64 20 64 65 6c 65  V pairs and dele
b9d0: 74 65 20 6d 61 72 6b 65 72 73 20 77 72 69 74 74  te markers writt
b9e0: 65 6e 20 69 6e 20 62 6c 69 6e 64 20 77 72 69 74  en in blind writ
b9f0: 65 20 6d 6f 64 65 2e 0a 0a 3c 70 3e 0a 20 20 53  e mode...<p>.  S
ba00: 69 6d 69 6c 61 72 6c 79 2c 20 61 73 20 77 65 6c  imilarly, as wel
ba10: 6c 20 61 73 20 74 68 65 20 68 61 73 68 2d 74 61  l as the hash-ta
ba20: 62 6c 65 73 20 75 73 65 64 20 74 6f 20 69 6e 64  bles used to ind
ba30: 65 78 20 74 68 65 20 70 61 67 65 20 69 6d 61 67  ex the page imag
ba40: 65 73 20 63 6f 6e 74 61 69 6e 65 64 0a 20 20 69  es contained.  i
ba50: 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20  n the log file, 
ba60: 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  the shared-memor
ba70: 79 20 66 69 6c 65 20 61 6c 73 6f 20 68 6f 6c 64  y file also hold
ba80: 73 20 61 20 74 72 65 65 20 73 74 72 75 63 74 75  s a tree structu
ba90: 72 65 0a 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20  re.  containing 
baa0: 61 6c 6c 20 74 68 65 20 62 6c 69 6e 64 20 77 72  all the blind wr
bab0: 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68  ite data from th
bac0: 65 20 6c 6f 67 20 66 69 6c 65 20 28 61 73 20 69  e log file (as i
bad0: 74 20 64 6f 65 73 20 69 6e 20 4c 53 4d 20 61 6e  t does in LSM an
bae0: 64 0a 20 20 4c 65 76 65 6c 44 42 29 2e 0a 0a 3c  d.  LevelDB)...<
baf0: 70 3e 0a 20 20 41 73 20 69 6e 20 53 51 4c 69 74  p>.  As in SQLit
bb00: 65 33 2c 20 66 72 65 65 20 73 70 61 63 65 20 77  e3, free space w
bb10: 69 74 68 69 6e 20 74 68 65 20 64 61 74 61 62 61  ithin the databa
bb20: 73 65 20 66 69 6c 65 20 69 73 20 74 72 61 63 6b  se file is track
bb30: 65 64 20 6f 6e 20 61 20 70 65 72 2d 70 61 67 65  ed on a per-page
bb40: 20 0a 20 20 62 61 73 69 73 2e 20 54 68 65 20 64   .  basis. The d
bb50: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 75 73  ata structure us
bb60: 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
bb70: 73 65 74 20 6f 66 20 66 72 65 65 20 70 61 67 65  set of free page
bb80: 73 20 73 74 6f 72 65 73 20 74 68 65 6d 20 0a 20  s stores them . 
bb90: 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
bba0: 2e 0a 0a 3c 70 3e 4e 6f 74 65 3a 20 54 72 61 63  ...<p>Note: Trac
bbb0: 6b 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 28 62  k free blocks (b
bbc0: 6c 6f 63 6b 73 20 6f 6e 20 77 68 69 63 68 20 61  locks on which a
bbd0: 6c 6c 20 70 61 67 65 73 20 61 72 65 20 66 72 65  ll pages are fre
bbe0: 65 29 20 73 65 70 61 72 61 74 65 6c 79 3f 0a 0a  e) separately?..
bbf0: 0a 3c 68 20 69 64 3d 6c 6f 63 6b 69 6e 67 5f 61  .<h id=locking_a
bc00: 6e 64 5f 63 6f 6e 63 75 72 72 65 6e 63 79 3e 36  nd_concurrency>6
bc10: 2e 20 4c 6f 63 6b 69 6e 67 20 61 6e 64 20 43 6f  . Locking and Co
bc20: 6e 63 75 72 72 65 6e 63 79 3c 2f 68 31 3e 0a 0a  ncurrency</h1>..
bc30: 3c 70 3e 0a 0a 3c 68 20 69 64 3d 70 61 67 65 72  <p>..<h id=pager
bc40: 5f 6c 65 76 65 6c 5f 64 65 73 69 67 6e 3e 37 2e  _level_design>7.
bc50: 20 50 61 67 65 72 20 4c 65 76 65 6c 20 44 65 73   Pager Level Des
bc60: 69 67 6e 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 20 20  ign</h1>..<p>.  
bc70: 49 6e 63 6c 75 64 65 20 6d 61 6e 61 67 65 6d 65  Include manageme
bc80: 6e 74 20 6f 66 20 66 72 65 65 2d 73 70 61 63 65  nt of free-space
bc90: 20 77 69 74 68 69 6e 20 74 68 65 20 64 61 74 61   within the data
bca0: 62 61 73 65 20 69 6e 20 74 68 69 73 20 6c 65 76  base in this lev
bcb0: 65 6c 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 70  el...<p>.  The p
bcc0: 61 67 65 72 20 6c 65 76 65 6c 20 70 72 6f 76 69  ager level provi
bcd0: 64 65 73 20 74 77 6f 20 73 69 7a 65 73 20 6f 66  des two sizes of
bce0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 3a 0a 20 20 3c   allocation:.  <
bcf0: 75 6c 3e 0a 20 20 20 20 3c 6c 69 3e 20 50 61 67  ul>.    <li> Pag
bd00: 65 20 73 69 7a 65 20 28 31 2d 34 20 4b 42 29 2c  e size (1-4 KB),
bd10: 20 61 6e 64 0a 20 20 20 20 3c 6c 69 3e 20 42 6c   and.    <li> Bl
bd20: 6f 63 6b 20 73 69 7a 65 20 28 35 31 32 4b 42 20  ock size (512KB 
bd30: 74 6f 20 32 4d 42 29 2e 0a 20 20 3c 2f 75 6c 3e  to 2MB)..  </ul>
bd40: 0a 3c 2f 70 3e 0a 2d 2d 3e 0a 0a 0a 0a 0a 0a 0a  .</p>.-->.......
bd50: 0a 0a 0a 0a 0a 0a 0a 0a 0a 0a 0a 0a 0a 0a 0a 0a  ................
bd60: 0a 0a 0a 0a 0a 0a 0a 0a 0a 0a 0a 0a 0a 0a 0a 0a  ................
bd70: 0a 0a 0a 0a 0a 0a 0a                             .......