/ Hex Artifact Content
Login

Artifact 01559397cbd4a5aa62a822e8ca9ac94b6db14743:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ....#ifndef SQLI
03f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0400: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0410: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0420: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0430: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0440: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0450: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0460: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0470: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0480: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0490: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
04a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
04b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
04c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
04d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
04e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
04f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0500: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0510: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0520: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0530: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0540: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0550: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0560: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0570: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0580: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0590: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
05a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
05b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
05c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
05d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
05e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
05f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0600: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0610: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0620: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0630: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0640: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0650: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0660: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0670: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0680: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0690: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
06a0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
06b0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
06c0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
06d0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
06e0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
06f0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0700: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0710: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0720: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0730: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0740: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0750: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0760: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0770: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0780: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0790: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
07a0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
07b0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
07c0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
07d0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
07e0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
07f0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0800: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0810: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0820: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0830: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0840: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0850: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0860: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0870: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0880: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0890: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
08a0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
08b0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
08c0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
08d0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
08e0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
08f0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0900: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0910: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0920: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0930: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0940: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0950: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0960: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0970: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0980: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0990: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
09a0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
09b0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
09c0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
09d0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
09e0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
09f0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0a00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0a10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0a20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0a30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0a40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0a50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0a60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0a70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0a80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0a90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0aa0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0ab0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ac0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ad0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ae0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0af0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0b00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0b10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0b20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0b30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0b40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0b50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0b60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0b70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0b80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0b90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0ba0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0bb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0bc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0bd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0be0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0bf0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
0c00: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
0c10: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c20: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
0c30: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
0c40: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
0c50: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
0c60: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
0c70: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
0c80: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
0c90: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
0ca0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
0cb0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
0cc0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
0cd0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
0ce0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
0cf0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
0d00: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
0d10: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
0d20: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
0d30: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
0d40: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
0d50: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
0d60: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
0d70: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
0d80: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
0d90: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
0da0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
0db0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
0dc0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
0dd0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
0de0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
0df0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
0e00: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
0e10: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
0e20: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
0e30: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
0e40: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
0e50: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
0e60: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
0e70: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
0e80: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
0e90: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0ea0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
0eb0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
0ec0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
0ed0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
0ee0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
0ef0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
0f00: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
0f10: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
0f20: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
0f30: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
0f40: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
0f50: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
0f60: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
0f70: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
0f80: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
0f90: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
0fa0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
0fb0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
0fc0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
0fd0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
0fe0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
0ff0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1000: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1010: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1020: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1030: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1040: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1050: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1060: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1070: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1080: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1090: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
10a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
10b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
10c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
10d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
10e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
10f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1100: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1110: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1120: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1130: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1140: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1150: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1160: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1170: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1180: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1190: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
11a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
11b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
11c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
11d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
11e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
11f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1200: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1210: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1220: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1230: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1240: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1250: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1260: 2d 3e 66 6c 61 67 73 26 44 42 5f 53 63 68 65 6d  ->flags&DB_Schem
1270: 61 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a  aLoaded)==0) ){.
1280: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1290: 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  }..  /* Figure o
12a0: 75 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  ut the root-page
12b0: 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73   that the lock s
12c0: 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e  hould be held on
12d0: 2e 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a  . For table.  **
12e0: 20 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69   b-trees, this i
12f0: 73 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20  s just the root 
1300: 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
1310: 65 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72  ee being read or
1320: 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46  .  ** written. F
1330: 6f 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73  or index b-trees
1340: 2c 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74  , it is the root
1350: 20 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73   page of the ass
1360: 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62  ociated.  ** tab
1370: 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  le.  */.  if( is
1380: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73  Index ){.    Has
1390: 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f  hElem *p;.    fo
13a0: 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(p=sqliteHashFi
13b0: 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64  rst(&pSchema->id
13c0: 78 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c  xHash); p; p=sql
13d0: 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b  iteHashNext(p)){
13e0: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
13f0: 64 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71  dx = (Index *)sq
1400: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b  liteHashData(p);
1410: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
1420: 3e 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f  >tnum==(int)iRoo
1430: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 61  t ){.        iTa
1440: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1450: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1460: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1470: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1480: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1490: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
14a0: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
14b0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
14c0: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
14d0: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
14e0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
14f0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1500: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1510: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1520: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1530: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1540: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1550: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1560: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1570: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1580: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1590: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
15a0: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
15b0: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
15c0: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
15d0: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
15e0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
15f0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1600: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1610: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1620: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1630: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1640: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1650: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1660: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1670: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1680: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1690: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
16a0: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
16b0: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
16c0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
16d0: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
16e0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
16f0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1700: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1710: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1720: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1730: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
1740: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
1750: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
1760: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
1770: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
1780: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
1790: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
17a0: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
17b0: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
17c0: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
17d0: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
17e0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
17f0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
1800: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
1810: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
1820: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
1830: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
1840: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1850: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
1860: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
1870: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
1880: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
1890: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
18a0: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
18b0: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
18c0: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
18d0: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
18e0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
18f0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
1900: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
1910: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
1920: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
1930: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
1940: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
1950: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
1960: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
1970: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
1980: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
1990: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
19a0: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
19b0: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
19c0: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
19d0: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
19e0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
19f0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
1a00: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1a10: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
1a20: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
1a30: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
1a40: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
1a50: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
1a60: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
1a70: 6d 69 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20  mitted).    ){. 
1a80: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1a90: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1aa0: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20  n 0;.}.#endif   
1ab0: 20 2f 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54   /* #ifdef SQLIT
1ac0: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a  E_DEBUG */../*.*
1ad0: 2a 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69  * Query to see i
1ae0: 66 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  f Btree handle p
1af0: 20 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f   may obtain a lo
1b00: 63 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b  ck of type eLock
1b10: 20 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20   .** (READ_LOCK 
1b20: 6f 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f  or WRITE_LOCK) o
1b30: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
1b40: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e   root-page iTab.
1b50: 20 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   Return.** SQLIT
1b60: 45 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b  E_OK if the lock
1b70: 20 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64   may be obtained
1b80: 20 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   (by calling.** 
1b90: 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
1ba0: 62 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53  bleLock()), or S
1bb0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20  QLITE_LOCKED if 
1bc0: 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  not..*/.static i
1bd0: 6e 74 20 71 75 65 72 79 53 68 61 72 65 64 43 61  nt querySharedCa
1be0: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72  cheTableLock(Btr
1bf0: 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62  ee *p, Pgno iTab
1c00: 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42  , u8 eLock){.  B
1c10: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1c20: 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20  ->pBt;.  BtLock 
1c30: 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  *pIter;..  asser
1c40: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
1c50: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
1c60: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
1c70: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  =READ_LOCK || eL
1c80: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
1c90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
1ca0: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
1cb0: 74 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67  t( !(p->db->flag
1cc0: 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  s&SQLITE_ReadUnc
1cd0: 6f 6d 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b  ommitted)||eLock
1ce0: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54  ==WRITE_LOCK||iT
1cf0: 61 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a  ab==1 );.  .  /*
1d00: 20 49 66 20 72 65 71 75 65 73 74 69 6e 67 20 61   If requesting a
1d10: 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65   write-lock, the
1d20: 6e 20 74 68 65 20 42 74 72 65 65 20 6d 75 73 74  n the Btree must
1d30: 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
1d40: 69 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  ite.  ** transac
1d50: 74 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c  tion on this fil
1d60: 65 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c  e. And, obviousl
1d70: 79 2c 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62  y, for this to b
1d80: 65 20 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a  e so there .  **
1d90: 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e   must be an open
1da0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1db0: 6f 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69  on on the file i
1dc0: 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73  tself..  */.  as
1dd0: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
1de0: 44 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42  D_LOCK || (p==pB
1df0: 74 2d 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d  t->pWriter && p-
1e00: 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1e10: 57 52 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65  WRITE) );.  asse
1e20: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
1e30: 4c 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54  LOCK || pBt->inT
1e40: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1e50: 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20  S_WRITE );.  .  
1e60: 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
1e70: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
1e80: 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69  e shared-cache i
1e90: 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f  s not enabled */
1ea0: 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
1eb0: 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ble ){.    retur
1ec0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1ed0: 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f  ..  /* If some o
1ee0: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
1ef0: 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78  is holding an ex
1f00: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68  clusive lock, th
1f10: 65 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64  e.  ** requested
1f20: 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65   lock may not be
1f30: 20 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a   obtained..  */.
1f40: 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74    if( pBt->pWrit
1f50: 65 72 21 3d 70 20 26 26 20 70 42 74 2d 3e 69 73  er!=p && pBt->is
1f60: 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20  Exclusive ){.   
1f70: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
1f80: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
1f90: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
1fa0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
1fb0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
1fc0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
1fd0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
1fe0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
1ff0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2000: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2010: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2020: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2030: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2040: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2050: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2060: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2070: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2080: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2090: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
20a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
20b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
20c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
20d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
20e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
20f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2100: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2110: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2120: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2130: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2140: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2150: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2160: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2170: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2180: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2190: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
21a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
21b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
21c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
21d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
21e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
21f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2200: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2210: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2220: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2230: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2240: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2250: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2260: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2270: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2280: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2290: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
22a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
22b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
22c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
22d0: 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d  pBt->isPending =
22e0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
22f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2300: 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
2310: 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  HE;.    }.  }.  
2320: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2330: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  ;.}.#endif /* !S
2340: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2350: 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e  D_CACHE */..#ifn
2360: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2370: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a  SHARED_CACHE./*.
2380: 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f 6e  ** Add a lock on
2390: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
23a0: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65  root-page iTable
23b0: 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62   to the shared-b
23c0: 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79 20  tree used.** by 
23d0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 20  Btree handle p. 
23e0: 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b 20  Parameter eLock 
23f0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 52  must be either R
2400: 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20  EAD_LOCK or .** 
2410: 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  WRITE_LOCK..**.*
2420: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2430: 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f 6c 6c  assumes the foll
2440: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 28  owing:.**.**   (
2450: 61 29 20 54 68 65 20 73 70 65 63 69 66 69 65 64  a) The specified
2460: 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70 20   Btree object p 
2470: 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  is connected to 
2480: 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20 20 20  a sharable.**   
2490: 20 20 20 20 64 61 74 61 62 61 73 65 20 28 6f 6e      database (on
24a0: 65 20 77 69 74 68 20 74 68 65 20 42 74 53 68 61  e with the BtSha
24b0: 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66 6c 61  red.sharable fla
24c0: 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a 0a 2a  g set), and.**.*
24d0: 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68 65 72  *   (b) No other
24e0: 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73 20 68   Btree objects h
24f0: 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61 74 20  old a lock that 
2500: 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20 20  conflicts.**    
2510: 20 20 20 77 69 74 68 20 74 68 65 20 72 65 71 75     with the requ
2520: 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65 2e  ested lock (i.e.
2530: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
2540: 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61 73  eTableLock() has
2550: 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65 61 64  .**       alread
2560: 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 61 6e  y been called an
2570: 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54  d returned SQLIT
2580: 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  E_OK)..**.** SQL
2590: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
25a0: 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69  ed if the lock i
25b0: 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66  s added successf
25c0: 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d  ully. SQLITE_NOM
25d0: 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  EM .** is return
25e0: 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 61  ed if a malloc a
25f0: 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a 2f  ttempt fails..*/
2600: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 53  .static int setS
2610: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
2620: 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67  ock(Btree *p, Pg
2630: 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c  no iTable, u8 eL
2640: 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ock){.  BtShared
2650: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2660: 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20    BtLock *pLock 
2670: 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  = 0;.  BtLock *p
2680: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2690: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
26a0: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
26b0: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
26c0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
26d0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
26e0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
26f0: 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 63  !=0 );..  /* A c
2700: 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 74  onnection with t
2710: 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  he read-uncommit
2720: 74 65 64 20 66 6c 61 67 20 73 65 74 20 77 69 6c  ted flag set wil
2730: 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f 0a 20  l never try to. 
2740: 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72 65 61   ** obtain a rea
2750: 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68 69  d-lock using thi
2760: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20  s function. The 
2770: 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  only read-lock o
2780: 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79 20  btained.  ** by 
2790: 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20  a connection in 
27a0: 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64  read-uncommitted
27b0: 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68 65 20   mode is on the 
27c0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a 20  sqlite_master . 
27d0: 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20 74   ** table, and t
27e0: 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61  hat lock is obta
27f0: 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42 65 67  ined in BtreeBeg
2800: 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a 20  inTrans().  */. 
2810: 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70 2d 3e   assert( 0==(p->
2820: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
2830: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
2840: 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  ) || eLock==WRIT
2850: 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  E_LOCK );..  /* 
2860: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
2870: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
2880: 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61 62 6c  led on a sharabl
2890: 65 20 62 2d 74 72 65 65 20 61 66 74 65 72 20 69  e b-tree after i
28a0: 74 20 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e  t .  ** has been
28b0: 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
28c0: 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72 65 65   no other b-tree
28d0: 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c 69 63   holds a conflic
28e0: 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20  ting lock.  */. 
28f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72   assert( p->shar
2900: 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  able );.  assert
2910: 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65  ( SQLITE_OK==que
2920: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
2930: 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65  leLock(p, iTable
2940: 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f  , eLock) );..  /
2950: 2a 20 46 69 72 73 74 20 73 65 61 72 63 68 20 74  * First search t
2960: 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65  he list for an e
2970: 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20  xisting lock on 
2980: 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  this table. */. 
2990: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
29a0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
29b0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
29c0: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  ){.    if( pIter
29d0: 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
29e0: 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65   && pIter->pBtre
29f0: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c  e==p ){.      pL
2a00: 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20  ock = pIter;.   
2a10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2a20: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
2a30: 20 61 62 6f 76 65 20 73 65 61 72 63 68 20 64 69   above search di
2a40: 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c  d not find a BtL
2a50: 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63  ock struct assoc
2a60: 69 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20  iating Btree p. 
2a70: 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69   ** with table i
2a80: 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20  Table, allocate 
2a90: 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20  one and link it 
2aa0: 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20  into the list.. 
2ab0: 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b   */.  if( !pLock
2ac0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20   ){.    pLock = 
2ad0: 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65  (BtLock *)sqlite
2ae0: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65  3MallocZero(size
2af0: 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20  of(BtLock));.   
2b00: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
2b10: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2b20: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
2b30: 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c      pLock->iTabl
2b40: 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20  e = iTable;.    
2b50: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20  pLock->pBtree = 
2b60: 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e  p;.    pLock->pN
2b70: 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
2b80: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b  ;.    pBt->pLock
2b90: 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20   = pLock;.  }.. 
2ba0: 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f   /* Set the BtLo
2bb0: 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  ck.eLock variabl
2bc0: 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  e to the maximum
2bd0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
2be0: 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68  lock.  ** and th
2bf0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2c00: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
2c10: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73  a write-lock was
2c20: 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20   already held.  
2c30: 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f  ** and a read-lo
2c40: 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65  ck requested, we
2c50: 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74   don't incorrect
2c60: 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65  ly downgrade the
2c70: 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73   lock..  */.  as
2c80: 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b  sert( WRITE_LOCK
2c90: 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  >READ_LOCK );.  
2ca0: 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d  if( eLock>pLock-
2cb0: 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c  >eLock ){.    pL
2cc0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f  ock->eLock = eLo
2cd0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ck;.  }..  retur
2ce0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
2cf0: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
2d00: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2d10: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
2d20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2d30: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65  D_CACHE./*.** Re
2d40: 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61  lease all the ta
2d50: 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73  ble locks (locks
2d60: 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61   obtained via ca
2d70: 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65  lls to.** the se
2d80: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2d90: 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72  eLock() procedur
2da0: 65 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65  e) held by Btree
2db0: 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a   object p..**.**
2dc0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
2dd0: 73 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65  ssumes that Btre
2de0: 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  e p has an open 
2df0: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a  read or write .*
2e00: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
2e10: 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74  f it does not, t
2e20: 68 65 6e 20 74 68 65 20 42 74 53 68 61 72 65 64  hen the BtShared
2e30: 2e 69 73 50 65 6e 64 69 6e 67 20 76 61 72 69 61  .isPending varia
2e40: 62 6c 65 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e  ble.** may be in
2e50: 63 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65  correctly cleare
2e60: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
2e70: 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64  d clearAllShared
2e80: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
2e90: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
2ea0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2eb0: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
2ec0: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
2ed0: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
2ee0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2ef0: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2f00: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
2f10: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
2f20: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
2f30: 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a  ->inTrans>0 );..
2f40: 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72    while( *ppIter
2f50: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
2f60: 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b  pLock = *ppIter;
2f70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
2f80: 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30  ->isExclusive==0
2f90: 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72   || pBt->pWriter
2fa0: 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20  ==pLock->pBtree 
2fb0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2fc0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e  Lock->pBtree->in
2fd0: 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c  Trans>=pLock->eL
2fe0: 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ock );.    if( p
2ff0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
3000: 29 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72  ){.      *ppIter
3010: 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b   = pLock->pNext;
3020: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
3030: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
3040: 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f  || pLock==&p->lo
3050: 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ck );.      if( 
3060: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31  pLock->iTable!=1
3070: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3080: 74 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b  te3_free(pLock);
3090: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
30a0: 73 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72  se{.      ppIter
30b0: 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74   = &pLock->pNext
30c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
30d0: 73 73 65 72 74 28 20 70 42 74 2d 3e 69 73 50 65  ssert( pBt->isPe
30e0: 6e 64 69 6e 67 3d 3d 30 20 7c 7c 20 70 42 74 2d  nding==0 || pBt-
30f0: 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66  >pWriter );.  if
3100: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  ( pBt->pWriter==
3110: 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57  p ){.    pBt->pW
3120: 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70  riter = 0;.    p
3130: 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20  Bt->isExclusive 
3140: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73  = 0;.    pBt->is
3150: 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d  Pending = 0;.  }
3160: 65 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54  else if( pBt->nT
3170: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b  ransaction==2 ){
3180: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  .    /* This fun
3190: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
31a0: 77 68 65 6e 20 42 74 72 65 65 20 70 20 69 73 20  when Btree p is 
31b0: 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a  concluding its .
31c0: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
31d0: 6f 6e 2e 20 49 66 20 74 68 65 72 65 20 63 75 72  on. If there cur
31e0: 72 65 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20  rently exists a 
31f0: 77 72 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73  writer, and p is
3200: 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74   not.    ** that
3210: 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68   writer, then th
3220: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b  e number of lock
3230: 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63  s held by connec
3240: 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20  tions other.    
3250: 2a 2a 20 74 68 61 6e 20 74 68 65 20 77 72 69 74  ** than the writ
3260: 65 72 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74  er must be about
3270: 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f   to drop to zero
3280: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20  . In this case. 
3290: 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 69 73     ** set the is
32a0: 50 65 6e 64 69 6e 67 20 66 6c 61 67 20 74 6f 20  Pending flag to 
32b0: 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0..    **.    **
32c0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
32d0: 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69   currently a wri
32e0: 74 65 72 2c 20 74 68 65 6e 20 42 74 53 68 61 72  ter, then BtShar
32f0: 65 64 2e 69 73 50 65 6e 64 69 6e 67 20 6d 75 73  ed.isPending mus
3300: 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f  t.    ** be zero
3310: 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69   already. So thi
3320: 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68  s next line is h
3330: 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20  armless in that 
3340: 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
3350: 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20   pBt->isPending 
3360: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
3370: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3380: 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72 69 74  changes all writ
3390: 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  e-locks held by 
33a0: 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72 65 61  Btree p into rea
33b0: 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74  d-locks..*/.stat
33c0: 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72 61 64  ic void downgrad
33d0: 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  eAllSharedCacheT
33e0: 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20  ableLocks(Btree 
33f0: 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
3400: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
3410: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
3420: 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74 4c 6f  r==p ){.    BtLo
3430: 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20 70  ck *pLock;.    p
3440: 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b  Bt->pWriter = 0;
3450: 0a 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c  .    pBt->isExcl
3460: 75 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20 70  usive = 0;.    p
3470: 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20  Bt->isPending = 
3480: 30 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b  0;.    for(pLock
3490: 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f  =pBt->pLock; pLo
34a0: 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d  ck; pLock=pLock-
34b0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61  >pNext){.      a
34c0: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c  ssert( pLock->eL
34d0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
34e0: 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  | pLock->pBtree=
34f0: 3d 70 20 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63  =p );.      pLoc
3500: 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f  k->eLock = READ_
3510: 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LOCK;.    }.  }.
3520: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
3530: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
3540: 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63  CACHE */..static
3550: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
3560: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
3570: 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72  );  /* Forward r
3580: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a  eference */../*.
3590: 2a 2a 2a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  ***** This routi
35a0: 6e 65 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  ne is used insid
35b0: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 6f 6e  e of assert() on
35c0: 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65  ly ****.**.** Ve
35d0: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63 75  rify that the cu
35e0: 72 73 6f 72 20 68 6f 6c 64 73 20 74 68 65 20 6d  rsor holds the m
35f0: 75 74 65 78 20 6f 6e 20 69 74 73 20 42 74 53 68  utex on its BtSh
3600: 61 72 65 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ared.*/.#ifdef S
3610: 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74  QLITE_DEBUG.stat
3620: 69 63 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c  ic int cursorHol
3630: 64 73 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72  dsMutex(BtCursor
3640: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   *p){.  return s
3650: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
3660: 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  d(p->pBt->mutex)
3670: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
3680: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3690: 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20  _INCRBLOB./*.** 
36a0: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
36b0: 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
36c0: 74 20 63 61 63 68 65 20 66 6f 72 20 63 75 72 73  t cache for curs
36d0: 6f 72 20 70 43 75 72 2c 20 69 66 20 61 6e 79 2e  or pCur, if any.
36e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
36f0: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
3700: 6f 77 43 61 63 68 65 28 42 74 43 75 72 73 6f 72  owCache(BtCursor
3710: 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
3720: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
3730: 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73  tex(pCur) );.  s
3740: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
3750: 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->aOverflow);.  
3760: 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
3770: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 0;.}../*.** In
3780: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
3790: 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
37a0: 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75  cache for all cu
37b0: 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  rsors opened.** 
37c0: 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74  on the shared bt
37d0: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42  ree structure pB
37e0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
37f0: 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f  d invalidateAllO
3800: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53  verflowCache(BtS
3810: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42  hared *pBt){.  B
3820: 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73  tCursor *p;.  as
3830: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
3840: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
3850: 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d  tex) );.  for(p=
3860: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
3870: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
3880: 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
3890: 66 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20  flowCache(p);.  
38a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
38b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
38c0: 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79  ed before modify
38d0: 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ing the contents
38e0: 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20 74   of a table.** t
38f0: 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79  o invalidate any
3900: 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72   incrblob cursor
3910: 73 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20  s that are open 
3920: 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f 72  on the.** row or
3930: 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77 73   one of the rows
3940: 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e   being modified.
3950: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  .**.** If argume
3960: 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20  nt isClearTable 
3970: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
3980: 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
3990: 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c  s of the.** tabl
39a0: 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65  e is about to be
39b0: 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69   deleted. In thi
39c0: 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74  s case invalidat
39d0: 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a  e all incrblob.*
39e0: 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  * cursors open o
39f0: 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69 6e  n any row within
3a00: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
3a10: 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52 6f  root-page pgnoRo
3a20: 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  ot..**.** Otherw
3a30: 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e 74  ise, if argument
3a40: 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73   isClearTable is
3a50: 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68 65   false, then the
3a60: 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f 77   row with.** row
3a70: 69 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e 67  id iRow is being
3a80: 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65 6c   replaced or del
3a90: 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  eted. In this ca
3aa0: 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a 2a  se invalidate.**
3ab0: 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63 72   only those incr
3ac0: 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65  blob cursors ope
3ad0: 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63 69 66  n on that specif
3ae0: 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69  ic row..*/.stati
3af0: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
3b00: 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
3b10: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
3b20: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
3b30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
3b40: 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69   to check */.  i
3b50: 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20 20 20  64 iRow,        
3b60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f         /* The ro
3b70: 77 69 64 20 74 68 61 74 20 6d 69 67 68 74 20 62  wid that might b
3b80: 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20  e changing */.  
3b90: 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  int isClearTable
3ba0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3bb0: 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20  if all rows are 
3bc0: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f  being deleted */
3bd0: 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  .){.  BtCursor *
3be0: 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  p;.  BtShared *p
3bf0: 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74  Bt = pBtree->pBt
3c00: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
3c10: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
3c20: 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20  ex(pBtree) );.  
3c30: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
3c40: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
3c50: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  t){.    if( p->i
3c60: 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
3c70: 26 26 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65  && (isClearTable
3c80: 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   || p->info.nKey
3c90: 3d 3d 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20  ==iRow) ){.     
3ca0: 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
3cb0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
3cc0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a   }.  }.}..#else.
3cd0: 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69    /* Stub functi
3ce0: 6f 6e 73 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ons when INCRBLO
3cf0: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
3d00: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
3d10: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
3d20: 65 28 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69  e(x).  #define i
3d30: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
3d40: 66 6c 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23  flowCache(x).  #
3d50: 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74  define invalidat
3d60: 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
3d70: 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f  (x,y,z).#endif /
3d80: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
3d90: 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  CRBLOB */../*.**
3da0: 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66   Set bit pgno of
3db0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
3dc0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
3dd0: 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  . This is called
3de0: 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65   .** when a page
3df0: 20 74 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79   that previously
3e00: 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20   contained data 
3e10: 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c  becomes a free-l
3e20: 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67  ist leaf .** pag
3e30: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53  e..**.** The BtS
3e40: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
3e50: 74 20 62 69 74 76 65 63 20 65 78 69 73 74 73 20  t bitvec exists 
3e60: 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61  to work around a
3e70: 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67  n obscure.** bug
3e80: 20 63 61 75 73 65 64 20 62 79 20 74 68 65 20 69   caused by the i
3e90: 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77  nteraction of tw
3ea0: 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69  o useful IO opti
3eb0: 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75  mizations surrou
3ec0: 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69  nding.** free-li
3ed0: 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a  st leaf pages:.*
3ee0: 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61  *.**   1) When a
3ef0: 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c 65 74  ll data is delet
3f00: 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61  ed from a page a
3f10: 6e 64 20 74 68 65 20 70 61 67 65 20 62 65 63 6f  nd the page beco
3f20: 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72  mes.**      a fr
3f30: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
3f40: 65 2c 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  e, the page is n
3f50: 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ot written to th
3f60: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
3f70: 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74     (as free-list
3f80: 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74   leaf pages cont
3f90: 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75  ain no meaningfu
3fa0: 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d  l data). Sometim
3fb0: 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20  es.**      such 
3fc0: 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76  a page is not ev
3fd0: 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61  en journalled (a
3fe0: 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s it will not be
3ff0: 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20   modified,.**   
4000: 20 20 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f     why bother jo
4010: 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a  urnalling it?)..
4020: 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20  **.**   2) When 
4030: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
4040: 20 70 61 67 65 20 69 73 20 72 65 75 73 65 64 2c   page is reused,
4050: 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20   its content is 
4060: 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20  not read.**     
4070: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
4080: 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f  se or written to
4090: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
40a0: 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74  e (why should it
40b0: 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20  .**      be, if 
40c0: 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  it is not at all
40d0: 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a   meaningful?)..*
40e0: 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76  *.** By themselv
40f0: 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69  es, these optimi
4100: 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e  zations work fin
4110: 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20  e and provide a 
4120: 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d  handy.** perform
4130: 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75  ance boost to bu
4140: 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73  lk delete or ins
4150: 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  ert operations. 
4160: 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61  However, if.** a
4170: 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74   page is moved t
4180: 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  o the free-list 
4190: 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65 64 20  and then reused 
41a0: 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a  within the same.
41b0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  ** transaction, 
41c0: 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20  a problem comes 
41d0: 75 70 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  up. If the page 
41e0: 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65  is not journalle
41f0: 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20  d when.** it is 
4200: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
4210: 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73  e-list and it is
4220: 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61   also not journa
4230: 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20  lled when it.** 
4240: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
4250: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  m the free-list 
4260: 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e  and reused, then
4270: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
4280: 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73  ta.** may be los
4290: 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20  t. In the event 
42a0: 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  of a rollback, i
42b0: 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73  t may not be pos
42c0: 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74  sible.** to rest
42d0: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
42e0: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
42f0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a   configuration..
4300: 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69  **.** The soluti
4310: 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68 61 72  on is the BtShar
4320: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4330: 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20  itvec. Whenever 
4340: 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f  a page is .** mo
4350: 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20  ved to become a 
4360: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4370: 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70  age, the corresp
4380: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a  onding bit is.**
4390: 20 73 65 74 20 69 6e 20 74 68 65 20 62 69 74 76   set in the bitv
43a0: 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c  ec. Whenever a l
43b0: 65 61 66 20 70 61 67 65 20 69 73 20 65 78 74 72  eaf page is extr
43c0: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  acted from the f
43d0: 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74  ree-list,.** opt
43e0: 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76  imization 2 abov
43f0: 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20  e is omitted if 
4400: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
4410: 67 20 62 69 74 20 69 73 20 61 6c 72 65 61 64 79  g bit is already
4420: 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61  .** set in BtSha
4430: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e  red.pHasContent.
4440: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
4450: 20 74 68 65 20 62 69 74 76 65 63 20 61 72 65 20   the bitvec are 
4460: 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68  cleared.** at th
4470: 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74  e end of every t
4480: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
4490: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 53  tatic int btreeS
44a0: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
44b0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
44c0: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63   pgno){.  int rc
44d0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
44e0: 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f  if( !pBt->pHasCo
44f0: 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73  ntent ){.    ass
4500: 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e  ert( pgno<=pBt->
4510: 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74  nPage );.    pBt
4520: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20  ->pHasContent = 
4530: 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
4540: 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b  ate(pBt->nPage);
4550: 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70  .    if( !pBt->p
4560: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
4570: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4580: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
4590: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
45a0: 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71  E_OK && pgno<=sq
45b0: 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28  lite3BitvecSize(
45c0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
45d0: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
45e0: 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
45f0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c  Bt->pHasContent,
4600: 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65   pgno);.  }.  re
4610: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
4620: 2a 20 51 75 65 72 79 20 74 68 65 20 42 74 53 68  * Query the BtSh
4630: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4640: 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   vector..**.** T
4650: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
4660: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72  called when a fr
4670: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4680: 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f  e is removed fro
4690: 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69  m the.** free-li
46a0: 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74  st for reuse. It
46b0: 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69   returns false i
46c0: 66 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  f it is safe to 
46d0: 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20  retrieve the.** 
46e0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
46f0: 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74  ger layer with t
4700: 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20  he 'no-content' 
4710: 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f  flag set. True o
4720: 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
4730: 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
4740: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
4750: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
4760: 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a  gno){.  Bitvec *
4770: 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  p = pBt->pHasCon
4780: 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28  tent;.  return (
4790: 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74  p && (pgno>sqlit
47a0: 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 29 20  e3BitvecSize(p) 
47b0: 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
47c0: 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b  Test(p, pgno)));
47d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
47e0: 28 64 65 73 74 72 6f 79 29 20 74 68 65 20 42 74  (destroy) the Bt
47f0: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4800: 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73 20  nt bitvec. This 
4810: 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76  should be.** inv
4820: 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63  oked at the conc
4830: 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77  lusion of each w
4840: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
4850: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4860: 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
4870: 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a  ntent(BtShared *
4880: 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42  pBt){.  sqlite3B
4890: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 42 74  itvecDestroy(pBt
48a0: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a  ->pHasContent);.
48b0: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
48c0: 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nt = 0;.}../*.**
48d0: 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
48e0: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
48f0: 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c  n in the variabl
4900: 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79  es BtCursor.nKey
4910: 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f   .** and BtCurso
4920: 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73  r.pKey. The curs
4930: 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65  or's state is se
4940: 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55  t to CURSOR_REQU
4950: 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54  IRESEEK..**.** T
4960: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
4970: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63  nsure that the c
4980: 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28  ursor is valid (
4990: 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53  has eState==CURS
49a0: 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69  OR_VALID).** pri
49b0: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
49c0: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f  is routine.  .*/
49d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
49e0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
49f0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
4a00: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
4a10: 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
4a20: 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
4a30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  );.  assert( 0==
4a40: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20  pCur->pKey );.  
4a50: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
4a60: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
4a70: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
4a80: 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
4a90: 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29  ur, &pCur->nKey)
4aa0: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
4ab0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a  SQLITE_OK );  /*
4ac0: 20 4b 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f   KeySize() canno
4ad0: 74 20 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20  t fail */..  /* 
4ae0: 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  If this is an in
4af0: 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e  tKey table, then
4b00: 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20   the above call 
4b10: 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28  to BtreeKeySize(
4b20: 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68  ).  ** stores th
4b30: 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e  e integer key in
4b40: 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20   pCur->nKey. In 
4b50: 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20 76  this case this v
4b60: 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c  alue is.  ** all
4b70: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
4b80: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
4b90: 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65   pCur is not ope
4ba0: 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20  n on an intKey. 
4bb0: 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20   ** table, then 
4bc0: 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72  malloc space for
4bd0: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70   and store the p
4be0: 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20  Cur->nKey bytes 
4bf0: 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74  of key .  ** dat
4c00: 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d  a..  */.  if( 0=
4c10: 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  =pCur->apPage[0]
4c20: 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
4c30: 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c  void *pKey = sql
4c40: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 28 69 6e 74  ite3Malloc( (int
4c50: 29 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20  )pCur->nKey );. 
4c60: 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20     if( pKey ){. 
4c70: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
4c80: 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20  3BtreeKey(pCur, 
4c90: 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b  0, (int)pCur->nK
4ca0: 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20  ey, pKey);.     
4cb0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4cc0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OK ){.        pC
4cd0: 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b  ur->pKey = pKey;
4ce0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4cf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
4d00: 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  ee(pKey);.      
4d10: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
4d20: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
4d30: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
4d40: 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d    assert( !pCur-
4d50: 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
4d60: 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65  ey || !pCur->pKe
4d70: 79 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  y );..  if( rc==
4d80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4d90: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
4da0: 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
4db0: 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
4dc0: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
4dd0: 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  r->apPage[i]);. 
4de0: 20 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67       pCur->apPag
4df0: 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  e[i] = 0;.    }.
4e00: 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20      pCur->iPage 
4e10: 3d 20 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e  = -1;.    pCur->
4e20: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
4e30: 52 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d  REQUIRESEEK;.  }
4e40: 0a 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76  ..  invalidateOv
4e50: 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72  erflowCache(pCur
4e60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
4e70: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  }../*.** Save th
4e80: 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61  e positions of a
4e90: 6c 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63 65  ll cursors (exce
4ea0: 70 74 20 70 45 78 63 65 70 74 29 20 74 68 61 74  pt pExcept) that
4eb0: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20   are open on.** 
4ec0: 74 68 65 20 74 61 62 6c 65 20 20 77 69 74 68 20  the table  with 
4ed0: 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e  root-page iRoot.
4ee0: 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69   Usually, this i
4ef0: 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65  s called just be
4f00: 66 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70  fore cursor.** p
4f10: 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74  Except is used t
4f20: 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62  o modify the tab
4f30: 6c 65 20 28 42 74 72 65 65 44 65 6c 65 74 65 28  le (BtreeDelete(
4f40: 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74  ) or BtreeInsert
4f50: 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ())..*/.static i
4f60: 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72  nt saveAllCursor
4f70: 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  s(BtShared *pBt,
4f80: 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43   Pgno iRoot, BtC
4f90: 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b  ursor *pExcept){
4fa0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
4fb0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
4fc0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
4fd0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
4fe0: 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30  sert( pExcept==0
4ff0: 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74   || pExcept->pBt
5000: 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70  ==pBt );.  for(p
5010: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
5020: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
5030: 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70     if( p!=pExcep
5040: 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c  t && (0==iRoot |
5050: 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69  | p->pgnoRoot==i
5060: 52 6f 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20  Root) && .      
5070: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52    p->eState==CUR
5080: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
5090: 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65     int rc = save
50a0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
50b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  );.      if( SQL
50c0: 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
50d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
50e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
50f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
5100: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
5110: 43 6c 65 61 72 20 74 68 65 20 63 75 72 72 65 6e  Clear the curren
5120: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
5130: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
5140: 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
5150: 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
5160: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
5170: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
5180: 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  Cur) );.  sqlite
5190: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
51a0: 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79  y);.  pCur->pKey
51b0: 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53   = 0;.  pCur->eS
51c0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
51d0: 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  VALID;.}../*.** 
51e0: 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20  In this version 
51f0: 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20  of BtreeMoveto, 
5200: 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b 65 64  pKey is a packed
5210: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a   index record.**
5220: 20 73 75 63 68 20 61 73 20 69 73 20 67 65 6e 65   such as is gene
5230: 72 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  rated by the OP_
5240: 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
5250: 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a  e.  Unpack the.*
5260: 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65  * record and the
5270: 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65  n call BtreeMove
5280: 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20  toUnpacked() to 
5290: 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a  do the work..*/.
52a0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
52b0: 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73  Moveto(.  BtCurs
52c0: 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a  or *pCur,     /*
52d0: 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20   Cursor open on 
52e0: 74 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20  the btree to be 
52f0: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f  searched */.  co
5300: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
5310: 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20    /* Packed key 
5320: 69 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  if the btree is 
5330: 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36  an index */.  i6
5340: 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  4 nKey,         
5350: 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79    /* Integer key
5360: 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69   for tables.  Si
5370: 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69  ze of pKey for i
5380: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
5390: 62 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20  bias,           
53a0: 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68 20 74  /* Bias search t
53b0: 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
53c0: 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
53d0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
53e0: 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
53f0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
5400: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
5410: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75          /* Statu
5420: 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61  s code */.  Unpa
5430: 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
5440: 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b  Key;   /* Unpack
5450: 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
5460: 20 20 63 68 61 72 20 61 53 70 61 63 65 5b 31 35    char aSpace[15
5470: 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0];          /* 
5480: 54 65 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70  Temp space for p
5490: 49 64 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69  IdxKey - to avoi
54a0: 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20  d a malloc */.. 
54b0: 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
54c0: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28   assert( nKey==(
54d0: 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b  i64)(int)nKey );
54e0: 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73  .    pIdxKey = s
54f0: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
5500: 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65  Unpack(pCur->pKe
5510: 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79  yInfo, (int)nKey
5520: 2c 20 70 4b 65 79 2c 0a 20 20 20 20 20 20 20 20  , pKey,.        
5530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
5550: 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70  pace, sizeof(aSp
5560: 61 63 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ace));.    if( p
5570: 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75  IdxKey==0 ) retu
5580: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
5590: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
55a0: 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dxKey = 0;.  }. 
55b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
55c0: 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
55d0: 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20  (pCur, pIdxKey, 
55e0: 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73  nKey, bias, pRes
55f0: 29 3b 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b  );.  if( pKey ){
5600: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5610: 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65  DeleteUnpackedRe
5620: 63 6f 72 64 28 70 49 64 78 4b 65 79 29 3b 0a 20  cord(pIdxKey);. 
5630: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
5640: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65  }../*.** Restore
5650: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
5660: 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77  he position it w
5670: 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f  as in (or as clo
5680: 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c  se to as possibl
5690: 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43  e).** when saveC
56a0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
56b0: 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65  was called. Note
56c0: 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20   that this call 
56d0: 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20  deletes the .** 
56e0: 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69  saved position i
56f0: 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61  nfo stored by sa
5700: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
5710: 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e  (), so there can
5720: 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f   be.** at most o
5730: 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73  ne effective res
5740: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5750: 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20  on() call after 
5760: 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72  each .** saveCur
5770: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a  sorPosition()..*
5780: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
5790: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
57a0: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
57b0: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
57c0: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  c;.  assert( cur
57d0: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
57e0: 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
57f0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
5800: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5810: 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
5820: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
5830: 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
5840: 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  urn pCur->skipNe
5850: 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  xt;.  }.  pCur->
5860: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
5870: 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20  INVALID;.  rc = 
5880: 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72  btreeMoveto(pCur
5890: 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43  , pCur->pKey, pC
58a0: 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43  ur->nKey, 0, &pC
58b0: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 29 3b 0a 20  ur->skipNext);. 
58c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
58d0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
58e0: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
58f0: 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b  y);.    pCur->pK
5900: 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  ey = 0;.    asse
5910: 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
5920: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
5930: 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
5940: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
5950: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5960: 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65  c;.}..#define re
5970: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
5980: 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65  ion(p) \.  (p->e
5990: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
59a0: 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20  QUIRESEEK ? \.  
59b0: 20 20 20 20 20 20 20 62 74 72 65 65 52 65 73 74         btreeRest
59c0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
59d0: 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20  n(p) : \.       
59e0: 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a    SQLITE_OK)../*
59f0: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68  .** Determine wh
5a00: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63  ether or not a c
5a10: 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20  ursor has moved 
5a20: 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f  from the positio
5a30: 6e 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74  n it.** was last
5a40: 20 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72   placed at.  Cur
5a50: 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68  sors can move wh
5a60: 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20  en the row they 
5a70: 61 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20  are pointing.** 
5a80: 61 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75  at is deleted ou
5a90: 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
5aa0: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  m..**.** This ro
5ab0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e  utine returns an
5ac0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73   error code if s
5ad0: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
5ae0: 6f 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74  ong.  The.** int
5af0: 65 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20  eger *pHasMoved 
5b00: 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 69 66  is set to one if
5b10: 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20   the cursor has 
5b20: 6d 6f 76 65 64 20 61 6e 64 20 30 20 69 66 20 6e  moved and 0 if n
5b30: 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ot..*/.int sqlit
5b40: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
5b50: 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a  Moved(BtCursor *
5b60: 70 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d  pCur, int *pHasM
5b70: 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b  oved){.  int rc;
5b80: 0a 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ..  rc = restore
5b90: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
5ba0: 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
5bb0: 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64  {.    *pHasMoved
5bc0: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
5bd0: 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
5be0: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
5bf0: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
5c00: 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 30 20 29  r->skipNext!=0 )
5c10: 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64  {.    *pHasMoved
5c20: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
5c30: 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20     *pHasMoved = 
5c40: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
5c50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
5c60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5c70: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
5c80: 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20  ** Given a page 
5c90: 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75  number of a regu
5ca0: 6c 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67  lar database pag
5cb0: 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61  e, return the pa
5cc0: 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72  ge.** number for
5cd0: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
5ce0: 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
5cf0: 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f  ins the entry fo
5d00: 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70  r the.** input p
5d10: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73  age number..*/.s
5d20: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
5d30: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
5d40: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
5d50: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
5d60: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
5d70: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
5d80: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5d90: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
5da0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 50  ->mutex) );.  nP
5db0: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d  agesPerMapPage =
5dc0: 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
5dd0: 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61  e/5)+1;.  iPtrMa
5de0: 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61  p = (pgno-2)/nPa
5df0: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
5e00: 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a   ret = (iPtrMap*
5e10: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
5e20: 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65  ) + 2; .  if( re
5e30: 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t==PENDING_BYTE_
5e40: 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
5e50: 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65   ret++;.  }.  re
5e60: 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a  turn ret;.}../*.
5e70: 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72  ** Write an entr
5e80: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
5e90: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
5ea0: 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74  is routine updat
5eb0: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
5ec0: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
5ed0: 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a  e number 'key'.*
5ee0: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70  * so that it map
5ef0: 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65  s to type 'eType
5f00: 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  ' and parent pag
5f10: 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e  e number 'pgno'.
5f20: 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69  .**.** If *pRC i
5f30: 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d  s initially non-
5f40: 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45  zero (non-SQLITE
5f50: 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72  _OK) then this r
5f60: 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e  outine is.** a n
5f70: 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72  o-op.  If an err
5f80: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61  or occurs, the a
5f90: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
5fa0: 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e   code is written
5fb0: 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a  .** into *pRC..*
5fc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74  /.static void pt
5fd0: 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64  rmapPut(BtShared
5fe0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c   *pBt, Pgno key,
5ff0: 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20   u8 eType, Pgno 
6000: 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43  parent, int *pRC
6010: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
6020: 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f  Page;  /* The po
6030: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
6040: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
6050: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69        /* The poi
6060: 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f  nter map data */
6070: 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b  .  Pgno iPtrmap;
6080: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
6090: 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d  ter map page num
60a0: 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ber */.  int off
60b0: 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66  set;       /* Of
60c0: 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20  fset in pointer 
60d0: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
60e0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
60f0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
6100: 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
6110: 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20   */..  if( *pRC 
6120: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
6130: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
6140: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
6150: 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
6160: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
6170: 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  age number must 
6180: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73  never be used as
6190: 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70   a pointer map p
61a0: 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  age */.  assert(
61b0: 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47   0==PTRMAP_ISPAG
61c0: 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42  E(pBt, PENDING_B
61d0: 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29  YTE_PAGE(pBt)) )
61e0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  ;..  assert( pBt
61f0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
6200: 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a    if( key==0 ){.
6210: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
6220: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6230: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
6240: 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d    iPtrmap = PTRM
6250: 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b  AP_PAGENO(pBt, k
6260: 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ey);.  rc = sqli
6270: 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
6280: 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70  >pPager, iPtrmap
6290: 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69  , &pDbPage);.  i
62a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
62b0: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
62c0: 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
62d0: 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54   }.  offset = PT
62e0: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
62f0: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
6300: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
6310: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
6320: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6330: 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f      goto ptrmap_
6340: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 50 74 72  exit;.  }.  pPtr
6350: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
6360: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
6370: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28  pDbPage);..  if(
6380: 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b   eType!=pPtrmap[
6390: 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62  offset] || get4b
63a0: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
63b0: 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20  set+1])!=parent 
63c0: 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50  ){.    TRACE(("P
63d0: 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64  TRMAP_UPDATE: %d
63e0: 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65  ->(%d,%d)\n", ke
63f0: 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74  y, eType, parent
6400: 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63  ));.    *pRC= rc
6410: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
6420: 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
6430: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6440: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
6450: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20  trmap[offset] = 
6460: 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74  eType;.      put
6470: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
6480: 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74  ffset+1], parent
6490: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74  );.    }.  }..pt
64a0: 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c  rmap_exit:.  sql
64b0: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
64c0: 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  DbPage);.}../*.*
64d0: 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20  * Read an entry 
64e0: 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72  from the pointer
64f0: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
6500: 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76   routine retriev
6510: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
6520: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
6530: 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67  e 'key', writing
6540: 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64  .** the type and
6550: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
6560: 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61  ber to *pEType a
6570: 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63  nd *pPgno respec
6580: 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72  tively..** An er
6590: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
65a0: 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e  rned if somethin
65b0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74  g goes wrong, ot
65c0: 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f  herwise SQLITE_O
65d0: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
65e0: 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61   ptrmapGet(BtSha
65f0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b  red *pBt, Pgno k
6600: 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20  ey, u8 *pEType, 
6610: 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20  Pgno *pPgno){.  
6620: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
6630: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
6640: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
6650: 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20  int iPtrmap;    
6660: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
6670: 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a  p page index */.
6680: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
6690: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
66a0: 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f  map page data */
66b0: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
66c0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
66d0: 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e  of entry in poin
66e0: 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74  ter map */.  int
66f0: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
6700: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
6710: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
6720: 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50  ;..  iPtrmap = P
6730: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
6740: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
6750: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
6760: 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72  Bt->pPager, iPtr
6770: 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  map, &pDbPage);.
6780: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
6790: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
67a0: 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75  }.  pPtrmap = (u
67b0: 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  8 *)sqlite3Pager
67c0: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
67d0: 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54  ;..  offset = PT
67e0: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
67f0: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
6800: 61 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d  assert( pEType!=
6810: 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d  0 );.  *pEType =
6820: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
6830: 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20  ;.  if( pPgno ) 
6840: 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  *pPgno = get4byt
6850: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
6860: 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65  t+1]);..  sqlite
6870: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
6880: 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54  age);.  if( *pET
6890: 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65  ype<1 || *pEType
68a0: 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >5 ) return SQLI
68b0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
68c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
68d0: 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a  _OK;.}..#else /*
68e0: 20 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49   if defined SQLI
68f0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
6900: 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  UM */.  #define 
6910: 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c  ptrmapPut(w,x,y,
6920: 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20  z,rc).  #define 
6930: 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c  ptrmapGet(w,x,y,
6940: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  z) SQLITE_OK.  #
6950: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74  define ptrmapPut
6960: 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63  OvflPtr(x, y, rc
6970: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
6980: 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61  Given a btree pa
6990: 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e  ge and a cell in
69a0: 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65  dex (0 means the
69b0: 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a   first cell on.*
69c0: 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65  * the page, 1 me
69d0: 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63  ans the second c
69e0: 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  ell, and so fort
69f0: 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  h) return a poin
6a00: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65  ter.** to the ce
6a10: 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  ll content..**.*
6a20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
6a30: 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61  orks only for pa
6a40: 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  ges that do not 
6a50: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
6a60: 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69   cells..*/.#defi
6a70: 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29  ne findCell(P,I)
6a80: 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61   \.  ((P)->aData
6a90: 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67   + ((P)->maskPag
6aa0: 65 20 26 20 67 65 74 32 62 79 74 65 28 26 28 50  e & get2byte(&(P
6ab0: 29 2d 3e 61 44 61 74 61 5b 28 50 29 2d 3e 63 65  )->aData[(P)->ce
6ac0: 6c 6c 4f 66 66 73 65 74 2b 32 2a 28 49 29 5d 29  llOffset+2*(I)])
6ad0: 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61  ))../*.** This a
6ae0: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65   more complex ve
6af0: 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c  rsion of findCel
6b00: 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66  l() that works f
6b10: 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74  or.** pages that
6b20: 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72   do contain over
6b30: 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  flow cells..*/.s
6b40: 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f 76  tatic u8 *findOv
6b50: 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61  erflowCell(MemPa
6b60: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
6b70: 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Cell){.  int i;.
6b80: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6b90: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
6ba0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
6bb0: 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67 65  );.  for(i=pPage
6bc0: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69  ->nOverflow-1; i
6bd0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
6be0: 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72 75 63 74  nt k;.    struct
6bf0: 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f 76 66   _OvflCell *pOvf
6c00: 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d 20 26  l;.    pOvfl = &
6c10: 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d 3b  pPage->aOvfl[i];
6c20: 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c 2d 3e  .    k = pOvfl->
6c30: 69 64 78 3b 0a 20 20 20 20 69 66 28 20 6b 3c 3d  idx;.    if( k<=
6c40: 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  iCell ){.      i
6c50: 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20  f( k==iCell ){. 
6c60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4f         return pO
6c70: 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20 20  vfl->pCell;.    
6c80: 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d    }.      iCell-
6c90: 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  -;.    }.  }.  r
6ca0: 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70  eturn findCell(p
6cb0: 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a  Page, iCell);.}.
6cc0: 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63  ./*.** Parse a c
6cd0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63  ell content bloc
6ce0: 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68  k and fill in th
6cf0: 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63  e CellInfo struc
6d00: 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ture.  There.** 
6d10: 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73  are two versions
6d20: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
6d30: 6e 2e 20 20 62 74 72 65 65 50 61 72 73 65 43 65  n.  btreeParseCe
6d40: 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a  ll() takes a .**
6d50: 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74   cell index as t
6d60: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
6d70: 6e 74 20 61 6e 64 20 62 74 72 65 65 50 61 72 73  nt and btreePars
6d80: 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74  eCellPtr() .** t
6d90: 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74  akes a pointer t
6da0: 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68  o the body of th
6db0: 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65  e cell as its se
6dc0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
6dd0: 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73  *.** Within this
6de0: 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72 73 65   file, the parse
6df0: 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e  Cell() macro can
6e00: 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65   be called inste
6e10: 61 64 20 6f 66 0a 2a 2a 20 62 74 72 65 65 50 61  ad of.** btreePa
6e20: 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73  rseCellPtr(). Us
6e30: 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65  ing some compile
6e40: 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65  rs, this will be
6e50: 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74   faster..*/.stat
6e60: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
6e70: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
6e80: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
6e90: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
6ea0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
6eb0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
6ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6ed0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
6ee0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
6ef0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
6f00: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
6f10: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
6f20: 65 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b  e */.){.  u16 n;
6f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65    /* Number byte
6f50: 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  s in cell conten
6f60: 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  t header */.  u3
6f70: 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20  2 nPayload;     
6f80: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6f90: 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c  of bytes of cell
6fa0: 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61   payload */..  a
6fb0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
6fc0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
6fd0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
6fe0: 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20  .  pInfo->pCell 
6ff0: 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  = pCell;.  asser
7000: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
7010: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66  0 || pPage->leaf
7020: 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61  ==1 );.  n = pPa
7030: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
7040: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34  ;.  assert( n==4
7050: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  -4*pPage->leaf )
7060: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
7070: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28  ntKey ){.    if(
7080: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
7090: 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67 65  ){.      n += ge
70a0: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
70b0: 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  [n], nPayload);.
70c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
70d0: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20   nPayload = 0;. 
70e0: 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65     }.    n += ge
70f0: 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
7100: 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  ], (u64*)&pInfo-
7110: 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66  >nKey);.    pInf
7120: 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c  o->nData = nPayl
7130: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
7140: 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d    pInfo->nData =
7150: 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74   0;.    n += get
7160: 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
7170: 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  n], nPayload);. 
7180: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d     pInfo->nKey =
7190: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20   nPayload;.  }. 
71a0: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
71b0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
71c0: 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20  Info->nHeader = 
71d0: 6e 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  n;.  testcase( n
71e0: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
71f0: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
7200: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
7210: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
7220: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6c 69 6b  l+1 );.  if( lik
7230: 65 6c 79 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50  ely(nPayload<=pP
7240: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29  age->maxLocal) )
7250: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
7260: 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d   the (easy) comm
7270: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
7280: 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64  e entire payload
7290: 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20   fits.    ** on 
72a0: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20  the local page. 
72b0: 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20   No overflow is 
72c0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
72d0: 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20  .    int nSize; 
72e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
72f0: 6c 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20 63  l size of cell c
7300: 6f 6e 74 65 6e 74 20 69 6e 20 62 79 74 65 73 20  ontent in bytes 
7310: 2a 2f 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6e  */.    nSize = n
7320: 50 61 79 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20 20  Payload + n;.   
7330: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
7340: 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a   (u16)nPayload;.
7350: 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72      pInfo->iOver
7360: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 69 66  flow = 0;.    if
7370: 28 20 28 6e 53 69 7a 65 20 26 20 7e 33 29 3d 3d  ( (nSize & ~3)==
7380: 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  0 ){.      nSize
7390: 20 3d 20 34 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 4;        /* 
73a0: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
73b0: 65 20 69 73 20 34 20 2a 2f 0a 20 20 20 20 7d 0a  e is 4 */.    }.
73c0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65      pInfo->nSize
73d0: 20 3d 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 20   = (u16)nSize;. 
73e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
73f0: 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69  f the payload wi
7400: 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c  ll not fit compl
7410: 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63  etely on the loc
7420: 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65  al page, we have
7430: 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64  .    ** to decid
7440: 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74  e how much to st
7450: 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20  ore locally and 
7460: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c  how much to spil
7470: 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76  l onto.    ** ov
7480: 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54  erflow pages.  T
7490: 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74  he strategy is t
74a0: 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61  o minimize the a
74b0: 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a  mount of unused.
74c0: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20      ** space on 
74d0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77  overflow pages w
74e0: 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65  hile keeping the
74f0: 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c   amount of local
7500: 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20   storage.    ** 
7510: 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f  in between minLo
7520: 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c  cal and maxLocal
7530: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
7540: 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69  Warning:  changi
7550: 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66  ng the way overf
7560: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64  low payload is d
7570: 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e  istributed in an
7580: 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c  y.    ** way wil
7590: 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  l result in an i
75a0: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65  ncompatible file
75b0: 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a   format..    */.
75c0: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
75d0: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d  ;  /* Minimum am
75e0: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
75f0: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
7600: 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c      int maxLocal
7610: 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d  ;  /* Maximum am
7620: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
7630: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
7640: 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b      int surplus;
7650: 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
7660: 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65  ayload available
7670: 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61   for local stora
7680: 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f  ge */..    minLo
7690: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e  cal = pPage->min
76a0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f  Local;.    maxLo
76b0: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78  cal = pPage->max
76c0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c  Local;.    surpl
76d0: 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  us = minLocal + 
76e0: 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c  (nPayload - minL
76f0: 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42  ocal)%(pPage->pB
7700: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
7710: 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  4);.    testcase
7720: 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f  ( surplus==maxLo
7730: 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  cal );.    testc
7740: 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61  ase( surplus==ma
7750: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
7760: 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d  if( surplus <= m
7770: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  axLocal ){.     
7780: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
7790: 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20   (u16)surplus;. 
77a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
77b0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
77c0: 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  (u16)minLocal;. 
77d0: 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e     }.    pInfo->
77e0: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36  iOverflow = (u16
77f0: 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20  )(pInfo->nLocal 
7800: 2b 20 6e 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  + n);.    pInfo-
7810: 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e  >nSize = pInfo->
7820: 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20  iOverflow + 4;. 
7830: 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72   }.}.#define par
7840: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  seCell(pPage, iC
7850: 65 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20  ell, pInfo) \.  
7860: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
7870: 72 28 28 70 50 61 67 65 29 2c 20 66 69 6e 64 43  r((pPage), findC
7880: 65 6c 6c 28 28 70 50 61 67 65 29 2c 20 28 69 43  ell((pPage), (iC
7890: 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a  ell)), (pInfo)).
78a0: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
78b0: 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65  eParseCell(.  Me
78c0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
78d0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
78e0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
78f0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  l */.  int iCell
7900: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7910: 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  * The cell index
7920: 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73  .  First cell is
7930: 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f   0 */.  CellInfo
7940: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
7950: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
7960: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
7970: 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67    parseCell(pPag
7980: 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29  e, iCell, pInfo)
7990: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
79a0: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  te the total num
79b0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 68 61  ber of bytes tha
79c0: 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69  t a Cell needs i
79d0: 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  n the cell.** da
79e0: 74 61 20 61 72 65 61 20 6f 66 20 74 68 65 20 62  ta area of the b
79f0: 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20  tree-page.  The 
7a00: 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e  return number in
7a10: 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a  cludes the cell.
7a20: 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72 20 61  ** data header a
7a30: 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79  nd the local pay
7a40: 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e  load, but not an
7a50: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  y overflow page 
7a60: 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20  or.** the space 
7a70: 75 73 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c  used by the cell
7a80: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61   pointer..*/.sta
7a90: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
7aa0: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
7ab0: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
7ac0: 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20 26 70    u8 *pIter = &p
7ad0: 43 65 6c 6c 5b 70 50 61 67 65 2d 3e 63 68 69 6c  Cell[pPage->chil
7ae0: 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 75 33 32  dPtrSize];.  u32
7af0: 20 6e 53 69 7a 65 3b 0a 0a 23 69 66 64 65 66 20   nSize;..#ifdef 
7b00: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
7b10: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
7b20: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
7b30: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  ction should alw
7b40: 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20  ays be the same 
7b50: 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c  as.  ** the (Cel
7b60: 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c  lInfo.nSize) val
7b70: 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e  ue found by doin
7b80: 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f  g a full parse o
7b90: 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  f the.  ** cell.
7ba0: 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   If SQLITE_DEBUG
7bb0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20   is defined, an 
7bc0: 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20  assert() at the 
7bd0: 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74  bottom of.  ** t
7be0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72  his function ver
7bf0: 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20  ifies that this 
7c00: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74  invariant is not
7c10: 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20   violated. */.  
7c20: 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e  CellInfo debugin
7c30: 66 6f 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65  fo;.  btreeParse
7c40: 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
7c50: 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f  Cell, &debuginfo
7c60: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  );.#endif..  if(
7c70: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
7c80: 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 3b 0a  {.    u8 *pEnd;.
7c90: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
7ca0: 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  asData ){.      
7cb0: 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69  pIter += getVari
7cc0: 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a  nt32(pIter, nSiz
7cd0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
7ce0: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 30 3b 0a       nSize = 0;.
7cf0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 70 49      }..    /* pI
7d00: 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61  ter now points a
7d10: 74 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74  t the 64-bit int
7d20: 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20  eger key value, 
7d30: 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
7d40: 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  h .    ** intege
7d50: 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  r. The following
7d60: 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74   block moves pIt
7d70: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
7d80: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20  he first byte.  
7d90: 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
7da0: 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c  d of the key val
7db0: 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20  ue. */.    pEnd 
7dc0: 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20  = &pIter[9];.   
7dd0: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
7de0: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
7df0: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 65 6c 73 65  <pEnd );.  }else
7e00: 7b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67  {.    pIter += g
7e10: 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72  etVarint32(pIter
7e20: 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  , nSize);.  }.. 
7e30: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
7e40: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
7e50: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
7e60: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
7e70: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
7e80: 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e  f( nSize>pPage->
7e90: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
7ea0: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  int minLocal = p
7eb0: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
7ec0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c      nSize = minL
7ed0: 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20  ocal + (nSize - 
7ee0: 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61  minLocal) % (pPa
7ef0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
7f00: 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65  ize - 4);.    te
7f10: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
7f20: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
7f30: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
7f40: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
7f50: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
7f60: 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d  if( nSize>pPage-
7f70: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
7f80: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
7f90: 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  cal;.    }.    n
7fa0: 53 69 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20  Size += 4;.  }. 
7fb0: 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28   nSize += (u32)(
7fc0: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
7fd0: 0a 20 20 2f 2a 20 54 68 65 20 6d 69 6e 69 6d 75  .  /* The minimu
7fe0: 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 63 65  m size of any ce
7ff0: 6c 6c 20 69 73 20 34 20 62 79 74 65 73 2e 20 2a  ll is 4 bytes. *
8000: 2f 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20  /.  if( nSize<4 
8010: 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 34  ){.    nSize = 4
8020: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
8030: 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66   nSize==debuginf
8040: 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 72 65 74  o.nSize );.  ret
8050: 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a  urn (u16)nSize;.
8060: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
8070: 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76  _DEBUG./* This v
8080: 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c  ariation on cell
8090: 53 69 7a 65 50 74 72 28 29 20 69 73 20 75 73 65  SizePtr() is use
80a0: 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  d inside of asse
80b0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a  rt() statements.
80c0: 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74  ** only. */.stat
80d0: 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28  ic u16 cellSize(
80e0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
80f0: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65  int iCell){.  re
8100: 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  turn cellSizePtr
8110: 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c  (pPage, findCell
8120: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b  (pPage, iCell));
8130: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
8140: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
8150: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
8160: 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c  If the cell pCel
8170: 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20  l, part of page 
8180: 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61  pPage contains a
8190: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61   pointer.** to a
81a0: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
81b0: 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79   insert an entry
81c0: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
81d0: 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65  r-map.** for the
81e0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
81f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
8200: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
8210: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8220: 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a  u8 *pCell, int *
8230: 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f  pRC){.  CellInfo
8240: 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52   info;.  if( *pR
8250: 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  C ) return;.  as
8260: 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29  sert( pCell!=0 )
8270: 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
8280: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
8290: 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73  ll, &info);.  as
82a0: 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74  sert( (info.nDat
82b0: 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  a+(pPage->intKey
82c0: 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d  ?0:info.nKey))==
82d0: 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
82e0: 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65  .  if( info.iOve
82f0: 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e  rflow ){.    Pgn
8300: 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
8310: 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
8320: 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 70  verflow]);.    p
8330: 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e  trmapPut(pPage->
8340: 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41  pBt, ovfl, PTRMA
8350: 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61  P_OVERFLOW1, pPa
8360: 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a  ge->pgno, pRC);.
8370: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
8380: 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20  *.** Defragment 
8390: 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20  the page given. 
83a0: 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d   All Cells are m
83b0: 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65  oved to the.** e
83c0: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  nd of the page a
83d0: 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63  nd all free spac
83e0: 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69  e is collected i
83f0: 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46  nto one.** big F
8400: 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75  reeBlk that occu
8410: 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  rs in between th
8420: 65 20 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c  e header and cel
8430: 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72  l.** pointer arr
8440: 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20  ay and the cell 
8450: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f  content area..*/
8460: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72  .static int defr
8470: 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61  agmentPage(MemPa
8480: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
8490: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
84a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
84b0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
84c0: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
84d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
84e0: 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65  ess of a i-th ce
84f0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ll */.  int hdr;
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8510: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
8520: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
8530: 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  */.  int size;  
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8550: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
8560: 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  l */.  int usabl
8570: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
8580: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
8590: 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61  sable bytes on a
85a0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63   page */.  int c
85b0: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20  ellOffset;      
85c0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
85d0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
85e0: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
85f0: 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20  nt cbrk;        
8600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
8610: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
8620: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
8630: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
8640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8650: 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
8660: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
8670: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
8680: 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54  data;       /* T
8690: 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  he page data */.
86a0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
86b0: 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20  *temp;       /* 
86c0: 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65  Temp area for ce
86d0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
86e0: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
86f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8700: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
8710: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ll index */.  in
8720: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
8730: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
8740: 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69   possible cell i
8750: 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65  ndex */...  asse
8760: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
8770: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
8780: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
8790: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
87a0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
87b0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
87c0: 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51  usableSize <= SQ
87d0: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
87e0: 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ZE );.  assert( 
87f0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
8800: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
8810: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8820: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
8830: 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70  mutex) );.  temp
8840: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
8850: 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e  empSpace(pPage->
8860: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
8870: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
8880: 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
8890: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
88a0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
88b0: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
88c0: 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
88d0: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
88e0: 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79  t( nCell==get2by
88f0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
8900: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
8910: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
8920: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72  sableSize;.  cbr
8930: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
8940: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
8950: 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d  mcpy(&temp[cbrk]
8960: 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75  , &data[cbrk], u
8970: 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b  sableSize - cbrk
8980: 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62  );.  cbrk = usab
8990: 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46  leSize;.  iCellF
89a0: 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
89b0: 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69  t + 2*nCell;.  i
89c0: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
89d0: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72  eSize - 4;.  for
89e0: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
89f0: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
8a00: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
8a10: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
8a20: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
8a30: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
8a40: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
8a50: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
8a60: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8a70: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
8a80: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8a90: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
8aa0: 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
8ab0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
8ac0: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
8ad0: 29 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63  ).    /* These c
8ae0: 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61  onditions have a
8af0: 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69  lready been veri
8b00: 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69  fied in btreeIni
8b10: 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69  tPage().    ** i
8b20: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8b30: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
8b40: 45 43 4b 20 69 73 20 64 65 66 69 6e 65 64 20 0a  ECK is defined .
8b50: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
8b60: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
8b70: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
8b80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8b90: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
8ba0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
8bb0: 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69     assert( pc>=i
8bc0: 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c  CellFirst && pc<
8bd0: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
8be0: 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a    size = cellSiz
8bf0: 65 50 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d  ePtr(pPage, &tem
8c00: 70 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b  p[pc]);.    cbrk
8c10: 20 2d 3d 20 73 69 7a 65 3b 0a 23 69 66 20 64 65   -= size;.#if de
8c20: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
8c30: 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
8c40: 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 69 66 28  L_CHECK).    if(
8c50: 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74   cbrk<iCellFirst
8c60: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
8c70: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8c80: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  BKPT;.    }.#els
8c90: 65 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  e.    if( cbrk<i
8ca0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b  CellFirst || pc+
8cb0: 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
8cc0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8cd0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8ce0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  KPT;.    }.#endi
8cf0: 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 62  f.    assert( cb
8d00: 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53  rk+size<=usableS
8d10: 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65  ize && cbrk>=iCe
8d20: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
8d30: 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69  estcase( cbrk+si
8d40: 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ze==usableSize )
8d50: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
8d60: 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53  pc+size==usableS
8d70: 69 7a 65 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70  ize );.    memcp
8d80: 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26  y(&data[cbrk], &
8d90: 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b  temp[pc], size);
8da0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41  .    put2byte(pA
8db0: 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a  ddr, cbrk);.  }.
8dc0: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d    assert( cbrk>=
8dd0: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
8de0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
8df0: 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20  dr+5], cbrk);.  
8e00: 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b  data[hdr+1] = 0;
8e10: 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d  .  data[hdr+2] =
8e20: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37   0;.  data[hdr+7
8e30: 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28  ] = 0;.  memset(
8e40: 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74  &data[iCellFirst
8e50: 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c  ], 0, cbrk-iCell
8e60: 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74  First);.  assert
8e70: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
8e80: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
8e90: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
8ea0: 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72  f( cbrk-iCellFir
8eb0: 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65  st!=pPage->nFree
8ec0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8ed0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
8ee0: 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
8ef0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
8f00: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42  *.** Allocate nB
8f10: 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  yte bytes of spa
8f20: 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  ce from within t
8f30: 68 65 20 42 2d 54 72 65 65 20 70 61 67 65 20 70  he B-Tree page p
8f40: 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
8f50: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
8f60: 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78  Write into *pIdx
8f70: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
8f80: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a  pPage->aData[].*
8f90: 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62  * of the first b
8fa0: 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  yte of allocated
8fb0: 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65   space. Return e
8fc0: 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20  ither SQLITE_OK 
8fd0: 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63  or.** an error c
8fe0: 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c  ode (usually SQL
8ff0: 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a  ITE_CORRUPT)..**
9000: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67  .** The caller g
9010: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74  uarantees that t
9020: 68 65 72 65 20 69 73 20 73 75 66 66 69 63 69 65  here is sufficie
9030: 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65  nt space to make
9040: 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69   the.** allocati
9050: 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  on.  This routin
9060: 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  e might need to 
9070: 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72  defragment in or
9080: 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20  der to bring.** 
9090: 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f  all the space to
90a0: 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e  gether, however.
90b0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
90c0: 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a  ill avoid using.
90d0: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 77 6f  ** the first two
90e0: 20 62 79 74 65 73 20 70 61 73 74 20 74 68 65 20   bytes past the 
90f0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65  cell pointer are
9100: 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62  a since presumab
9110: 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63  ly this.** alloc
9120: 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d  ation is being m
9130: 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ade in order to 
9140: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  insert a new cel
9150: 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a  l, so we will.**
9160: 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65   also end up nee
9170: 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20  ding a new cell 
9180: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  pointer..*/.stat
9190: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53  ic int allocateS
91a0: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
91b0: 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  age, int nByte, 
91c0: 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f  int *pIdx){.  co
91d0: 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
91e0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  age->hdrOffset; 
91f0: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
9200: 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f  e of pPage->hdrO
9210: 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20  ffset */.  u8 * 
9220: 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61  const data = pPa
9230: 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20  ge->aData;      
9240: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
9250: 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  f pPage->aData *
9260: 2f 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 20 20  /.  int nFrag;  
9270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9280: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9290: 65 72 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64  er of fragmented
92a0: 20 62 79 74 65 73 20 6f 6e 20 70 50 61 67 65 20   bytes on pPage 
92b0: 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  */.  int top;   
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
92e0: 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20  st byte of cell 
92f0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
9300: 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20    int gap;      
9310: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
9320: 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e 20 63  of gap between c
9330: 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64  ell pointers and
9340: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
9350: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
9360: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65     /* Integer re
9370: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
9380: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f  nt usableSize; /
9390: 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66  * Usable size of
93a0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 0a   the page */.  .
93b0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
93c0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
93d0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
93e0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
93f0: 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61  Page->pBt );.  a
9400: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
9410: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
9420: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
9430: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e    assert( nByte>
9440: 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  =0 );  /* Minimu
9450: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34  m cell size is 4
9460: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
9470: 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74  age->nFree>=nByt
9480: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
9490: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
94a0: 3d 30 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69  =0 );.  usableSi
94b0: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ze = pPage->pBt-
94c0: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 61  >usableSize;.  a
94d0: 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 75  ssert( nByte < u
94e0: 73 61 62 6c 65 53 69 7a 65 2d 38 20 29 3b 0a 0a  sableSize-8 );..
94f0: 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68    nFrag = data[h
9500: 64 72 2b 37 5d 3b 0a 20 20 61 73 73 65 72 74 28  dr+7];.  assert(
9510: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
9520: 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d  et == hdr + 12 -
9530: 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29   4*pPage->leaf )
9540: 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d  ;.  gap = pPage-
9550: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
9560: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
9570: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
9580: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
9590: 69 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65  if( gap>top ) re
95a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
95b0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74  UPT_BKPT;.  test
95c0: 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70  case( gap+2==top
95d0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
95e0: 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20  gap+1==top );.  
95f0: 74 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74  testcase( gap==t
9600: 6f 70 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72  op );..  if( nFr
9610: 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a  ag>=60 ){.    /*
9620: 20 41 6c 77 61 79 73 20 64 65 66 72 61 67 6d 65   Always defragme
9630: 6e 74 20 68 69 67 68 6c 79 20 66 72 61 67 6d 65  nt highly fragme
9640: 6e 74 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20  nted pages */.  
9650: 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e    rc = defragmen
9660: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
9670: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
9680: 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20  n rc;.    top = 
9690: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
96a0: 64 72 2b 35 5d 29 3b 0a 20 20 7d 65 6c 73 65 20  dr+5]);.  }else 
96b0: 69 66 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29  if( gap+2<=top )
96c0: 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  {.    /* Search 
96d0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f  the freelist loo
96e0: 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20  king for a free 
96f0: 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20  slot big enough 
9700: 74 6f 20 73 61 74 69 73 66 79 20 0a 20 20 20 20  to satisfy .    
9710: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 2e 20  ** the request. 
9720: 54 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  The allocation i
9730: 73 20 6d 61 64 65 20 66 72 6f 6d 20 74 68 65 20  s made from the 
9740: 66 69 72 73 74 20 66 72 65 65 20 73 6c 6f 74 20  first free slot 
9750: 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  in .    ** the l
9760: 69 73 74 20 74 68 61 74 20 69 73 20 6c 61 72 67  ist that is larg
9770: 65 20 65 6e 6f 75 67 68 20 74 6f 20 61 63 63 6f  e enough to acco
9780: 6d 61 64 61 74 65 20 69 74 2e 0a 20 20 20 20 2a  madate it..    *
9790: 2f 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 61 64  /.    int pc, ad
97a0: 64 72 3b 0a 20 20 20 20 66 6f 72 28 61 64 64 72  dr;.    for(addr
97b0: 3d 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65  =hdr+1; (pc = ge
97c0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
97d0: 72 5d 29 29 3e 30 3b 20 61 64 64 72 3d 70 63 29  r]))>0; addr=pc)
97e0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65  {.      int size
97f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
9800: 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65  Size of the free
9810: 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69   slot */.      i
9820: 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65  f( pc>usableSize
9830: 2d 34 20 7c 7c 20 70 63 3c 61 64 64 72 2b 34 20  -4 || pc<addr+4 
9840: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
9850: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9860: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
9870: 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
9880: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
9890: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a  );.      if( siz
98a0: 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  e>=nByte ){.    
98b0: 20 20 20 20 69 6e 74 20 78 20 3d 20 73 69 7a 65      int x = size
98c0: 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20   - nByte;.      
98d0: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34    testcase( x==4
98e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
98f0: 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20  case( x==3 );.  
9900: 20 20 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b        if( x<4 ){
9910: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  .          /* Re
9920: 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72  move the slot fr
9930: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
9940: 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d  . Update the num
9950: 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 20  ber of.         
9960: 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62   ** fragmented b
9970: 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ytes within the 
9980: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
9990: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
99a0: 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d  addr], &data[pc]
99b0: 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 2);.          
99c0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 28 75  data[hdr+7] = (u
99d0: 38 29 28 6e 46 72 61 67 20 2b 20 78 29 3b 0a 20  8)(nFrag + x);. 
99e0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
99f0: 20 73 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c   size+pc > usabl
9a00: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
9a10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9a20: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9a30: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
9a40: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
9a50: 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74  lot remains on t
9a60: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65  he free-list. Re
9a70: 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f  duce its size to
9a80: 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20   account.       
9a90: 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f     ** for the po
9aa0: 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68  rtion used by th
9ab0: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
9ac0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  . */.          p
9ad0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  ut2byte(&data[pc
9ae0: 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 20  +2], x);.       
9af0: 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 49 64 78   }.        *pIdx
9b00: 20 3d 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20   = pc + x;.     
9b10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9b20: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
9b30: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
9b40: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
9b50: 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20  there is enough 
9b60: 73 70 61 63 65 20 69 6e 20 74 68 65 20 67 61 70  space in the gap
9b70: 20 74 6f 20 73 61 74 69 73 66 79 0a 20 20 2a 2a   to satisfy.  **
9b80: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e   the allocation.
9b90: 20 20 49 66 20 6e 6f 74 2c 20 64 65 66 72 61 67    If not, defrag
9ba0: 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73  ment..  */.  tes
9bb0: 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79  tcase( gap+2+nBy
9bc0: 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  te==top );.  if(
9bd0: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70   gap+2+nByte>top
9be0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 65 66   ){.    rc = def
9bf0: 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
9c00: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
9c10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
9c20: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
9c30: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
9c40: 20 20 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42    assert( gap+nB
9c50: 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a  yte<=top );.  }.
9c60: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
9c70: 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20  memory from the 
9c80: 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74  gap in between t
9c90: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
9ca0: 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74  array.  ** and t
9cb0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
9cc0: 61 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65  area.  The btree
9cd0: 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20  InitPage() call 
9ce0: 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  has already.  **
9cf0: 20 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66   validated the f
9d00: 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20  reelist.  Given 
9d10: 74 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73  that the freelis
9d20: 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72  t is valid, ther
9d30: 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79  e.  ** is no way
9d40: 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61   that the alloca
9d50: 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20  tion can extend 
9d60: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
9d70: 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68  he page..  ** Th
9d80: 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77  e assert() below
9d90: 20 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72   verifies the pr
9da0: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e  evious sentence.
9db0: 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e  .  */.  top -= n
9dc0: 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65  Byte;.  put2byte
9dd0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
9de0: 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  op);.  assert( t
9df0: 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 70 50 61 67  op+nByte <= pPag
9e00: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
9e10: 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  ze );.  *pIdx = 
9e20: 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  top;.  return SQ
9e30: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
9e40: 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69  * Return a secti
9e50: 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d  on of the pPage-
9e60: 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72  >aData to the fr
9e70: 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66  eelist..** The f
9e80: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
9e90: 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20   new free block 
9ea0: 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b  is pPage->aDisk[
9eb0: 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68  start].** and th
9ec0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c  e size of the bl
9ed0: 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20 62 79  ock is "size" by
9ee0: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20  tes..**.** Most 
9ef0: 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20 68 65  of the effort he
9f00: 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69  re is involved i
9f10: 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61  n coalesing adja
9f20: 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f  cent.** free blo
9f30: 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  cks into a singl
9f40: 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f 63 6b  e big free block
9f50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9f60: 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67  freeSpace(MemPag
9f70: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 73 74  e *pPage, int st
9f80: 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a  art, int size){.
9f90: 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62 65 67    int addr, pbeg
9fa0: 69 6e 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 69  in, hdr;.  int i
9fb0: 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9fd0: 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65  Largest possible
9fe0: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
9ff0: 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  t */.  unsigned 
a000: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
a010: 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73  ge->aData;..  as
a020: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
a030: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
a040: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
a050: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
a060: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
a070: 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61  sert( start>=pPa
a080: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b  ge->hdrOffset+6+
a090: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
a0a0: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
a0b0: 20 28 73 74 61 72 74 20 2b 20 73 69 7a 65 29 3c   (start + size)<
a0c0: 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
a0d0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  bleSize );.  ass
a0e0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
a0f0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
a100: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
a110: 61 73 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20  assert( size>=0 
a120: 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  );   /* Minimum 
a130: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
a140: 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  /..  if( pPage->
a150: 70 42 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74  pBt->secureDelet
a160: 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72  e ){.    /* Over
a170: 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
a180: 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
a190: 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65  eros when the se
a1a0: 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 20 20  cure_delete.    
a1b0: 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  ** option is ena
a1c0: 62 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  bled */.    mems
a1d0: 65 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c  et(&data[start],
a1e0: 20 30 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 0a   0, size);.  }..
a1f0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61    /* Add the spa
a200: 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ce back into the
a210: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
a220: 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74  freeblocks.  Not
a230: 65 20 74 68 61 74 0a 20 20 2a 2a 20 65 76 65 6e  e that.  ** even
a240: 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65   though the free
a250: 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63  block list was c
a260: 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49  hecked by btreeI
a270: 6e 69 74 50 61 67 65 28 29 2c 0a 20 20 2a 2a 20  nitPage(),.  ** 
a280: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
a290: 64 69 64 20 6e 6f 74 20 64 65 74 65 63 74 20 6f  did not detect o
a2a0: 76 65 72 6c 61 70 70 69 6e 67 20 63 65 6c 6c 73  verlapping cells
a2b0: 20 6f 72 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f   or.  ** freeblo
a2c0: 63 6b 73 20 74 68 61 74 20 6f 76 65 72 6c 61 70  cks that overlap
a2d0: 70 65 64 20 63 65 6c 6c 73 2e 20 20 20 4e 6f 72  ped cells.   Nor
a2e0: 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74 20   does it detect 
a2f0: 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 63 65  when the.  ** ce
a300: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
a310: 65 78 63 65 65 64 73 20 74 68 65 20 76 61 6c 75  exceeds the valu
a320: 65 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65  e in the page he
a330: 61 64 65 72 2e 20 20 49 66 20 74 68 65 73 65 0a  ader.  If these.
a340: 20 20 2a 2a 20 73 69 74 75 61 74 69 6f 6e 73 20    ** situations 
a350: 61 72 69 73 65 2c 20 74 68 65 6e 20 73 75 62 73  arise, then subs
a360: 65 71 75 65 6e 74 20 69 6e 73 65 72 74 20 6f 70  equent insert op
a370: 65 72 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 63  erations might c
a380: 6f 72 72 75 70 74 0a 20 20 2a 2a 20 74 68 65 20  orrupt.  ** the 
a390: 66 72 65 65 6c 69 73 74 2e 20 20 53 6f 20 77 65  freelist.  So we
a3a0: 20 64 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63   do need to chec
a3b0: 6b 20 66 6f 72 20 63 6f 72 72 75 70 74 69 6f 6e  k for corruption
a3c0: 20 77 68 69 6c 65 20 73 63 61 6e 6e 69 6e 67 0a   while scanning.
a3d0: 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73    ** the freelis
a3e0: 74 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20  t..  */.  hdr = 
a3f0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
a400: 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b  ;.  addr = hdr +
a410: 20 31 3b 0a 20 20 69 4c 61 73 74 20 3d 20 70 50   1;.  iLast = pP
a420: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
a430: 53 69 7a 65 20 2d 20 34 3b 0a 20 20 61 73 73 65  Size - 4;.  asse
a440: 72 74 28 20 73 74 61 72 74 3c 3d 69 4c 61 73 74  rt( start<=iLast
a450: 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62   );.  while( (pb
a460: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
a470: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74  &data[addr]))<st
a480: 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20  art && pbegin>0 
a490: 29 7b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69  ){.    if( pbegi
a4a0: 6e 3c 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20  n<addr+4 ){.    
a4b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a4c0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
a4d0: 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 70    }.    addr = p
a4e0: 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  begin;.  }.  if(
a4f0: 20 70 62 65 67 69 6e 3e 69 4c 61 73 74 20 29 7b   pbegin>iLast ){
a500: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
a510: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
a520: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
a530: 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62  begin>addr || pb
a540: 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74  egin==0 );.  put
a550: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
a560: 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74  ], start);.  put
a570: 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72  2byte(&data[star
a580: 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70  t], pbegin);.  p
a590: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74  ut2byte(&data[st
a5a0: 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20  art+2], size);. 
a5b0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
a5c0: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20 28  pPage->nFree + (
a5d0: 75 31 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20  u16)size;..  /* 
a5e0: 43 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e  Coalesce adjacen
a5f0: 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f  t free blocks */
a600: 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20  .  addr = hdr + 
a610: 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65  1;.  while( (pbe
a620: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
a630: 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29  data[addr]))>0 )
a640: 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c  {.    int pnext,
a650: 20 70 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61   psize, x;.    a
a660: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64  ssert( pbegin>ad
a670: 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  dr );.    assert
a680: 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d  ( pbegin<=pPage-
a690: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a6a0: 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20  -4 );.    pnext 
a6b0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a6c0: 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70  [pbegin]);.    p
a6d0: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
a6e0: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29  &data[pbegin+2])
a6f0: 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e  ;.    if( pbegin
a700: 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20   + psize + 3 >= 
a710: 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30  pnext && pnext>0
a720: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72   ){.      int fr
a730: 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62  ag = pnext - (pb
a740: 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20  egin+psize);.   
a750: 20 20 20 69 66 28 20 28 66 72 61 67 3c 30 29 20     if( (frag<0) 
a760: 7c 7c 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61  || (frag>(int)da
a770: 74 61 5b 68 64 72 2b 37 5d 29 20 29 7b 0a 20 20  ta[hdr+7]) ){.  
a780: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a790: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
a7a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a7b0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 28  data[hdr+7] -= (
a7c0: 75 38 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78  u8)frag;.      x
a7d0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
a7e0: 61 5b 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20  a[pnext]);.     
a7f0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
a800: 70 62 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20  pbegin], x);.   
a810: 20 20 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67     x = pnext + g
a820: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
a830: 65 78 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e  ext+2]) - pbegin
a840: 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  ;.      put2byte
a850: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
a860: 2c 20 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , x);.    }else{
a870: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 62  .      addr = pb
a880: 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  egin;.    }.  }.
a890: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c  .  /* If the cel
a8a0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62  l content area b
a8b0: 65 67 69 6e 73 20 77 69 74 68 20 61 20 66 72 65  egins with a fre
a8c0: 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69  eblock, remove i
a8d0: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61  t. */.  if( data
a8e0: 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64  [hdr+1]==data[hd
a8f0: 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72  r+5] && data[hdr
a900: 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d  +2]==data[hdr+6]
a910: 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b   ){.    int top;
a920: 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65  .    pbegin = ge
a930: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
a940: 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  +1]);.    memcpy
a950: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26  (&data[hdr+1], &
a960: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29  data[pbegin], 2)
a970: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
a980: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
a990: 5d 29 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  ]) + get2byte(&d
a9a0: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
a9b0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
a9c0: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
a9d0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
a9e0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
a9f0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
aa00: 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
aa10: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
aa20: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68  ./*.** Decode th
aa30: 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68  e flags byte (th
aa40: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
aa50: 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20  the header) for 
aa60: 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e  a page.** and in
aa70: 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20  itialize fields 
aa80: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
aa90: 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69  tructure accordi
aaa0: 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ngly..**.** Only
aab0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
aac0: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20  ombinations are 
aad0: 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74  supported.  Anyt
aae0: 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a  hing different.*
aaf0: 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f  * indicates a co
ab00: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
ab10: 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iles:.**.**     
ab20: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
ab30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
ab40: 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c  ZERODATA | PTF_L
ab50: 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  EAF.**         P
ab60: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
ab70: 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20  F_INTKEY.**     
ab80: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
ab90: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20   | PTF_INTKEY | 
aba0: 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74  PTF_LEAF.*/.stat
abb0: 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61  ic int decodeFla
abc0: 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  gs(MemPage *pPag
abd0: 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29  e, int flagByte)
abe0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
abf0: 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  t;     /* A copy
ac00: 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a   of pPage->pBt *
ac10: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
ac20: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28  ge->hdrOffset==(
ac30: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
ac40: 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61   100 : 0) );.  a
ac50: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
ac60: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
ac70: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
ac80: 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20    pPage->leaf = 
ac90: 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33  (u8)(flagByte>>3
aca0: 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f  );  assert( PTF_
acb0: 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a  LEAF == 1<<3 );.
acc0: 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50    flagByte &= ~P
acd0: 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65  TF_LEAF;.  pPage
ace0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
acf0: 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   4-4*pPage->leaf
ad00: 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
ad10: 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67  >pBt;.  if( flag
ad20: 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44  Byte==(PTF_LEAFD
ad30: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
ad40: 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) ){.    pPage->
ad50: 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  intKey = 1;.    
ad60: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d  pPage->hasData =
ad70: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20   pPage->leaf;.  
ad80: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
ad90: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  l = pBt->maxLeaf
ada0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
adb0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
adc0: 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Leaf;.  }else if
add0: 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f  ( flagByte==PTF_
ade0: 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20  ZERODATA ){.    
adf0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
ae00: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61  0;.    pPage->ha
ae10: 73 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70  sData = 0;.    p
ae20: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
ae30: 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a   pBt->maxLocal;.
ae40: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
ae50: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f  cal = pBt->minLo
ae60: 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  cal;.  }else{.  
ae70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ae80: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
ae90: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
aea0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
aeb0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75  nitialize the au
aec0: 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74  xiliary informat
aed0: 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62  ion for a disk b
aee0: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lock..**.** Retu
aef0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
af00: 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20  success.  If we 
af10: 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  see that the pag
af20: 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f  e does.** not co
af30: 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  ntain a well-for
af40: 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67  med database pag
af50: 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a  e, then return .
af60: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
af70: 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20  T.  Note that a 
af80: 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45  return of SQLITE
af90: 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  _OK does not.** 
afa0: 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74  guarantee that t
afb0: 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d  he page is well-
afc0: 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79  formed.  It only
afd0: 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77   shows that.** w
afe0: 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65  e failed to dete
aff0: 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f  ct any corruptio
b000: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
b010: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d   btreeInitPage(M
b020: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
b030: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b040: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
b050: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
b060: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
b070: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
b080: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b090: 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
b0a0: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
b0b0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
b0c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
b0d0: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
b0e0: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
b0f0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
b100: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
b110: 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  a == sqlite3Page
b120: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
b130: 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69  pDbPage) );..  i
b140: 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69  f( !pPage->isIni
b150: 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b  t ){.    u16 pc;
b160: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
b170: 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65  ddress of a free
b180: 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61  block within pPa
b190: 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20  ge->aData[] */. 
b1a0: 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20     u8 hdr;      
b1b0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
b1c0: 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  to beginning of 
b1d0: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
b1e0: 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20     u8 *data;    
b1f0: 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74        /* Equal t
b200: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  o pPage->aData *
b210: 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  /.    BtShared *
b220: 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  pBt;        /* T
b230: 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74  he main btree st
b240: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 75  ructure */.    u
b250: 31 36 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  16 usableSize;  
b260: 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75    /* Amount of u
b270: 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65  sable space on e
b280: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ach page */.    
b290: 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  u16 cellOffset; 
b2a0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f     /* Offset fro
b2b0: 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20  m start of page 
b2c0: 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  to first cell po
b2d0: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 31 36  inter */.    u16
b2e0: 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
b2f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75  /* Number of unu
b300: 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65  sed bytes on the
b310: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36   page */.    u16
b320: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
b330: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
b340: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
b350: 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e  t area */.    in
b360: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
b370: 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61   /* First allowa
b380: 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
b390: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
b3a0: 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73      int iCellLas
b3b0: 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70  t;     /* Last p
b3c0: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20  ossible cell or 
b3d0: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
b3e0: 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70   */..    pBt = p
b3f0: 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20  Page->pBt;..    
b400: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
b410: 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61  Offset;.    data
b420: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
b430: 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64 65 46  .    if( decodeF
b440: 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61  lags(pPage, data
b450: 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20  [hdr]) ) return 
b460: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b470: 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28  KPT;.    assert(
b480: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
b490: 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
b4a0: 53 69 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20  Size<=32768 );. 
b4b0: 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61     pPage->maskPa
b4c0: 67 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ge = pBt->pageSi
b4d0: 7a 65 20 2d 20 31 3b 0a 20 20 20 20 70 50 61 67  ze - 1;.    pPag
b4e0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
b4f0: 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  ;.    usableSize
b500: 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
b510: 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63  ze;.    pPage->c
b520: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c  ellOffset = cell
b530: 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31  Offset = hdr + 1
b540: 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61  2 - 4*pPage->lea
b550: 66 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  f;.    top = get
b560: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
b570: 35 5d 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  5]);.    pPage->
b580: 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65  nCell = get2byte
b590: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a  (&data[hdr+3]);.
b5a0: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e      if( pPage->n
b5b0: 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74  Cell>MX_CELL(pBt
b5c0: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f  ) ){.      /* To
b5d0: 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20   many cells for 
b5e0: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20  a single page.  
b5f0: 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65  The page must be
b600: 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20   corrupt */.    
b610: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b620: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b630: 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65    }.    testcase
b640: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
b650: 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a  MX_CELL(pBt) );.
b660: 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72  .    /* A malfor
b670: 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67  med database pag
b680: 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 75 73  e might cause us
b690: 20 74 6f 20 72 65 61 64 20 70 61 73 74 20 74 68   to read past th
b6a0: 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20  e end.    ** of 
b6b0: 70 61 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e  page when parsin
b6c0: 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20  g a cell.  .    
b6d0: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  **.    ** The fo
b6e0: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66  llowing block of
b6f0: 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72   code checks ear
b700: 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61 20 63  ly to see if a c
b710: 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 20 20  ell extends.    
b720: 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ** past the end 
b730: 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  of a page bounda
b740: 72 79 20 61 6e 64 20 63 61 75 73 65 73 20 53 51  ry and causes SQ
b750: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20  LITE_CORRUPT to 
b760: 62 65 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  be .    ** retur
b770: 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a  ned if it does..
b780: 20 20 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c      */.    iCell
b790: 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73  First = cellOffs
b7a0: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
b7b0: 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61  ell;.    iCellLa
b7c0: 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  st = usableSize 
b7d0: 2d 20 34 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  - 4;.#if defined
b7e0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f  (SQLITE_ENABLE_O
b7f0: 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45  VERSIZE_CELL_CHE
b800: 43 4b 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  CK).    {.      
b810: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
b820: 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20    /* Index into 
b830: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
b840: 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20   array */.      
b850: 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20  int sz;         
b860: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
b870: 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66  ell */..      if
b880: 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
b890: 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20   iCellLast--;.  
b8a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
b8b0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
b8c0: 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d 20  ){.        pc = 
b8d0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 63  get2byte(&data[c
b8e0: 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b  ellOffset+i*2]);
b8f0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
b900: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73  e( pc==iCellFirs
b910: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  t );.        tes
b920: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
b930: 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Last );.        
b940: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
b950: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
b960: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  t ){.          r
b970: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
b980: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
b990: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 7a 20     }.        sz 
b9a0: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
b9b0: 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b  age, &data[pc]);
b9c0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
b9d0: 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65  e( pc+sz==usable
b9e0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
b9f0: 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65  if( pc+sz>usable
ba00: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
ba10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ba20: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
ba30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ba40: 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
ba50: 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61  ->leaf ) iCellLa
ba60: 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 23 65  st++;.    }  .#e
ba70: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d  ndif..    /* Com
ba80: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66  pute the total f
ba90: 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65  ree space on the
baa0: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 70 63 20   page */.    pc 
bab0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
bac0: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46  [hdr+1]);.    nF
bad0: 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  ree = data[hdr+7
bae0: 5d 20 2b 20 74 6f 70 3b 0a 20 20 20 20 77 68 69  ] + top;.    whi
baf0: 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20  le( pc>0 ){.    
bb00: 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65    u16 next, size
bb10: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c 69  ;.      if( pc<i
bb20: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
bb30: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
bb40: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
bb50: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f   free block is o
bb60: 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  ff the page */. 
bb70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
bb80: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
bb90: 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
bba0: 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74    next = get2byt
bbb0: 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  e(&data[pc]);.  
bbc0: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
bbd0: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29  yte(&data[pc+2])
bbe0: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6e 65 78  ;.      if( (nex
bbf0: 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b  t>0 && next<=pc+
bc00: 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73 69  size+3) || pc+si
bc10: 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ze>usableSize ){
bc20: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65  .        /* Free
bc30: 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20   blocks must be 
bc40: 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
bc50: 65 72 2e 20 41 6e 64 20 74 68 65 20 6c 61 73 74  er. And the last
bc60: 20 62 79 74 65 20 6f 66 0a 09 2a 2a 20 74 68 65   byte of..** the
bc70: 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d 75 73 74   free-block must
bc80: 20 6c 69 65 20 6f 6e 20 74 68 65 20 64 61 74 61   lie on the data
bc90: 62 61 73 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  base page.  */. 
bca0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
bcb0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
bcc0: 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
bcd0: 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20    nFree = nFree 
bce0: 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63  + size;.      pc
bcf0: 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a   = next;.    }..
bd00: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
bd10: 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74  oint, nFree cont
bd20: 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20  ains the sum of 
bd30: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
bd40: 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f  e start.    ** o
bd50: 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
bd60: 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65  nt area plus the
bd70: 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   number of free 
bd80: 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20  bytes within.   
bd90: 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   ** the cell-con
bda0: 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68  tent area. If th
bdb0: 69 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68  is is greater th
bdc0: 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69  an the usable-si
bdd0: 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ze.    ** of the
bde0: 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
bdf0: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
be00: 72 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65  rupted. This che
be10: 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73  ck also.    ** s
be20: 65 72 76 65 73 20 74 6f 20 76 65 72 69 66 79 20  erves to verify 
be30: 74 68 61 74 20 74 68 65 20 6f 66 66 73 65 74 20  that the offset 
be40: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
be50: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
be60: 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63  .    ** area, ac
be70: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70  cording to the p
be80: 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73  age header, lies
be90: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
bea0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
beb0: 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a   nFree>usableSiz
bec0: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
bed0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
bee0: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20  _BKPT; .    }.  
bef0: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
bf00: 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69   (u16)(nFree - i
bf10: 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 20 20  CellFirst);.    
bf20: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
bf30: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
bf40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
bf50: 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77  .** Set up a raw
bf60: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74   page so that it
bf70: 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61   looks like a da
bf80: 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64  tabase page hold
bf90: 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65  ing.** no entrie
bfa0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
bfb0: 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61  d zeroPage(MemPa
bfc0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
bfd0: 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  lags){.  unsigne
bfe0: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
bff0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42  Page->aData;.  B
c000: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
c010: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20  Page->pBt;.  u8 
c020: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
c030: 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69  Offset;.  u16 fi
c040: 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rst;..  assert( 
c050: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
c060: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
c070: 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70  bPage)==pPage->p
c080: 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
c090: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
c0a0: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
c0b0: 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
c0c0: 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
c0d0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
c0e0: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
c0f0: 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29  bPage) == data )
c100: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
c110: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
c120: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
c130: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
c140: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
c150: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
c160: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 73 65  );.  if( pBt->se
c170: 63 75 72 65 44 65 6c 65 74 65 20 29 7b 0a 20 20  cureDelete ){.  
c180: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
c190: 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61  dr], 0, pBt->usa
c1a0: 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a  bleSize - hdr);.
c1b0: 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20    }.  data[hdr] 
c1c0: 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20  = (char)flags;. 
c1d0: 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38   first = hdr + 8
c1e0: 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46   + 4*((flags&PTF
c1f0: 5f 4c 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29 3b  _LEAF)==0 ?1:0);
c200: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
c210: 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20  hdr+1], 0, 4);. 
c220: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
c230: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
c240: 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e  ta[hdr+5], pBt->
c250: 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70  usableSize);.  p
c260: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42  Page->nFree = pB
c270: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
c280: 66 69 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46  first;.  decodeF
c290: 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67  lags(pPage, flag
c2a0: 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72  s);.  pPage->hdr
c2b0: 4f 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20  Offset = hdr;.  
c2c0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
c2d0: 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61  t = first;.  pPa
c2e0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
c2f0: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  0;.  assert( pBt
c300: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
c310: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
c320: 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 70 50 61  <=32768 );.  pPa
c330: 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70  ge->maskPage = p
c340: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
c350: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
c360: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69   = 0;.  pPage->i
c370: 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f  sInit = 1;.}.../
c380: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44  *.** Convert a D
c390: 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66  bPage obtained f
c3a0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e  rom the pager in
c3b0: 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65  to a MemPage use
c3c0: 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65  d by.** the btre
c3d0: 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74  e layer..*/.stat
c3e0: 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65  ic MemPage *btre
c3f0: 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
c400: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  DbPage *pDbPage,
c410: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68   Pgno pgno, BtSh
c420: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
c430: 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28  mPage *pPage = (
c440: 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33  MemPage*)sqlite3
c450: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
c460: 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d  bPage);.  pPage-
c470: 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33  >aData = sqlite3
c480: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
c490: 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Page);.  pPage->
c4a0: 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  pDbPage = pDbPag
c4b0: 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20  e;.  pPage->pBt 
c4c0: 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e  = pBt;.  pPage->
c4d0: 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70  pgno = pgno;.  p
c4e0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
c4f0: 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  = pPage->pgno==1
c500: 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65   ? 100 : 0;.  re
c510: 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a  turn pPage; .}..
c520: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
c530: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e   from the pager.
c540: 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65    Initialize the
c550: 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
c560: 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
c570: 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
c580: 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  eded..**.** If t
c590: 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61  he noContent fla
c5a0: 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61  g is set, it mea
c5b0: 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
c5c0: 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20  t care about.** 
c5d0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
c5e0: 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20  he page at this 
c5f0: 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74  time.  So do not
c600: 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a   go to the disk.
c610: 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65 20  ** to fetch the 
c620: 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66  content.  Just f
c630: 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  ill in the conte
c640: 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f  nt with zeros fo
c650: 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20  r now..** If in 
c660: 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63 61  the future we ca
c670: 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  ll sqlite3PagerW
c680: 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70  rite() on this p
c690: 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61  age, that.** mea
c6a0: 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72 74  ns we have start
c6b0: 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e  ed to be concern
c6c0: 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74  ed about content
c6d0: 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a   and the disk.**
c6e0: 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63   read should occ
c6f0: 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ur at that point
c700: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c710: 62 74 72 65 65 47 65 74 50 61 67 65 28 0a 20 20  btreeGetPage(.  
c720: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
c730: 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
c740: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
c750: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
c760: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
c770: 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  e to fetch */.  
c780: 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
c790: 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74  ,    /* Return t
c7a0: 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
c7b0: 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69  parameter */.  i
c7c0: 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20  nt noContent    
c7d0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f      /* Do not lo
c7e0: 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  ad page content 
c7f0: 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
c800: 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65  int rc;.  DbPage
c810: 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73   *pDbPage;..  as
c820: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
c830: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
c840: 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  tex) );.  rc = s
c850: 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
c860: 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  re(pBt->pPager, 
c870: 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29  pgno, (DbPage**)
c880: 26 70 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e 74  &pDbPage, noCont
c890: 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ent);.  if( rc )
c8a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
c8b0: 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
c8c0: 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
c8d0: 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
c8e0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c8f0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
c900: 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72  trieve a page fr
c910: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63  om the pager cac
c920: 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  he. If the reque
c930: 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
c940: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
c950: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72  he pager cache r
c960: 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74  eturn NULL. Init
c970: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
c980: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
c990: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
c9a0: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
c9b0: 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
c9c0: 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b  e *btreePageLook
c9d0: 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  up(BtShared *pBt
c9e0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
c9f0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
ca00: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ca10: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
ca20: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
ca30: 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  DbPage = sqlite3
ca40: 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d  PagerLookup(pBt-
ca50: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  >pPager, pgno);.
ca60: 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b    if( pDbPage ){
ca70: 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
ca80: 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
ca90: 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
caa0: 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Bt);.  }.  retur
cab0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
cac0: 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
cad0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
cae0: 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20  le in pages. If 
caf0: 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e  there is any kin
cb00: 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72  d of.** error, r
cb10: 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64  eturn ((unsigned
cb20: 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61   int)-1)..*/.sta
cb30: 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61  tic Pgno btreePa
cb40: 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64  gecount(BtShared
cb50: 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e   *pBt){.  return
cb60: 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75   pBt->nPage;.}.u
cb70: 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  32 sqlite3BtreeL
cb80: 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a 70  astPage(Btree *p
cb90: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
cba0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
cbb0: 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
cbc0: 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50  rt( ((p->pBt->nP
cbd0: 61 67 65 29 26 30 78 38 30 30 30 30 30 30 29 3d  age)&0x8000000)=
cbe0: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  =0 );.  return (
cbf0: 69 6e 74 29 62 74 72 65 65 50 61 67 65 63 6f 75  int)btreePagecou
cc00: 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f  nt(p->pBt);.}../
cc10: 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
cc20: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61  from the pager a
cc30: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
cc40: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
cc50: 69 73 20 6a 75 73 74 20 61 0a 2a 2a 20 63 6f 6e  is just a.** con
cc60: 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72  venience wrapper
cc70: 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65   around separate
cc80: 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 47   calls to btreeG
cc90: 65 74 50 61 67 65 28 29 20 61 6e 64 20 0a 2a 2a  etPage() and .**
cca0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
ccb0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
ccc0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
ccd0: 20 74 68 65 20 76 61 6c 75 65 20 2a 70 70 50 61   the value *ppPa
cce0: 67 65 20 69 73 20 73 65 74 20 74 6f 20 69 73 20  ge is set to is 
ccf0: 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a  undefined. It.**
cd00: 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68   may remain unch
cd10: 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79  anged, or it may
cd20: 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e   be set to an in
cd30: 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a  valid value..*/.
cd40: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e  static int getAn
cd50: 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53  dInitPage(.  BtS
cd60: 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
cd70: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
cd80: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
cd90: 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
cda0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
cdb0: 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74   the page to get
cdc0: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
cdd0: 70 70 50 61 67 65 20 20 20 20 20 2f 2a 20 57 72  ppPage     /* Wr
cde0: 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69  ite the page poi
cdf0: 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  nter here */.){.
ce00: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
ce10: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
ce20: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
ce30: 78 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e  x) );..  if( pgn
ce40: 6f 3c 3d 30 20 7c 7c 20 70 67 6e 6f 3e 62 74 72  o<=0 || pgno>btr
ce50: 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
ce60: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
ce70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
ce80: 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 62  PT;.  }.  rc = b
ce90: 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
cea0: 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30   pgno, ppPage, 0
ceb0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
cec0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
ced0: 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
cee0: 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 69  (*ppPage);.    i
cef0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
cf00: 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
cf10: 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
cf20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
cf30: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
cf40: 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67  Release a MemPag
cf50: 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  e.  This should 
cf60: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66  be called once f
cf70: 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a  or each prior.**
cf80: 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47 65   call to btreeGe
cf90: 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  tPage..*/.static
cfa0: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
cfb0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
cfc0: 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  ){.  if( pPage )
cfd0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
cfe0: 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
cff0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
d000: 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65  >pBt );.    asse
d010: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
d020: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
d030: 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
d040: 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 20 20  d*)pPage );.    
d050: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
d060: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
d070: 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
d080: 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  ge->aData );.   
d090: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d0a0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
d0b0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
d0c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
d0d0: 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e 70  erUnref(pPage->p
d0e0: 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  DbPage);.  }.}..
d0f0: 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72  /*.** During a r
d100: 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68  ollback, when th
d110: 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20  e pager reloads 
d120: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f  information into
d130: 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f   the cache.** so
d140: 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
d150: 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
d160: 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
d170: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
d180: 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  f.** the transac
d190: 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70  tion, for each p
d1a0: 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69  age restored thi
d1b0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
d1c0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
d1d0: 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f  routine needs to
d1e0: 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61   reset the extra
d1f0: 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74   data section at
d200: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
d210: 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65  ** page to agree
d220: 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
d230: 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
d240: 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e  ic void pageRein
d250: 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61  it(DbPage *pData
d260: 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
d270: 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28  age;.  pPage = (
d280: 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
d290: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
d2a0: 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28  Data);.  assert(
d2b0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
d2c0: 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
d2d0: 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  >0 );.  if( pPag
d2e0: 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
d2f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d300: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
d310: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
d320: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
d330: 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  nit = 0;.    if(
d340: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
d350: 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
d360: 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  >1 ){.      /* p
d370: 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  Page might not b
d380: 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20  e a btree page; 
d390: 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20   it might be an 
d3a0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
d3b0: 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70      ** or ptrmap
d3c0: 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20   page or a free 
d3d0: 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20  page.  In those 
d3e0: 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f  cases, the follo
d3f0: 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61  wing.      ** ca
d400: 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50  ll to btreeInitP
d410: 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c  age() will likel
d420: 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
d430: 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a  CORRUPT..      *
d440: 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73  * But no harm is
d450: 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20   done by this.  
d460: 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69  And it is very i
d470: 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20  mportant that.  
d480: 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74      ** btreeInit
d490: 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64  Page() be called
d4a0: 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20   on every btree 
d4b0: 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a  page so we make.
d4c0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c        ** the cal
d4d0: 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65  l for every page
d4e0: 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66   that comes in f
d4f0: 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a  or re-initing. *
d500: 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69  /.      btreeIni
d510: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
d520: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
d530: 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
d540: 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62   handler for a b
d550: 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
d560: 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  int btreeInvokeB
d570: 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
d580: 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72  *pArg){.  BtShar
d590: 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61  ed *pBt = (BtSha
d5a0: 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73  red*)pArg;.  ass
d5b0: 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a  ert( pBt->db );.
d5c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d5d0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
d5e0: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
d5f0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
d600: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
d610: 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79  r(&pBt->db->busy
d620: 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  Handler);.}../*.
d630: 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61  ** Open a databa
d640: 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
d650: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65  zFilename is the
d660: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
d670: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
d680: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
d690: 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62  L.** a new datab
d6a0: 61 73 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f  ase with a rando
d6b0: 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65  m name is create
d6c0: 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c  d.  This randoml
d6d0: 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62  y named.** datab
d6e0: 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  ase file will be
d6f0: 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71   deleted when sq
d700: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
d710: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
d720: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
d730: 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
d740: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
d750: 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
d760: 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f  .** that is auto
d770: 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f  matically destro
d780: 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63  yed when it is c
d790: 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  losed..**.** If 
d7a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
d7b0: 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69  already opened i
d7c0: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
d7d0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
d7e0: 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20  * and we are in 
d7f0: 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64  shared cache mod
d800: 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e  e, then the open
d810: 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
d820: 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e  an.** SQLITE_CON
d830: 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20  STRAINT error.  
d840: 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  We cannot allow 
d850: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68  two or more BtSh
d860: 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  ared.** objects 
d870: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
d880: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
d890: 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77  since doing so w
d8a0: 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70  ill lead.** to p
d8b0: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63  roblems with loc
d8c0: 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
d8d0: 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
d8e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
d8f0: 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
d900: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
d910: 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
d920: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
d930: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
d940: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63          /* Assoc
d950: 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68  iated database h
d960: 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
d970: 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20   **ppBtree,     
d980: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
d990: 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63   new Btree objec
d9a0: 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
d9b0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
d9c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
d9d0: 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ptions */.  int 
d9e0: 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
d9f0: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
da00: 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
da10: 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
da20: 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  () */.){.  sqlit
da30: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
da40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
da50: 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20   VFS to use for 
da60: 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20  this btree */.  
da70: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
da80: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
da90: 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66  * Shared part of
daa0: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
dab0: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20   */.  Btree *p; 
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dad0: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74       /* Handle t
dae0: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71  o return */.  sq
daf0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
db00: 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20  exOpen = 0;  /* 
db10: 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20  Prevents a race 
db20: 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65  condition. Ticke
db30: 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74  t #3537 */.  int
db40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
db50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
db60: 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
db70: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
db80: 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20  .  u8 nReserve; 
db90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dba0: 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75    /* Byte of unu
dbb0: 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63  sed space on eac
dbc0: 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  h page */.  unsi
dbd0: 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61  gned char zDbHea
dbe0: 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61  der[100];  /* Da
dbf0: 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f  tabase header co
dc00: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 53  ntent */..  /* S
dc10: 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  et the variable 
dc20: 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20  isMemdb to true 
dc30: 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
dc40: 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20   database, or . 
dc50: 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20   ** false for a 
dc60: 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62  file-based datab
dc70: 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c  ase. This symbol
dc80: 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65   is only require
dc90: 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68 65 72  d if.  ** either
dca0: 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d 64   of the shared-d
dcb0: 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63 75 75  ata or autovacuu
dcc0: 6d 20 66 65 61 74 75 72 65 73 20 61 72 65 20 63  m features are c
dcd0: 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e  ompiled .  ** in
dce0: 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a  to the library..
dcf0: 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
dd00: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
dd10: 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c 20 21  ARED_CACHE) || !
dd20: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
dd30: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a  MIT_AUTOVACUUM).
dd40: 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f    #ifdef SQLITE_
dd50: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
dd60: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
dd70: 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65  mdb = 0;.  #else
dd80: 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  .    const int i
dd90: 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61  sMemdb = zFilena
dda0: 6d 65 20 26 26 20 21 73 74 72 63 6d 70 28 7a 46  me && !strcmp(zF
ddb0: 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72  ilename, ":memor
ddc0: 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23  y:");.  #endif.#
ddd0: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
dde0: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
ddf0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
de00: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
de10: 29 20 29 3b 0a 0a 20 20 70 56 66 73 20 3d 20 64  ) );..  pVfs = d
de20: 62 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d 20 73  b->pVfs;.  p = s
de30: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
de40: 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
de50: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
de60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
de70: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  OMEM;.  }.  p->i
de80: 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
de90: 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  ONE;.  p->db = d
dea0: 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
deb0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
dec0: 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42  CHE.  p->lock.pB
ded0: 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c  tree = p;.  p->l
dee0: 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a  ock.iTable = 1;.
def0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
df00: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
df10: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
df20: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
df30: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
df40: 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   /*.  ** If this
df50: 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64   Btree is a cand
df60: 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64  idate for shared
df70: 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66   cache, try to f
df80: 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73  ind an.  ** exis
df90: 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62  ting BtShared ob
dfa0: 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e  ject that we can
dfb0: 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f   share with.  */
dfc0: 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 3d 3d  .  if( isMemdb==
dfd0: 30 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26  0 && zFilename &
dfe0: 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
dff0: 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c 61  {.    if( vfsFla
e000: 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
e010: 5f 53 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a  _SHAREDCACHE ){.
e020: 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50        int nFullP
e030: 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
e040: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
e050: 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50      char *zFullP
e060: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
e070: 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74  3Malloc(nFullPat
e080: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  hname);.      sq
e090: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
e0a0: 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20  exShared;.      
e0b0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
e0c0: 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c  .      if( !zFul
e0d0: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
e0e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
e0f0: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  e(p);.        re
e100: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
e110: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
e120: 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
e130: 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
e140: 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50 61 74  lename, nFullPat
e150: 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
e160: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6d 75 74  name);.      mut
e170: 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33  exOpen = sqlite3
e180: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
e190: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f  E_MUTEX_STATIC_O
e1a0: 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  PEN);.      sqli
e1b0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
e1c0: 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
e1d0: 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20    mutexShared = 
e1e0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
e1f0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
e200: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20  TATIC_MASTER);. 
e210: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
e220: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
e230: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 66 6f 72  ared);.      for
e240: 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68  (pBt=GLOBAL(BtSh
e250: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
e260: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70  redCacheList); p
e270: 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
e280: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  xt){.        ass
e290: 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30  ert( pBt->nRef>0
e2a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
e2b0: 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
e2c0: 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
e2d0: 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
e2e0: 74 2d 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20  t->pPager)).    
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
e300: 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
e310: 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56  pBt->pPager)==pV
e320: 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fs ){.          
e330: 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
e340: 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e     for(iDb=db->n
e350: 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44  Db-1; iDb>=0; iD
e360: 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b--){.          
e370: 20 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69    Btree *pExisti
e380: 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ng = db->aDb[iDb
e390: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  ].pBt;.         
e3a0: 20 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67     if( pExisting
e3b0: 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70   && pExisting->p
e3c0: 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  Bt==pBt ){.     
e3d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e3e0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
e3f0: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
e400: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e410: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
e420: 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  exOpen);.       
e430: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
e440: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
e450: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
e460: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
e470: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
e480: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e490: 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20  ONSTRAINT;.     
e4a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e4b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
e4c0: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
e4d0: 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66         pBt->nRef
e4e0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ++;.          br
e4f0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
e500: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
e510: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
e520: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
e530: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
e540: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
e550: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
e560: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
e570: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
e580: 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65  n debug mode, we
e590: 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73   mark all persis
e5a0: 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61  tent databases a
e5b0: 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20  s sharable.     
e5c0: 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68   ** even when th
e5d0: 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69  ey are not.  Thi
e5e0: 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20  s exercises the 
e5f0: 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64  locking code and
e600: 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20  .      ** gives 
e610: 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79  more opportunity
e620: 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c   for asserts(sql
e630: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
e640: 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  )).      ** stat
e650: 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c  ements to find l
e660: 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e  ocking problems.
e670: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
e680: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
e690: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
e6a0: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
e6b0: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a  Bt==0 ){.    /*.
e6c0: 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
e6d0: 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b  wing asserts mak
e6e0: 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75  e sure that stru
e6f0: 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74  ctures used by t
e700: 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20  he btree are.   
e710: 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69   ** the right si
e720: 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20  ze.  This is to 
e730: 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69  guard against si
e740: 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ze changes that 
e750: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68  result.    ** wh
e760: 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20  en compiling on 
e770: 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68  a different arch
e780: 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  itecture..    */
e790: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
e7a0: 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(i64)==8 || s
e7b0: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b  izeof(i64)==4 );
e7c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
e7d0: 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(u64)==8 || s
e7e0: 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b  izeof(u64)==4 );
e7f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
e800: 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20  eof(u32)==4 );. 
e810: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
e820: 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20  f(u16)==2 );.   
e830: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
e840: 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20  Pgno)==4 );.  . 
e850: 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33     pBt = sqlite3
e860: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
e870: 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20  of(*pBt) );.    
e880: 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
e890: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e8a0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
e8b0: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
e8c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
e8d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
e8e0: 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50  n(pVfs, &pBt->pP
e8f0: 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  ager, zFilename,
e900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e910: 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41             EXTRA
e920: 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66  _SIZE, flags, vf
e930: 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69 6e  sFlags, pageRein
e940: 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  it);.    if( rc=
e950: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e960: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e970: 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
e980: 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  der(pBt->pPager,
e990: 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72  sizeof(zDbHeader
e9a0: 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20  ),zDbHeader);.  
e9b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
e9c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e9d0: 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
e9e0: 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  en_out;.    }.  
e9f0: 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a    pBt->db = db;.
ea00: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
ea10: 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70  SetBusyhandler(p
ea20: 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65  Bt->pPager, btre
ea30: 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
ea40: 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d  er, pBt);.    p-
ea50: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20  >pBt = pBt;.  . 
ea60: 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
ea70: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50  = 0;.    pBt->pP
ea80: 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42  age1 = 0;.    pB
ea90: 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73 71  t->readOnly = sq
eaa0: 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
eab0: 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72  only(pBt->pPager
eac0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
ead0: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
eae0: 20 20 20 70 42 74 2d 3e 73 65 63 75 72 65 44 65     pBt->secureDe
eaf0: 6c 65 74 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66  lete = 1;.#endif
eb00: 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
eb10: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 7a  ze = get2byte(&z
eb20: 44 62 48 65 61 64 65 72 5b 31 36 5d 29 3b 0a 20  DbHeader[16]);. 
eb30: 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65     if( pBt->page
eb40: 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d  Size<512 || pBt-
eb50: 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  >pageSize>SQLITE
eb60: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20  _MAX_PAGE_SIZE. 
eb70: 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74          || ((pBt
eb80: 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42  ->pageSize-1)&pB
eb90: 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20  t->pageSize)!=0 
eba0: 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  ){.      pBt->pa
ebb0: 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e  geSize = 0;.#ifn
ebc0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ebd0: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
ebe0: 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63   /* If the magic
ebf0: 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22   name ":memory:"
ec00: 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20   will create an 
ec10: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
ec20: 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  se, then.      *
ec30: 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f  * leave the auto
ec40: 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30  Vacuum mode at 0
ec50: 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61   (do not auto-va
ec60: 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20  cuum), even if. 
ec70: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44       ** SQLITE_D
ec80: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
ec90: 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68  M is true. On th
eca0: 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
ecb0: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
ecc0: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68  _OMIT_MEMORYDB h
ecd0: 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c  as been defined,
ece0: 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22   then ":memory:"
ecf0: 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20   is just a.     
ed00: 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65   ** regular file
ed10: 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63  -name. In this c
ed20: 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ase the auto-vac
ed30: 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70  uum applies as p
ed40: 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20  er normal..     
ed50: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46   */.      if( zF
ed60: 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65  ilename && !isMe
ed70: 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70  mdb ){.        p
ed80: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
ed90: 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
eda0: 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20  _AUTOVACUUM ? 1 
edb0: 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42  : 0);.        pB
edc0: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
edd0: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
ede0: 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20  AUTOVACUUM==2 ? 
edf0: 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  1 : 0);.      }.
ee00: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65  #endif.      nRe
ee10: 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d  serve = 0;.    }
ee20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73  else{.      nRes
ee30: 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72  erve = zDbHeader
ee40: 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d  [20];.      pBt-
ee50: 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
ee60: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
ee70: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
ee80: 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75  UM.      pBt->au
ee90: 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
eea0: 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
eeb0: 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
eec0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  .      pBt->incr
eed0: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
eee0: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
eef0: 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
ef00: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
ef10: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
ef20: 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
ef30: 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
ef40: 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72  pageSize, nReser
ef50: 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ve);.    if( rc 
ef60: 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65  ) goto btree_ope
ef70: 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e  n_out;.    pBt->
ef80: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
ef90: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65  ->pageSize - nRe
efa0: 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72  serve;.    asser
efb0: 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  t( (pBt->pageSiz
efc0: 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a  e & 7)==0 );  /*
efd0: 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e   8-byte alignmen
efe0: 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f  t of pageSize */
eff0: 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65  .   .#if !define
f000: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
f010: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
f020: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
f030: 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20  MIT_DISKIO).    
f040: 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42  /* Add the new B
f050: 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
f060: 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
f070: 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61  t sharable BtSha
f080: 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  reds..    */.   
f090: 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
f0a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f0b0: 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
f0c0: 61 72 65 64 3b 0a 20 20 20 20 20 20 70 42 74 2d  ared;.      pBt-
f0d0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20  >nRef = 1;.     
f0e0: 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
f0f0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
f100: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
f110: 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20  ATIC_MASTER);.  
f120: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
f130: 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c  HREADSAFE && sql
f140: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
f150: 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20  .bCoreMutex ){. 
f160: 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65         pBt->mute
f170: 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  x = sqlite3Mutex
f180: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
f190: 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20  EX_FAST);.      
f1a0: 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78    if( pBt->mutex
f1b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
f1c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
f1d0: 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  EM;.          db
f1e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
f1f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   0;.          go
f200: 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
f210: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
f220: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
f230: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
f240: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
f250: 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20     pBt->pNext = 
f260: 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
f270: 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
f280: 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  cheList);.      
f290: 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
f2a0: 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
f2b0: 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a  cheList) = pBt;.
f2c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
f2d0: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
f2e0: 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65  hared);.    }.#e
f2f0: 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64  ndif.  }..#if !d
f300: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
f310: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
f320: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
f330: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
f340: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77  .  /* If the new
f350: 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68   Btree uses a sh
f360: 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64  arable pBtShared
f370: 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20  , then link the 
f380: 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69  new.  ** Btree i
f390: 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20  nto the list of 
f3a0: 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72  all sharable Btr
f3b0: 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65  ees for the same
f3c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a   connection..  *
f3d0: 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65  * The list is ke
f3e0: 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  pt in ascending 
f3f0: 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64  order by pBt add
f400: 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ress..  */.  if(
f410: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
f420: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42      int i;.    B
f430: 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20  tree *pSib;.    
f440: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
f450: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
f460: 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e  if( (pSib = db->
f470: 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26  aDb[i].pBt)!=0 &
f480: 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65  & pSib->sharable
f490: 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
f4a0: 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29  e( pSib->pPrev )
f4b0: 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70  { pSib = pSib->p
f4c0: 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20  Prev; }.        
f4d0: 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d  if( p->pBt<pSib-
f4e0: 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
f4f0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
f500: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  b;.          p->
f510: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20  pPrev = 0;.     
f520: 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76       pSib->pPrev
f530: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65   = p;.        }e
f540: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77  lse{.          w
f550: 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78  hile( pSib->pNex
f560: 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74  t && pSib->pNext
f570: 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a  ->pBt<p->pBt ){.
f580: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62              pSib
f590: 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
f5a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
f5b0: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
f5c0: 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
f5d0: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
f5e0: 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
f5f0: 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20     if( p->pNext 
f600: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
f610: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
f620: 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   p;.          }.
f630: 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
f640: 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  pNext = p;.     
f650: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
f660: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
f670: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a  }.  }.#endif.  *
f680: 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74  ppBtree = p;..bt
f690: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20  ree_open_out:.  
f6a0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f6b0: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74  K ){.    if( pBt
f6c0: 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20   && pBt->pPager 
f6d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
f6e0: 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
f6f0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
f700: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
f710: 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
f720: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a  3_free(p);.    *
f730: 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d  ppBtree = 0;.  }
f740: 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e  .  if( mutexOpen
f750: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
f760: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
f770: 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b  ld(mutexOpen) );
f780: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
f790: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70  ex_leave(mutexOp
f7a0: 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  en);.  }.  retur
f7b0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
f7c0: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53  ecrement the BtS
f7d0: 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
f7e0: 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61  er.  When it rea
f7f0: 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65  ches zero,.** re
f800: 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65  move the BtShare
f810: 64 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d  d structure from
f820: 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73   the sharing lis
f830: 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72  t.  Return.** tr
f840: 75 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72  ue if the BtShar
f850: 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20  ed.nRef counter 
f860: 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64  reaches zero and
f870: 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65   return.** false
f880: 20 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20   if it is still 
f890: 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61  positive..*/.sta
f8a0: 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72  tic int removeFr
f8b0: 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74  omSharingList(Bt
f8c0: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69  Shared *pBt){.#i
f8d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f8e0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
f8f0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
f900: 70 4d 61 73 74 65 72 3b 0a 20 20 42 74 53 68 61  pMaster;.  BtSha
f910: 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e  red *pList;.  in
f920: 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a  t removed = 0;..
f930: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
f940: 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28  3_mutex_notheld(
f950: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
f960: 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   pMaster = sqlit
f970: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
f980: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
f990: 5f 4d 41 53 54 45 52 29 3b 0a 20 20 73 71 6c 69  _MASTER);.  sqli
f9a0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
f9b0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d  pMaster);.  pBt-
f9c0: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
f9d0: 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20  Bt->nRef<=0 ){. 
f9e0: 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74     if( GLOBAL(Bt
f9f0: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
fa00: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d  haredCacheList)=
fa10: 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c  =pBt ){.      GL
fa20: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
fa30: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
fa40: 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e  eList) = pBt->pN
fa50: 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
fa60: 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c        pList = GL
fa70: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
fa80: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
fa90: 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68  eList);.      wh
faa0: 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73  ile( ALWAYS(pLis
fab0: 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65  t) && pList->pNe
fac0: 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  xt!=pBt ){.     
fad0: 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e     pList=pList->
fae0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
faf0: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
fb00: 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pList) ){.      
fb10: 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d    pList->pNext =
fb20: 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
fb30: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
fb40: 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
fb50: 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71  SAFE ){.      sq
fb60: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
fb70: 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  (pBt->mutex);.  
fb80: 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20    }.    removed 
fb90: 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 1;.  }.  sqlit
fba0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
fbb0: 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
fbc0: 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65  n removed;.#else
fbd0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
fbe0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  dif.}../*.** Mak
fbf0: 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70  e sure pBt->pTmp
fc00: 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20  Space points to 
fc10: 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66  an allocation of
fc20: 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a   .** MX_CELL_SIZ
fc30: 45 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f  E(pBt) bytes..*/
fc40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c  .static void all
fc50: 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42  ocateTempSpace(B
fc60: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
fc70: 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53   if( !pBt->pTmpS
fc80: 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d  pace ){.    pBt-
fc90: 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c  >pTmpSpace = sql
fca0: 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20  ite3PageMalloc( 
fcb0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
fcc0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
fcd0: 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70  ee the pBt->pTmp
fce0: 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  Space allocation
fcf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
fd00: 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74  freeTempSpace(Bt
fd10: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
fd20: 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
fd30: 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29   pBt->pTmpSpace)
fd40: 3b 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ;.  pBt->pTmpSpa
fd50: 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ce = 0;.}../*.**
fd60: 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64   Close an open d
fd70: 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61  atabase and inva
fd80: 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f  lidate all curso
fd90: 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
fda0: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72  e3BtreeClose(Btr
fdb0: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
fdc0: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
fdd0: 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
fde0: 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  ur;..  /* Close 
fdf0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
fe00: 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64  ed via this hand
fe10: 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  le.  */.  assert
fe20: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
fe30: 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
fe40: 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
fe50: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
fe60: 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72  pCur = pBt->pCur
fe70: 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43  sor;.  while( pC
fe80: 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73  ur ){.    BtCurs
fe90: 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b  or *pTmp = pCur;
fea0: 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72  .    pCur = pCur
feb0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28  ->pNext;.    if(
fec0: 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70   pTmp->pBtree==p
fed0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
fee0: 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
fef0: 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  r(pTmp);.    }. 
ff00: 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63   }..  /* Rollbac
ff10: 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61  k any active tra
ff20: 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65  nsaction and fre
ff30: 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72  e the handle str
ff40: 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65  ucture..  ** The
ff50: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
ff60: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20  BtreeRollback() 
ff70: 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d  drops any table-
ff80: 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20  locks held by.  
ff90: 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a  ** this handle..
ffa0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74    */.  sqlite3Bt
ffb0: 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a  reeRollback(p);.
ffc0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
ffd0: 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ave(p);..  /* If
ffe0: 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c   there are still
fff0: 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69   other outstandi
10000 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
10010 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
10020 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65  e.  ** structure
10030 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68  , return now. Th
10040 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
10050 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c  his procedure cl
10060 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68  eans .  ** up th
10070 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a  e shared-btree..
10080 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
10090 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
100a0 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  && p->locked==0 
100b0 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  );.  if( !p->sha
100c0 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46  rable || removeF
100d0 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70  romSharingList(p
100e0 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Bt) ){.    /* Th
100f0 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  e pBt is no long
10100 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e  er on the sharin
10110 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61  g list, so we ca
10120 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20  n access.    ** 
10130 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  it without havin
10140 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75  g to hold the mu
10150 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  tex..    **.    
10160 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64  ** Clean out and
10170 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53 68   delete the BtSh
10180 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20  ared object..   
10190 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
101a0 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
101b0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
101c0 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
101d0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  er);.    if( pBt
101e0 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26  ->xFreeSchema &&
101f0 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b   pBt->pSchema ){
10200 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65  .      pBt->xFre
10210 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63  eSchema(pBt->pSc
10220 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hema);.    }.   
10230 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
10240 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
10250 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
10260 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
10270 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a  _free(pBt);.  }.
10280 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10290 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
102a0 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  E.  assert( p->w
102b0 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  antToLock==0 );.
102c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
102d0 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
102e0 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50  p->pPrev ) p->pP
102f0 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
10300 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e  pNext;.  if( p->
10310 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74  pNext ) p->pNext
10320 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
10330 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71  ev;.#endif..  sq
10340 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
10350 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10360 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
10370 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20  ge the limit on 
10380 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
10390 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74  ges allowed in t
103a0 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
103b0 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  The maximum numb
103c0 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65  er of cache page
103d0 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  s is set to the 
103e0 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75  absolute.** valu
103f0 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66  e of mxPage.  If
10400 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74   mxPage is negat
10410 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  ive, the pager w
10420 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61  ill.** operate a
10430 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20  synchronously - 
10440 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70  it will not stop
10450 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a   to do fsync()s.
10460 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74  ** to insure dat
10470 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
10480 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65  the disk surface
10490 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69   before.** conti
104a0 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74  nuing.  Transact
104b0 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20  ions still work 
104c0 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  if synchronous i
104d0 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68  s off,.** and th
104e0 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
104f0 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69  t be corrupted i
10500 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a  f this program.*
10510 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20  * crashes.  But 
10520 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  if the operating
10530 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20   system crashes 
10540 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  or there is.** a
10550 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66  n abrupt power f
10560 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63  ailure when sync
10570 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20  hronous is off, 
10580 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
10590 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e  could be left in
105a0 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
105b0 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62   and unrecoverab
105c0 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e  le state..** Syn
105d0 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62  chronous is on b
105e0 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74  y default so dat
105f0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
10600 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61   is not.** norma
10610 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a  lly a worry..*/.
10620 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
10630 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72  SetCacheSize(Btr
10640 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
10650 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
10660 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
10670 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
10680 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
10690 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
106a0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
106b0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
106c0 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
106d0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
106e0 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
106f0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
10700 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10710 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
10720 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73   the way data is
10730 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
10740 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72  in order to incr
10750 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65  ease or decrease
10760 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65  .** how well the
10770 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74   database resist
10780 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  s damage due to 
10790 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70  OS crashes and p
107a0 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73  ower.** failures
107b0 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68  .  Level 1 is th
107c0 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68  e same as asynch
107d0 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73  ronous (no syncs
107e0 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20  () occur and.** 
107f0 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20  there is a high 
10800 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
10810 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20  amage)  Level 2 
10820 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  is the default. 
10830 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76   There.** is a v
10840 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d  ery low but non-
10850 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79  zero probability
10860 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76   of damage.  Lev
10870 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65  el 3 reduces the
10880 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20  .** probability 
10890 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61  of damage to nea
108a0 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20  r zero but with 
108b0 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61  a write performa
108c0 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a  nce reduction..*
108d0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
108e0 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
108f0 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  MAS.int sqlite3B
10900 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76  treeSetSafetyLev
10910 65 6c 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  el(Btree *p, int
10920 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c   level, int full
10930 53 79 6e 63 29 7b 0a 20 20 42 74 53 68 61 72 65  Sync){.  BtShare
10940 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
10950 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10960 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
10970 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
10980 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
10990 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
109a0 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
109b0 76 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  vel(pBt->pPager,
109c0 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63   level, fullSync
109d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
109e0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
109f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10a00 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
10a10 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
10a20 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73  e given btree is
10a30 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c   set to safety l
10a40 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65  evel 1.  In othe
10a50 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75  r.** words, retu
10a60 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79  rn TRUE if no sy
10a70 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74  nc() occurs on t
10a80 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a  he disk files..*
10a90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
10aa0 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42  eeSyncDisabled(B
10ab0 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
10ac0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
10ad0 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Bt;.  int rc;.  
10ae0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
10af0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
10b00 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20  ->mutex) );  .  
10b10 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
10b20 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
10b30 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
10b40 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  er );.  rc = sql
10b50 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28  ite3PagerNosync(
10b60 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
10b70 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
10b80 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
10b90 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  c;.}..#if !defin
10ba0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
10bb0 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c  AGER_PRAGMAS) ||
10bc0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
10bd0 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a  _OMIT_VACUUM)./*
10be0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64  .** Change the d
10bf0 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a  efault pages siz
10c00 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  e and the number
10c10 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
10c20 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20  es per page..** 
10c30 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  Or, if the page 
10c40 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79  size has already
10c50 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74   been fixed, ret
10c60 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
10c70 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20  NLY .** without 
10c80 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e  changing anythin
10c90 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  g..**.** The pag
10ca0 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61  e size must be a
10cb0 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77   power of 2 betw
10cc0 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33  een 512 and 6553
10cd0 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 0a  6.  If the page.
10ce0 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64  ** size supplied
10cf0 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74   does not meet t
10d00 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  his constraint t
10d10 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a  hen the page siz
10d20 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e  e is not.** chan
10d30 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20  ged..**.** Page 
10d40 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72  sizes are constr
10d50 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f  ained to be a po
10d60 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68  wer of two so th
10d70 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a  at the region.**
10d80 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
10d90 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c   file used for l
10da0 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e  ocking (beginnin
10db0 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54  g at PENDING_BYT
10dc0 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  E,.** the first 
10dd0 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31 47  byte past the 1G
10de0 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30  B boundary, 0x40
10df0 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f  000000) needs to
10e00 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65   occur.** at the
10e10 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
10e20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  page..**.** If p
10e30 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76  arameter nReserv
10e40 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  e is less than z
10e50 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ero, then the nu
10e60 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
10e70 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70 61  .** bytes per pa
10e80 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  ge is left uncha
10e90 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  nged..**.** If t
10ea0 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20  he iFix!=0 then 
10eb0 74 68 65 20 70 61 67 65 53 69 7a 65 46 69 78 65  the pageSizeFixe
10ec0 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f  d flag is set so
10ed0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 73   that the page s
10ee0 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76  ize.** and autov
10ef0 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e  acuum mode can n
10f00 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e  o longer be chan
10f10 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
10f20 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
10f30 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
10f40 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20  t pageSize, int 
10f50 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46  nReserve, int iF
10f60 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ix){.  int rc = 
10f70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53  SQLITE_OK;.  BtS
10f80 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
10f90 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  pBt;.  assert( n
10fa0 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e  Reserve>=-1 && n
10fb0 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
10fc0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
10fd0 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42  ter(p);.  if( pB
10fe0 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
10ff0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
11000 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
11010 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11020 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
11030 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
11040 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d  {.    nReserve =
11050 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
11060 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
11070 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
11080 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
11090 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
110a0 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d    if( pageSize>=
110b0 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
110c0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
110d0 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20  _SIZE &&.       
110e0 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
110f0 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20  ageSize)==0 ){. 
11100 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
11110 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
11120 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
11130 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42 74  ->pPage1 && !pBt
11140 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
11150 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
11160 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a   (u16)pageSize;.
11170 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
11180 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63  e(pBt);.  }.  rc
11190 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
111a0 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
111b0 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
111c0 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
111d0 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  );.  pBt->usable
111e0 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
111f0 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73  Size - (u16)nRes
11200 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78  erve;.  if( iFix
11210 20 29 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   ) pBt->pageSize
11220 46 69 78 65 64 20 3d 20 31 3b 0a 20 20 73 71 6c  Fixed = 1;.  sql
11230 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
11240 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
11250 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11260 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65  the currently de
11270 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a  fined page size.
11280 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11290 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42  reeGetPageSize(B
112a0 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
112b0 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53  rn p->pBt->pageS
112c0 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ize;.}../*.** Re
112d0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
112e0 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
112f0 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
11300 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 0a  every page that.
11310 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c  ** are intentual
11320 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20  ly left unused. 
11330 20 54 68 69 73 20 69 73 20 74 68 65 20 22 72 65   This is the "re
11340 73 65 72 76 65 64 22 20 73 70 61 63 65 20 74 68  served" space th
11350 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d  at is.** sometim
11360 65 73 20 75 73 65 64 20 62 79 20 65 78 74 65 6e  es used by exten
11370 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  sions..*/.int sq
11380 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
11390 65 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  erve(Btree *p){.
113a0 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
113b0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
113c0 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70  .  n = p->pBt->p
113d0 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74  ageSize - p->pBt
113e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
113f0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11400 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
11410 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
11420 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
11430 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61  count for a data
11440 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69  base if mxPage i
11450 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e  s positive..** N
11460 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
11470 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  de if mxPage is 
11480 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a  0 or negative..*
11490 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
114a0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  the value of mxP
114b0 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
114c0 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
114d0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
114e0 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f  e3BtreeMaxPageCo
114f0 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  unt(Btree *p, in
11500 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74  t mxPage){.  int
11510 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
11520 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
11530 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  = sqlite3PagerMa
11540 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42  xPageCount(p->pB
11550 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
11560 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
11570 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
11580 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
11590 20 53 65 74 20 74 68 65 20 73 65 63 75 72 65 44   Set the secureD
115a0 65 6c 65 74 65 20 66 6c 61 67 20 69 66 20 6e 65  elete flag if ne
115b0 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20 31 2e  wFlag is 0 or 1.
115c0 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69 73 20    If newFlag is 
115d0 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65  -1,.** then make
115e0 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20 41 6c   no changes.  Al
115f0 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 20  ways return the 
11600 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 65 63  value of the sec
11610 75 72 65 44 65 6c 65 74 65 0a 2a 2a 20 73 65 74  ureDelete.** set
11620 74 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 63  ting after the c
11630 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  hange..*/.int sq
11640 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65  lite3BtreeSecure
11650 44 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c  Delete(Btree *p,
11660 20 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20   int newFlag){. 
11670 20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d   int b;.  if( p=
11680 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
11690 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
116a0 65 72 28 70 29 3b 0a 20 20 69 66 28 20 6e 65 77  er(p);.  if( new
116b0 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70  Flag>=0 ){.    p
116c0 2d 3e 70 42 74 2d 3e 73 65 63 75 72 65 44 65 6c  ->pBt->secureDel
116d0 65 74 65 20 3d 20 28 6e 65 77 46 6c 61 67 21 3d  ete = (newFlag!=
116e0 30 29 20 3f 20 31 20 3a 20 30 3b 0a 20 20 7d 20  0) ? 1 : 0;.  } 
116f0 0a 20 20 62 20 3d 20 70 2d 3e 70 42 74 2d 3e 73  .  b = p->pBt->s
11700 65 63 75 72 65 44 65 6c 65 74 65 3b 0a 20 20 73  ecureDelete;.  s
11710 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
11720 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b  (p);.  return b;
11730 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
11740 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
11750 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
11760 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
11770 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
11780 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
11790 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  e the 'auto-vacu
117a0 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20  um' property of 
117b0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
117c0 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d   the 'autoVacuum
117d0 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  '.** parameter i
117e0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
117f0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
11800 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66  e is enabled. If
11810 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20   zero, it.** is 
11820 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65  disabled. The de
11830 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
11840 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
11850 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20  property is .** 
11860 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
11870 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
11880 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72  _AUTOVACUUM macr
11890 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
118a0 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63  3BtreeSetAutoVac
118b0 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  uum(Btree *p, in
118c0 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23  t autoVacuum){.#
118d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
118e0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
118f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
11900 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42  DONLY;.#else.  B
11910 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
11920 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
11930 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
11940 38 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56  8 av = (u8)autoV
11950 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65  acuum;..  sqlite
11960 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
11970 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
11980 69 7a 65 46 69 78 65 64 20 26 26 20 28 61 76 20  izeFixed && (av 
11990 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f  ?1:0)!=pBt->auto
119a0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
119b0 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
119c0 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LY;.  }else{.   
119d0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
119e0 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20   = av ?1:0;.    
119f0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
11a00 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20  = av==2 ?1:0;.  
11a10 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
11a20 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
11a30 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
11a40 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
11a50 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27  e value of the '
11a60 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
11a70 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76  perty. If auto-v
11a80 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61  acuum is .** ena
11a90 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e  bled 1 is return
11aa0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e  ed. Otherwise 0.
11ab0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
11ac0 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75  treeGetAutoVacuu
11ad0 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66  m(Btree *p){.#if
11ae0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11af0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
11b00 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41  urn BTREE_AUTOVA
11b10 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65  CUUM_NONE;.#else
11b20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
11b30 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
11b40 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20  );.  rc = (.    
11b50 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  (!p->pBt->autoVa
11b60 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
11b70 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20  VACUUM_NONE:.   
11b80 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56   (!p->pBt->incrV
11b90 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
11ba0 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20  OVACUUM_FULL:.  
11bb0 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55    BTREE_AUTOVACU
11bc0 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73  UM_INCR.  );.  s
11bd0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
11be0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
11bf0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
11c00 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e  ** Get a referen
11c10 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20  ce to pPage1 of 
11c20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11c30 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a  e.  This will.**
11c40 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20   also acquire a 
11c50 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  readlock on that
11c60 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   file..**.** SQL
11c70 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
11c80 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
11c90 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  If the file is n
11ca0 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72  ot a.** well-for
11cb0 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
11cc0 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43  e, then SQLITE_C
11cd0 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e  ORRUPT is return
11ce0 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed..** SQLITE_BU
11cf0 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  SY is returned i
11d00 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
11d10 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54  s locked.  SQLIT
11d20 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65  E_NOMEM.** is re
11d30 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e  turned if we run
11d40 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20   out of memory. 
11d50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
11d60 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72 65  ockBtree(BtShare
11d70 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
11d80 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
11d90 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
11da0 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
11db0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
11dc0 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61  Page1;     /* Pa
11dd0 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
11de0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
11df0 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
11e00 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11e10 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
11e20 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
11e30 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20  nPageFile = 0;  
11e40 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
11e50 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
11e60 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
11e70 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20  t nPageHeader;  
11e80 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11e90 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
11ea0 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20  abase according 
11eb0 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73  to hdr */..  ass
11ec0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
11ed0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
11ee0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
11ef0 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
11f00 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
11f10 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b  3PagerSharedLock
11f20 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
11f30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11f40 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
11f50 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
11f60 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
11f70 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ge1, 0);.  if( r
11f80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
11f90 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
11fa0 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67  Do some checking
11fb0 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20   to help insure 
11fc0 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e  the file we open
11fd0 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a  ed really is.  *
11fe0 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61  * a valid databa
11ff0 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20  se file. .  */. 
12000 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65   nPage = nPageHe
12010 61 64 65 72 20 3d 20 67 65 74 34 62 79 74 65 28  ader = get4byte(
12020 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  28+(u8*)pPage1->
12030 61 44 61 74 61 29 3b 0a 20 20 69 66 28 20 28 72  aData);.  if( (r
12040 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
12050 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
12060 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c  Pager, &nPageFil
12070 65 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  e))!=SQLITE_OK )
12080 7b 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65  {;.    goto page
12090 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
120a0 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d   }.  if( nPage==
120b0 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d  0 ){.    nPage =
120c0 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a   nPageFile;.  }.
120d0 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b    if( nPage>0 ){
120e0 0a 20 20 20 20 69 6e 74 20 70 61 67 65 53 69 7a  .    int pageSiz
120f0 65 3b 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c  e;.    int usabl
12100 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70  eSize;.    u8 *p
12110 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61  age1 = pPage1->a
12120 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53  Data;.    rc = S
12130 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
12140 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67    if( memcmp(pag
12150 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  e1, zMagicHeader
12160 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 16)!=0 ){.    
12170 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
12180 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
12190 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
121a0 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>1 ){.      pBt
121b0 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
121c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
121d0 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20  ge1[19]>1 ){.   
121e0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
121f0 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
12200 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78  ..    /* The max
12210 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 66 72  imum embedded fr
12220 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 65  action must be e
12230 78 61 63 74 6c 79 20 32 35 25 2e 20 20 41 6e 64  xactly 25%.  And
12240 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20   the minimum.   
12250 20 2a 2a 20 65 6d 62 65 64 64 65 64 20 66 72 61   ** embedded fra
12260 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 31 32  ction must be 12
12270 2e 35 25 20 66 6f 72 20 62 6f 74 68 20 6c 65 61  .5% for both lea
12280 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c  f-data and non-l
12290 65 61 66 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a  eaf-data..    **
122a0 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65   The original de
122b0 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65  sign allowed the
122c0 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61  se amounts to va
122d0 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20  ry, but as of.  
122e0 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36    ** version 3.6
122f0 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74  .0, we require t
12300 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e  hem to be fixed.
12310 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
12320 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31  memcmp(&page1[21
12330 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30  ], "\100\040\040
12340 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ",3)!=0 ){.     
12350 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
12360 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
12370 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 67 65     pageSize = ge
12380 74 32 62 79 74 65 28 26 70 61 67 65 31 5b 31 36  t2byte(&page1[16
12390 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61  ]);.    if( ((pa
123a0 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
123b0 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67 65 53 69  ze)!=0 || pageSi
123c0 7a 65 3c 35 31 32 20 7c 7c 0a 20 20 20 20 20 20  ze<512 ||.      
123d0 20 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41    (SQLITE_MAX_PA
123e0 47 45 5f 53 49 5a 45 3c 33 32 37 36 38 20 26 26  GE_SIZE<32768 &&
123f0 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45   pageSize>SQLITE
12400 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 0a  _MAX_PAGE_SIZE).
12410 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
12420 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
12430 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  led;.    }.    a
12440 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
12450 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
12460 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67  usableSize = pag
12470 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30  eSize - page1[20
12480 5d 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 53  ];.    if( pageS
12490 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize!=pBt->pageSi
124a0 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  ze ){.      /* A
124b0 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68 65  fter reading the
124c0 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
124d0 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 75  he database assu
124e0 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65  ming a page size
124f0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53  .      ** of BtS
12500 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20  hared.pageSize, 
12510 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65 72  we have discover
12520 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
12530 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a  -size is.      *
12540 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53  * actually pageS
12550 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20  ize. Unlock the 
12560 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20  database, leave 
12570 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20  pBt->pPage1 at. 
12580 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64       ** zero and
12590 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
125a0 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  K. The caller wi
125b0 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  ll call this fun
125c0 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61  ction.      ** a
125d0 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f  gain with the co
125e0 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e  rrect page-size.
125f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
12600 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
12610 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e1);.      pBt->
12620 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 28 75 31  usableSize = (u1
12630 36 29 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  6)usableSize;.  
12640 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
12650 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a  e = (u16)pageSiz
12660 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d  e;.      freeTem
12670 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
12680 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
12690 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
126a0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
126b0 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  t->pageSize,.   
126c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126e0 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53  pageSize-usableS
126f0 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ize);.      retu
12700 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
12710 20 69 66 28 20 6e 50 61 67 65 48 65 61 64 65 72   if( nPageHeader
12720 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20  >nPageFile ){.  
12730 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12740 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
12750 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
12760 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
12770 7d 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65  }.    if( usable
12780 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20  Size<480 ){.    
12790 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
127a0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
127b0 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
127c0 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a  e = (u16)pageSiz
127d0 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62  e;.    pBt->usab
127e0 6c 65 53 69 7a 65 20 3d 20 28 75 31 36 29 75 73  leSize = (u16)us
127f0 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65  ableSize;.#ifnde
12800 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
12810 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74  TOVACUUM.    pBt
12820 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
12830 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
12840 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
12850 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
12860 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
12870 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34  (&page1[36 + 7*4
12880 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
12890 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63    }..  /* maxLoc
128a0 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  al is the maximu
128b0 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
128c0 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  oad to store loc
128d0 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20  ally for.  ** a 
128e0 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65  cell.  Make sure
128f0 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f   it is small eno
12900 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c  ugh so that at l
12910 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20  east minFanout. 
12920 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69   ** cells can wi
12930 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61  ll fit on one pa
12940 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61  ge.  We assume a
12950 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65   10-byte page he
12960 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64  ader..  ** Besid
12970 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20  es the payload, 
12980 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74  the cell must st
12990 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d  ore:.  **     2-
129a0 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  byte pointer to 
129b0 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20  the cell.  **   
129c0 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70    4-byte child p
129d0 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20  ointer.  **     
129e0 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75  9-byte nKey valu
129f0 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
12a00 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20  e nData value.  
12a10 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76  **     4-byte ov
12a20 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
12a30 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65  ter.  ** So a ce
12a40 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ll consists of a
12a50 20 32 2d 62 79 74 65 20 70 6f 69 6e 65 72 2c 20   2-byte poiner, 
12a60 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69  a header which i
12a70 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a  s as much as.  *
12a80 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c  * 17 bytes long,
12a90 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66   0 to N bytes of
12aa0 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e   payload, and an
12ab0 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65   optional 4 byte
12ac0 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70   overflow.  ** p
12ad0 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a  age pointer..  *
12ae0 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  /.  pBt->maxLoca
12af0 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  l = (pBt->usable
12b00 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20  Size-12)*64/255 
12b10 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e  - 23;.  pBt->min
12b20 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73  Local = (pBt->us
12b30 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f  ableSize-12)*32/
12b40 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d  255 - 23;.  pBt-
12b50 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42 74 2d 3e  >maxLeaf = pBt->
12b60 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 3b  usableSize - 35;
12b70 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20  .  pBt->minLeaf 
12b80 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
12b90 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
12ba0 32 33 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  23;.  assert( pB
12bb0 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
12bc0 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
12bd0 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
12be0 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
12bf0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
12c00 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
12c10 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31  QLITE_OK;..page1
12c20 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20  _init_failed:.  
12c30 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
12c40 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  e1);.  pBt->pPag
12c50 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e1 = 0;.  return
12c60 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
12c70 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
12c80 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72  tstanding cursor
12c90 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74  s and we are not
12ca0 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a   in the middle.*
12cb0 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  * of a transacti
12cc0 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20  on but there is 
12cd0 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  a read lock on t
12ce0 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  he database, the
12cf0 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
12d00 65 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72  e unrefs the fir
12d10 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
12d20 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69  atabase file whi
12d30 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65  ch .** has the e
12d40 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69  ffect of releasi
12d50 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  ng the read lock
12d60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
12d70 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
12d80 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74  n in progress, t
12d90 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
12da0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
12db0 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72  c void unlockBtr
12dc0 65 65 49 66 55 6e 75 73 65 64 28 42 74 53 68 61  eeIfUnused(BtSha
12dd0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73  red *pBt){.  ass
12de0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
12df0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
12e00 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
12e10 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30   pBt->pCursor==0
12e20 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   || pBt->inTrans
12e30 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e  action>TRANS_NON
12e40 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  E );.  if( pBt->
12e50 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
12e60 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74  RANS_NONE && pBt
12e70 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20  ->pPage1!=0 ){. 
12e80 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
12e90 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
12ea0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
12eb0 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
12ec0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  t(pBt->pPager)==
12ed0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
12ee0 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
12ef0 61 74 61 20 29 3b 0a 20 20 20 20 72 65 6c 65 61  ata );.    relea
12f00 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67  sePage(pBt->pPag
12f10 65 31 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50  e1);.    pBt->pP
12f20 61 67 65 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  age1 = 0;.  }.}.
12f30 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f  ./*.** If pBt po
12f40 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79  ints to an empty
12f50 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65   file then conve
12f60 72 74 20 74 68 61 74 20 65 6d 70 74 79 20 66 69  rt that empty fi
12f70 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77  le.** into a new
12f80 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20   empty database 
12f90 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
12fa0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
12fb0 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  f.** the databas
12fc0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
12fd0 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53   newDatabase(BtS
12fe0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
12ff0 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75  emPage *pP1;.  u
13000 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
13010 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ta;.  int rc;.. 
13020 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13030 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
13040 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
13050 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b   pBt->nPage>0 ){
13060 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13070 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31  TE_OK;.  }.  pP1
13080 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
13090 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30    assert( pP1!=0
130a0 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31   );.  data = pP1
130b0 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20  ->aData;.  rc = 
130c0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
130d0 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b  e(pP1->pDbPage);
130e0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
130f0 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28  rn rc;.  memcpy(
13100 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64  data, zMagicHead
13110 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  er, sizeof(zMagi
13120 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73  cHeader));.  ass
13130 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67  ert( sizeof(zMag
13140 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b  icHeader)==16 );
13150 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
13160 61 5b 31 36 5d 2c 20 70 42 74 2d 3e 70 61 67 65  a[16], pBt->page
13170 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 31 38  Size);.  data[18
13180 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39  ] = 1;.  data[19
13190 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  ] = 1;.  assert(
131a0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
131b0 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
131c0 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  && pBt->usableSi
131d0 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67  ze+255>=pBt->pag
131e0 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
131f0 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70  0] = (u8)(pBt->p
13200 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
13210 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61  sableSize);.  da
13220 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64  ta[21] = 64;.  d
13230 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20  ata[22] = 32;.  
13240 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20  data[23] = 32;. 
13250 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34   memset(&data[24
13260 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20  ], 0, 100-24);. 
13270 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50   zeroPage(pP1, P
13280 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
13290 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20  AF|PTF_LEAFDATA 
132a0 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53 69  );.  pBt->pageSi
132b0 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66  zeFixed = 1;.#if
132c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
132d0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73  _AUTOVACUUM.  as
132e0 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
132f0 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
13300 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29  >autoVacuum==0 )
13310 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
13320 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c  >incrVacuum==1 |
13330 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  | pBt->incrVacuu
13340 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79  m==0 );.  put4by
13350 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a  te(&data[36 + 4*
13360 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  4], pBt->autoVac
13370 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  uum);.  put4byte
13380 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d  (&data[36 + 7*4]
13390 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  , pBt->incrVacuu
133a0 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74  m);.#endif.  pBt
133b0 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64  ->nPage = 1;.  d
133c0 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72  ata[31] = 1;.  r
133d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
133e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
133f0 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77  t to start a new
13400 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20   transaction. A 
13410 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
13420 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20  n.** is started 
13430 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
13440 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72  gument is nonzer
13450 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20 72  o, otherwise a r
13460 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ead-.** transact
13470 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63  ion.  If the sec
13480 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
13490 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78  2 or more and ex
134a0 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73  clusive.** trans
134b0 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65  action is starte
134c0 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  d, meaning that 
134d0 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  no other process
134e0 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74   is allowed.** t
134f0 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
13500 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78 69  abase.  A preexi
13510 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f  sting transactio
13520 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20  n may not be.** 
13530 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c  upgraded to excl
13540 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67  usive by calling
13550 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20   this routine a 
13560 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68  second time - th
13570 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79  e.** exclusivity
13580 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73   flag only works
13590 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73   for a new trans
135a0 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20  action..**.** A 
135b0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
135c0 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65  n must be starte
135d0 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  d before attempt
135e0 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e  ing any .** chan
135f0 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
13600 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68  ase.  None of th
13610 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
13620 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f  ines .** will wo
13630 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e  rk unless a tran
13640 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
13650 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20  ed first:.**.** 
13660 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
13670 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a  eCreateTable().*
13680 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
13690 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28 29  reeCreateIndex()
136a0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
136b0 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28  BtreeClearTable(
136c0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
136d0 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28  3BtreeDropTable(
136e0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
136f0 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a  3BtreeInsert().*
13700 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
13710 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20  reeDelete().**  
13720 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
13730 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a  UpdateMeta().**.
13740 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c  ** If an initial
13750 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75   attempt to acqu
13760 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69  ire the lock fai
13770 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f  ls because of lo
13780 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a  ck contention.**
13790 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
137a0 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
137b0 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20   unlocked, then 
137c0 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
137d0 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68  handler.** if th
137e0 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74  ere is one.  But
137f0 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70 72   if there was pr
13800 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d  eviously a read-
13810 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20  lock, do not.** 
13820 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
13830 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72  handler - just r
13840 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
13850 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20  Y.  SQLITE_BUSY 
13860 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  is .** returned 
13870 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c  when there is al
13880 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63  ready a read-loc
13890 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76  k in order to av
138a0 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a  oid a deadlock..
138b0 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68  **.** Suppose th
138c0 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63  ere are two proc
138d0 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20  esses A and B.  
138e0 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  A has a read loc
138f0 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61  k and B has.** a
13900 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20   reserved lock. 
13910 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d   B tries to prom
13920 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ote to exclusive
13930 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20   but is blocked 
13940 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27  because.** of A'
13950 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20  s read lock.  A 
13960 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
13970 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75 74   to reserved but
13980 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42   is blocked by B
13990 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20  ..** One or the 
139a0 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f  other of the two
139b0 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20   processes must 
139c0 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65 72  give way or ther
139d0 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70  e can be.** no p
139e0 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65 74  rogress.  By ret
139f0 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55  urning SQLITE_BU
13a00 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b  SY and not invok
13a10 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61 6c  ing the busy cal
13a20 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20  lback.** when A 
13a30 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65  already has a re
13a40 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f  ad lock, we enco
13a50 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65 20  urage A to give 
13a60 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20  up and let B.** 
13a70 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20  proceed..*/.int 
13a80 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
13a90 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c  nTrans(Btree *p,
13aa0 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20   int wrflag){.  
13ab0 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20  sqlite3 *pBlock 
13ac0 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20  = 0;.  BtShared 
13ad0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
13ae0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13af0 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  _OK;..  sqlite3B
13b00 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
13b10 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
13b20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
13b30 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79  btree is already
13b40 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e   in a write-tran
13b50 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20  saction, or it. 
13b60 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69   ** is already i
13b70 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
13b80 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d  tion and a read-
13b90 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
13ba0 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74   is requested, t
13bb0 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
13bc0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
13bd0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
13be0 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e  TE || (p->inTran
13bf0 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26  s==TRANS_READ &&
13c00 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20   !wrflag) ){.   
13c10 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
13c20 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69  n;.  }..  /* Wri
13c30 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te transactions 
13c40 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  are not possible
13c50 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   on a read-only 
13c60 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66  database */.  if
13c70 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
13c80 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
13c90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
13ca0 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20  DONLY;.    goto 
13cb0 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
13cc0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13cd0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
13ce0 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68  HE.  /* If anoth
13cf0 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  er database hand
13d00 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  le has already o
13d10 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72  pened a write tr
13d20 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20  ansaction .  ** 
13d30 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62  on this shared-b
13d40 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61  tree structure a
13d50 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74  nd a second writ
13d60 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
13d70 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c  .  ** requested,
13d80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
13d90 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66  OCKED..  */.  if
13da0 28 20 28 77 72 66 6c 61 67 20 26 26 20 70 42 74  ( (wrflag && pBt
13db0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
13dc0 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c  =TRANS_WRITE) ||
13dd0 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20   pBt->isPending 
13de0 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20  ){.    pBlock = 
13df0 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62  pBt->pWriter->db
13e00 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72  ;.  }else if( wr
13e10 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74  flag>1 ){.    Bt
13e20 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20  Lock *pIter;.   
13e30 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
13e40 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
13e50 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
13e60 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
13e70 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b  er->pBtree!=p ){
13e80 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20  .        pBlock 
13e90 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  = pIter->pBtree-
13ea0 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62 72 65  >db;.        bre
13eb0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
13ec0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f  }.  }.  if( pBlo
13ed0 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ck ){.    sqlite
13ee0 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
13ef0 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b  ed(p->db, pBlock
13f00 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
13f10 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
13f20 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20  CACHE;.    goto 
13f30 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
13f40 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e  .#endif..  /* An
13f50 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72  y read-only or r
13f60 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61  ead-write transa
13f70 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20  ction implies a 
13f80 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20  read-lock on .  
13f90 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66  ** page 1. So if
13fa0 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72   some other shar
13fb0 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20  ed-cache client 
13fc0 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77 72  already has a wr
13fd0 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f  ite-lock .  ** o
13fe0 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74 72  n page 1, the tr
13ff0 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
14000 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20   be opened. */. 
14010 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72 65   rc = queryShare
14020 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
14030 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  p, MASTER_ROOT, 
14040 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  READ_LOCK);.  if
14050 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
14060 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67  ) goto trans_beg
14070 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 69 6e 69 74  un;..  pBt->init
14080 69 61 6c 6c 79 45 6d 70 74 79 20 3d 20 70 42 74  iallyEmpty = pBt
14090 2d 3e 6e 50 61 67 65 3d 3d 30 3b 0a 20 20 64 6f  ->nPage==0;.  do
140a0 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c   {.    /* Call l
140b0 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c  ockBtree() until
140c0 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61   either pBt->pPa
140d0 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ge1 is populated
140e0 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42   or.    ** lockB
140f0 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73  tree() returns s
14100 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74  omething other t
14110 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c  han SQLITE_OK. l
14120 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a  ockBtree().    *
14130 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  * may return SQL
14140 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65  ITE_OK but leave
14150 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74   pBt->pPage1 set
14160 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20   to 0 if after. 
14170 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61     ** reading pa
14180 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72  ge 1 it discover
14190 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  s that the page-
141a0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
141b0 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c  base .    ** fil
141c0 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61  e is not pBt->pa
141d0 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20  geSize. In this 
141e0 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29  case lockBtree()
141f0 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20   will update.   
14200 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   ** pBt->pageSiz
14210 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69  e to the page-si
14220 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f  ze of the file o
14230 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20  n disk..    */. 
14240 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70     while( pBt->p
14250 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49  Page1==0 && SQLI
14260 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63  TE_OK==(rc = loc
14270 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a  kBtree(pBt)) );.
14280 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
14290 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
142a0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 42   ){.      if( pB
142b0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  t->readOnly ){. 
142c0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
142d0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
142e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
142f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
14300 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50  gerBegin(pBt->pP
14310 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71  ager,wrflag>1,sq
14320 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72  lite3TempInMemor
14330 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  y(p->db));.     
14340 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14350 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
14360 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
14370 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  se(pBt);.       
14380 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
14390 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d  .  .    if( rc!=
143a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
143b0 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
143c0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
143d0 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d   }.  }while( rc=
143e0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
143f0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
14400 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
14410 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65  &.          btre
14420 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
14430 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66  er(pBt) );..  if
14440 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
14450 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  ){.    if( p->in
14460 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
14470 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  E ){.      pBt->
14480 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a  nTransaction++;.
14490 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
144a0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
144b0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68  .      if( p->sh
144c0 61 72 61 62 6c 65 20 29 7b 0a 09 61 73 73 65 72  arable ){..asser
144d0 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65  t( p->lock.pBtre
144e0 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e  e==p && p->lock.
144f0 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20  iTable==1 );.   
14500 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f       p->lock.eLo
14510 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
14520 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e          p->lock.
14530 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
14540 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  ck;.        pBt-
14550 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63  >pLock = &p->loc
14560 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  k;.      }.#endi
14570 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69  f.    }.    p->i
14580 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67  nTrans = (wrflag
14590 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41  ?TRANS_WRITE:TRA
145a0 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66  NS_READ);.    if
145b0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74  ( p->inTrans>pBt
145c0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
145d0 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
145e0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d  Transaction = p-
145f0 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a  >inTrans;.    }.
14600 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14610 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
14620 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20  .    if( wrflag 
14630 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
14640 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29   !pBt->pWriter )
14650 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72  ;.      pBt->pWr
14660 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20  iter = p;.      
14670 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65  pBt->isExclusive
14680 20 3d 20 28 75 38 29 28 77 72 66 6c 61 67 3e 31   = (u8)(wrflag>1
14690 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
146a0 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75    }...trans_begu
146b0 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  n:.  if( rc==SQL
146c0 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
146d0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
146e0 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20  call makes sure 
146f0 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68  that the pager h
14700 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e  as the correct n
14710 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  umber of.    ** 
14720 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
14730 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70   If the second p
14740 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61  arameter is grea
14750 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20  ter than 0 and. 
14760 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
14770 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72  urnal is not alr
14780 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20  eady open, then 
14790 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  it will be opene
147a0 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  d here..    */. 
147b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
147c0 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
147d0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  t(pBt->pPager, p
147e0 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
147f0 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49  );.  }..  btreeI
14800 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
14810 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
14820 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
14830 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
14840 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
14850 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  UUM../*.** Set t
14860 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
14870 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
14880 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20  hildren of page 
14890 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a  pPage. Also, if.
148a0 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ** pPage contain
148b0 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69  s cells that poi
148c0 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
148d0 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f  ages, set the po
148e0 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
148f0 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65  ries for the ove
14900 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77  rflow pages as w
14910 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
14920 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  nt setChildPtrma
14930 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ps(MemPage *pPag
14940 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
14950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14960 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e           /* Coun
14970 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  ter variable */.
14980 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
14990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
149b0 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20  f cells in page 
149c0 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72  pPage */.  int r
149d0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
149e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
149f0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
14a00 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
14a10 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
14a20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20  u8 isInitOrig = 
14a30 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20  pPage->isInit;. 
14a40 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61   Pgno pgno = pPa
14a50 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73  ge->pgno;..  ass
14a60 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
14a70 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
14a80 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
14a90 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
14aa0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28  ge(pPage);.  if(
14ab0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14ac0 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63  {.    goto set_c
14ad0 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
14ae0 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20  ;.  }.  nCell = 
14af0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
14b00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
14b10 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
14b20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
14b30 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20  l(pPage, i);..  
14b40 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50    ptrmapPutOvflP
14b50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
14b60 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20   &rc);..    if( 
14b70 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
14b80 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
14b90 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
14ba0 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74  pCell);.      pt
14bb0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
14bc0 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
14bd0 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29  TREE, pgno, &rc)
14be0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
14bf0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
14c00 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  ){.    Pgno chil
14c10 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
14c20 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
14c30 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
14c40 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50  8]);.    ptrmapP
14c50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
14c60 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
14c70 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d   pgno, &rc);.  }
14c80 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  ..set_child_ptrm
14c90 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65  aps_out:.  pPage
14ca0 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69  ->isInit = isIni
14cb0 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20  tOrig;.  return 
14cc0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  rc;.}../*.** Som
14cd0 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20  ewhere on pPage 
14ce0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
14cf0 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64  page iFrom.  Mod
14d00 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ify this pointer
14d10 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70   so.** that it p
14d20 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61  oints to iTo. Pa
14d30 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65  rameter eType de
14d40 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65  scribes the type
14d50 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a   of pointer to.*
14d60 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61  * be modified, a
14d70 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  s  follows:.**.*
14d80 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20  * PTRMAP_BTREE: 
14d90 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62      pPage is a b
14da0 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
14db0 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
14dc0 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20   a child .**    
14dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
14de0 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a  age of pPage..**
14df0 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
14e00 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61  LOW1: pPage is a
14e10 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
14e20 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
14e30 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  at an overflow.*
14e40 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
14e50 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64      page pointed
14e60 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68   to by one of th
14e70 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  e cells on pPage
14e80 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
14e90 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20  VERFLOW2: pPage 
14ea0 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70  is an overflow-p
14eb0 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
14ec0 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e   points at the n
14ed0 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ext.**          
14ee0 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f           overflo
14ef0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
14f00 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
14f10 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  t modifyPagePoin
14f20 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ter(MemPage *pPa
14f30 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20  ge, Pgno iFrom, 
14f40 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79  Pgno iTo, u8 eTy
14f50 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  pe){.  assert( s
14f60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
14f70 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
14f80 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
14f90 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
14fa0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
14fb0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
14fc0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
14fd0 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20  _OVERFLOW2 ){.  
14fe0 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
14ff0 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66   is always the f
15000 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20  irst 4 bytes of 
15010 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
15020 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69   case.  */.    i
15030 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67  f( get4byte(pPag
15040 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d  e->aData)!=iFrom
15050 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
15060 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
15070 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
15080 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
15090 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d  aData, iTo);.  }
150a0 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49  else{.    u8 isI
150b0 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d  nitOrig = pPage-
150c0 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74  >isInit;.    int
150d0 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c   i;.    int nCel
150e0 6c 3b 0a 0a 20 20 20 20 62 74 72 65 65 49 6e 69  l;..    btreeIni
150f0 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
15100 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
15110 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72  >nCell;..    for
15120 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
15130 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70  ++){.      u8 *p
15140 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
15150 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20  pPage, i);.     
15160 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
15170 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a  AP_OVERFLOW1 ){.
15180 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f          CellInfo
15190 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 62   info;.        b
151a0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
151b0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
151c0 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  info);.        i
151d0 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
151e0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  w ){.          i
151f0 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79  f( iFrom==get4by
15200 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
15210 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20 20  Overflow]) ){.  
15220 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
15230 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
15240 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b  Overflow], iTo);
15250 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
15260 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
15270 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15280 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
15290 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  f( get4byte(pCel
152a0 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  l)==iFrom ){.   
152b0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
152c0 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20  pCell, iTo);.   
152d0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
152e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
152f0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
15300 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20   i==nCell ){.   
15310 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54     if( eType!=PT
15320 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20  RMAP_BTREE || . 
15330 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74           get4byt
15340 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
15350 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
15360 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  +8])!=iFrom ){. 
15370 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
15380 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
15390 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
153a0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
153b0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
153c0 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f  drOffset+8], iTo
153d0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  );.    }..    pP
153e0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
153f0 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20  InitOrig;.  }.  
15400 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15410 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
15420 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
15430 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20  se page pDbPage 
15440 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65  to location iFre
15450 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a  ePage in the .**
15460 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70   database. The p
15470 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65  DbPage reference
15480 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a   remains valid..
15490 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d  **.** The isComm
154a0 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65  it flag indicate
154b0 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
154c0 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  no need to remem
154d0 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  ber that.** the 
154e0 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
154f0 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
15500 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67  ore database pag
15510 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20  e pDbPage->pgno 
15520 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74  .** can be writt
15530 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65  en to. The calle
15540 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72  r has already pr
15550 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72  omised not to wr
15560 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70  ite to that.** p
15570 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
15580 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28  nt relocatePage(
15590 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
155a0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
155b0 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
155c0 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20  e *pDbPage,     
155d0 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
155e0 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20  to move */.  u8 
155f0 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
15600 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
15610 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72   map 'type' entr
15620 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
15630 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65  .  Pgno iPtrPage
15640 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
15650 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65  ointer map 'page
15660 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70  -no' entry for p
15670 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
15680 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20   iFreePage,     
15690 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61       /* The loca
156a0 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62  tion to move pDb
156b0 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  Page to */.  int
156c0 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20   isCommit       
156d0 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69        /* isCommi
156e0 74 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f  t flag passed to
156f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
15700 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65  epage */.){.  Me
15710 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b  mPage *pPtrPage;
15720 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
15730 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  hat contains a p
15740 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67  ointer to pDbPag
15750 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50  e */.  Pgno iDbP
15760 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70  age = pDbPage->p
15770 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
15780 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
15790 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
157a0 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
157b0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
157c0 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
157d0 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a  P_OVERFLOW1 || .
157e0 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52        eType==PTR
157f0 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
15800 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
15810 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  AGE );.  assert(
15820 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
15830 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
15840 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
15850 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29  Page->pBt==pBt )
15860 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67  ;..  /* Move pag
15870 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69  e iDbPage from i
15880 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ts current locat
15890 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  ion to page numb
158a0 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a  er iFreePage */.
158b0 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41    TRACE(("AUTOVA
158c0 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20  CUUM: Moving %d 
158d0 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20  to free page %d 
158e0 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70  (ptr page %d typ
158f0 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20  e %d)\n", .     
15900 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
15910 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65  age, iPtrPage, e
15920 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73  Type));.  rc = s
15930 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
15940 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50  age(pPager, pDbP
15950 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46  age->pDbPage, iF
15960 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69  reePage, isCommi
15970 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
15980 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
15990 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
159a0 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20  pDbPage->pgno = 
159b0 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a  iFreePage;..  /*
159c0 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20   If pDbPage was 
159d0 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68  a btree-page, th
159e0 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63  en it may have c
159f0 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f  hild pages and/o
15a00 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61  r cells.  ** tha
15a10 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
15a20 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70  low pages. The p
15a30 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
15a40 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65  es for all these
15a50 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64  .  ** pages need
15a60 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a   to be changed..
15a70 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62    **.  ** If pDb
15a80 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66  Page is an overf
15a90 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74  low page, then t
15aa0 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
15ab0 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a   may store a.  *
15ac0 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  * pointer to a s
15ad0 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
15ae0 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73  ow page. If this
15af0 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
15b00 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e  en.  ** the poin
15b10 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f  ter map needs to
15b20 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20   be updated for 
15b30 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f  the subsequent o
15b40 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20  verflow page..  
15b50 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
15b60 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
15b70 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
15b80 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
15b90 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61   = setChildPtrma
15ba0 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ps(pDbPage);.   
15bb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15bc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
15bd0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
15be0 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
15bf0 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  extOvfl = get4by
15c00 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74  te(pDbPage->aDat
15c10 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74  a);.    if( next
15c20 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20  Ovfl!=0 ){.     
15c30 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
15c40 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50  nextOvfl, PTRMAP
15c50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65  _OVERFLOW2, iFre
15c60 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  ePage, &rc);.   
15c70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
15c80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
15c90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
15ca0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
15cb0 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62  /* Fix the datab
15cc0 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70  ase pointer on p
15cd0 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61  age iPtrPage tha
15ce0 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62  t pointed at iDb
15cf0 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61  Page so.  ** tha
15d00 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69  t it points at i
15d10 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66  FreePage. Also f
15d20 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ix the pointer m
15d30 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a  ap entry for.  *
15d40 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f  * iPtrPage..  */
15d50 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54  .  if( eType!=PT
15d60 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
15d70 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
15d80 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72  etPage(pBt, iPtr
15d90 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c  Page, &pPtrPage,
15da0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
15db0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15dc0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
15dd0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
15de0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
15df0 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67  pPtrPage->pDbPag
15e00 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
15e10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15e20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
15e30 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20  PtrPage);.      
15e40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
15e50 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79  .    rc = modify
15e60 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72  PagePointer(pPtr
15e70 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69  Page, iDbPage, i
15e80 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29  FreePage, eType)
15e90 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
15ea0 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
15eb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15ec0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  OK ){.      ptrm
15ed0 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65  apPut(pBt, iFree
15ee0 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74  Page, eType, iPt
15ef0 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  rPage, &rc);.   
15f00 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
15f10 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
15f20 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65  d declaration re
15f30 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61  quired by incrVa
15f40 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73  cuumStep(). */.s
15f50 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
15f60 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68  teBtreePage(BtSh
15f70 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20  ared *, MemPage 
15f80 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f  **, Pgno *, Pgno
15f90 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65  , u8);../*.** Pe
15fa0 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73  rform a single s
15fb0 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d  tep of an increm
15fc0 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66  ental-vacuum. If
15fd0 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20   successful,.** 
15fe0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15ff0 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
16000 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64   work to do (and
16010 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a   therefore no.**
16020 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e   point in callin
16030 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  g this function 
16040 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53  again), return S
16050 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a  QLITE_DONE..**.*
16060 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c  * More specificl
16070 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
16080 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d   attempts to re-
16090 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a  organize the .**
160a0 20 64 61 74 61 62 61 73 65 20 73 6f 20 74 68 61   database so tha
160b0 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  t the last page 
160c0 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72  of the file curr
160d0 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20  ently in use.** 
160e0 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20  is no longer in 
160f0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  use..**.** If th
16100 65 20 6e 46 69 6e 20 70 61 72 61 6d 65 74 65 72  e nFin parameter
16110 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
16120 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
16130 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  mes.** that the 
16140 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70  caller will keep
16150 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63   calling incrVac
16160 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 0a  uumStep() until.
16170 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  ** it returns SQ
16180 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20  LITE_DONE or an 
16190 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74 20  error, and that 
161a0 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e  nFin is the.** n
161b0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
161c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
161d0 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66   will contain af
161e0 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f  ter this .** pro
161f0 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74 65  cess is complete
16200 2e 20 20 49 66 20 6e 46 69 6e 20 69 73 20 7a 65  .  If nFin is ze
16210 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ro, it is assume
16220 64 20 74 68 61 74 0a 2a 2a 20 69 6e 63 72 56 61  d that.** incrVa
16230 63 75 75 6d 53 74 65 70 28 29 20 77 69 6c 6c 20  cuumStep() will 
16240 62 65 20 63 61 6c 6c 65 64 20 61 20 66 69 6e 69  be called a fini
16250 74 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d  te amount of tim
16260 65 73 0a 2a 2a 20 77 68 69 63 68 20 6d 61 79 20  es.** which may 
16270 6f 72 20 6d 61 79 20 6e 6f 74 20 65 6d 70 74 79  or may not empty
16280 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
16290 41 20 66 75 6c 6c 20 61 75 74 6f 76 61 63 75 75  A full autovacuu
162a0 6d 0a 2a 2a 20 68 61 73 20 6e 46 69 6e 3e 30 2e  m.** has nFin>0.
162b0 20 20 41 20 22 50 52 41 47 4d 41 20 69 6e 63 72    A "PRAGMA incr
162c0 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 22 20  emental_vacuum" 
162d0 68 61 73 20 6e 46 69 6e 3d 3d 30 2e 0a 2a 2f 0a  has nFin==0..*/.
162e0 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56  static int incrV
162f0 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72  acuumStep(BtShar
16300 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46  ed *pBt, Pgno nF
16310 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67  in, Pgno iLastPg
16320 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c  ){.  Pgno nFreeL
16330 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ist;           /
16340 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
16350 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66  s still on the f
16360 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  ree-list */.  in
16370 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
16380 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
16390 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
163a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61  );.  assert( iLa
163b0 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20  stPg>nFin );..  
163c0 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41  if( !PTRMAP_ISPA
163d0 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
163e0 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e   && iLastPg!=PEN
163f0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
16400 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54  Bt) ){.    u8 eT
16410 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50  ype;.    Pgno iP
16420 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72  trPage;..    nFr
16430 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74  eeList = get4byt
16440 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
16450 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
16460 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30  if( nFreeList==0
16470 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
16480 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
16490 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74    }..    rc = pt
164a0 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61  rmapGet(pBt, iLa
164b0 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69  stPg, &eType, &i
164c0 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
164d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
164e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
164f0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
16500 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
16510 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
16520 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16530 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
16540 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79    }..    if( eTy
16550 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
16560 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  AGE ){.      if(
16570 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20   nFin==0 ){.    
16580 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
16590 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
165a0 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e  files free-list.
165b0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   This is not req
165c0 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  uired.        **
165d0 20 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d   if nFin is non-
165e0 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61  zero. In that ca
165f0 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73  se, the free-lis
16600 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  t will be.      
16610 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74    ** truncated t
16620 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69  o zero after thi
16630 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
16640 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27  ns, so it doesn'
16650 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61  t .        ** ma
16660 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c  tter if it still
16670 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67   contains some g
16680 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a  arbage entries..
16690 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
166a0 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
166b0 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
166c0 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
166d0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
166e0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
166f0 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
16700 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b 0a  g, iLastPg, 1);.
16710 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
16720 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16730 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
16740 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16750 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
16760 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a  ePg==iLastPg );.
16770 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
16780 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
16790 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
167a0 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46   {.      Pgno iF
167b0 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20  reePg;          
167c0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
167d0 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ree page to move
167e0 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20   pLastPg to */. 
167f0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c       MemPage *pL
16800 61 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72 63  astPg;..      rc
16810 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
16820 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70  pBt, iLastPg, &p
16830 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20  LastPg, 0);.    
16840 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16850 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
16860 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
16870 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e  }..      /* If n
16880 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68 69  Fin is zero, thi
16890 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63  s loop runs exac
168a0 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67  tly once and pag
168b0 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20  e pLastPg.      
168c0 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69  ** is swapped wi
168d0 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65  th the first fre
168e0 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66  e page pulled of
168f0 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e  f the free list.
16900 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
16910 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ** On the other 
16920 68 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69 73  hand, if nFin is
16930 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
16940 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20  ro, then keep.  
16950 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75      ** looping u
16960 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65  ntil a free-page
16970 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20   located within 
16980 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70  the first nFin p
16990 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ages.      ** of
169a0 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75   the file is fou
169b0 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nd..      */.   
169c0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20     do {.        
169d0 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
169e0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
169f0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
16a00 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
16a10 26 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29 3b  &iFreePg, 0, 0);
16a20 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
16a30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16a40 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
16a50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
16a60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
16a70 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
16a80 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
16a90 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20  (pFreePg);.     
16aa0 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30   }while( nFin!=0
16ab0 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e   && iFreePg>nFin
16ac0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
16ad0 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50  ( iFreePg<iLastP
16ae0 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  g );.      .    
16af0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
16b00 67 65 72 57 72 69 74 65 28 70 4c 61 73 74 50 67  gerWrite(pLastPg
16b10 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
16b20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16b30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
16b40 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65  c = relocatePage
16b50 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65  (pBt, pLastPg, e
16b60 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
16b70 69 46 72 65 65 50 67 2c 20 6e 46 69 6e 21 3d 30  iFreePg, nFin!=0
16b80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
16b90 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
16ba0 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  stPg);.      if(
16bb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16bc0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
16bd0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
16be0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46   }.  }..  if( nF
16bf0 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61  in==0 ){.    iLa
16c00 73 74 50 67 2d 2d 3b 0a 20 20 20 20 77 68 69 6c  stPg--;.    whil
16c10 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44  e( iLastPg==PEND
16c20 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
16c30 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41 47  t)||PTRMAP_ISPAG
16c40 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
16c50 29 7b 0a 20 20 20 20 20 20 69 66 28 20 50 54 52  ){.      if( PTR
16c60 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
16c70 69 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20  iLastPg) ){.    
16c80 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67      MemPage *pPg
16c90 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  ;.        rc = b
16ca0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
16cb0 20 69 4c 61 73 74 50 67 2c 20 26 70 50 67 2c 20   iLastPg, &pPg, 
16cc0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
16cd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16ce0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
16cf0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
16d00 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
16d10 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
16d20 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  Pg->pDbPage);.  
16d30 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
16d40 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  e(pPg);.        
16d50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16d60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
16d70 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
16d80 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
16d90 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20    iLastPg--;.   
16da0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61   }.    sqlite3Pa
16db0 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
16dc0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 4c  (pBt->pPager, iL
16dd0 61 73 74 50 67 29 3b 0a 20 20 20 20 70 42 74 2d  astPg);.    pBt-
16de0 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67  >nPage = iLastPg
16df0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
16e00 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
16e10 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
16e20 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f  action must be o
16e30 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c  pened before cal
16e40 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
16e50 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72  on..** It perfor
16e60 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74  ms a single unit
16e70 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73   of work towards
16e80 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
16e90 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  vacuum..**.** If
16ea0 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
16eb0 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73   vacuum is finis
16ec0 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66  hed after this f
16ed0 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c  unction has run,
16ee0 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  .** SQLITE_DONE 
16ef0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
16f00 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68  it is not finish
16f10 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  ed, but no error
16f20 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51   occurred,.** SQ
16f30 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
16f40 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61  ned. Otherwise a
16f50 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
16f60 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ode. .*/.int sql
16f70 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63  ite3BtreeIncrVac
16f80 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  uum(Btree *p){. 
16f90 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
16fa0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
16fb0 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t;..  sqlite3Btr
16fc0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
16fd0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
16fe0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
16ff0 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72  WRITE && p->inTr
17000 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
17010 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e   );.  if( !pBt->
17020 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
17030 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
17040 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
17050 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
17060 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
17070 3b 0a 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56  ;.    rc = incrV
17080 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 30  acuumStep(pBt, 0
17090 2c 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  , btreePagecount
170a0 28 70 42 74 29 29 3b 0a 20 20 20 20 69 66 28 20  (pBt));.    if( 
170b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
170c0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
170d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
170e0 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
170f0 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ge);.      put4b
17100 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
17110 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74  ->aData[28], pBt
17120 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  ->nPage);.    }.
17130 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
17140 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
17150 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17160 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
17170 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74  s called prior t
17180 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  o sqlite3PagerCo
17190 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e  mmit when a tran
171a0 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f  saction.** is co
171b0 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61 75  mmited for an au
171c0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
171d0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  se..**.** If SQL
171e0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
171f0 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e  ed, then *pnTrun
17200 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  c is set to the 
17210 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a  number of pages.
17220 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
17230 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74  file should be t
17240 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69  runcated to duri
17250 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72  ng the commit pr
17260 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20  ocess. .** i.e. 
17270 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
17280 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65   been reorganize
17290 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74  d so that only t
172a0 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e  he first *pnTrun
172b0 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69  c.** pages are i
172c0 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  n use..*/.static
172d0 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43   int autoVacuumC
172e0 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a  ommit(BtShared *
172f0 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pBt){.  int rc =
17300 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
17310 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
17320 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41  t->pPager;.  VVA
17330 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20  _ONLY( int nRef 
17340 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
17350 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29  fcount(pPager) )
17360 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
17370 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
17380 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
17390 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
173a0 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
173b0 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e  ;.  assert(pBt->
173c0 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69  autoVacuum);.  i
173d0 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63  f( !pBt->incrVac
173e0 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
173f0 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  nFin;         /*
17400 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
17410 20 69 6e 20 64 61 74 61 62 61 73 65 20 61 66 74   in database aft
17420 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67  er autovacuuming
17430 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72   */.    Pgno nFr
17440 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ee;        /* Nu
17450 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
17460 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e   the freelist in
17470 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50  itially */.    P
17480 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20  gno nPtrmap;    
17490 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50    /* Number of P
174a0 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62  trMap pages to b
174b0 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50  e freed */.    P
174c0 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20  gno iFree;      
174d0 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61    /* The next pa
174e0 67 65 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a  ge to be freed *
174f0 2f 0a 20 20 20 20 69 6e 74 20 6e 45 6e 74 72 79  /.    int nEntry
17500 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
17510 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e  er of entries on
17520 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65   one ptrmap page
17530 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72   */.    Pgno nOr
17540 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ig;        /* Da
17550 74 61 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f  tabase size befo
17560 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20  re freeing */.. 
17570 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65     nOrig = btree
17580 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
17590 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49      if( PTRMAP_I
175a0 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67  SPAGE(pBt, nOrig
175b0 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44  ) || nOrig==PEND
175c0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
175d0 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  t) ){.      /* I
175e0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
175f0 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 61  e to create a da
17600 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63 68  tabase for which
17610 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a   the final page.
17620 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68        ** is eith
17630 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  er a pointer-map
17640 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e   page or the pen
17650 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20  ding-byte page. 
17660 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20  If one.      ** 
17670 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
17680 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 63  this indicates c
17690 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20  orruption..     
176a0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
176b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
176c0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
176d0 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
176e0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
176f0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
17700 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73  nEntry = pBt->us
17710 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 20 20  ableSize/5;.    
17720 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65  nPtrmap = (nFree
17730 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41  -nOrig+PTRMAP_PA
17740 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29  GENO(pBt, nOrig)
17750 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b  +nEntry)/nEntry;
17760 0a 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69  .    nFin = nOri
17770 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72  g - nFree - nPtr
17780 6d 61 70 3b 0a 20 20 20 20 69 66 28 20 6e 4f 72  map;.    if( nOr
17790 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ig>PENDING_BYTE_
177a0 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69  PAGE(pBt) && nFi
177b0 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  n<PENDING_BYTE_P
177c0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
177d0 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a    nFin--;.    }.
177e0 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41      while( PTRMA
177f0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46  P_ISPAGE(pBt, nF
17800 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e  in) || nFin==PEN
17810 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
17820 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 46 69  Bt) ){.      nFi
17830 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n--;.    }.    i
17840 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20  f( nFin>nOrig ) 
17850 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
17860 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 20  RRUPT_BKPT;..   
17870 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67   for(iFree=nOrig
17880 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20  ; iFree>nFin && 
17890 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
178a0 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72  Free--){.      r
178b0 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
178c0 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46  ep(pBt, nFin, iF
178d0 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ree);.    }.    
178e0 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  if( (rc==SQLITE_
178f0 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  DONE || rc==SQLI
17900 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e  TE_OK) && nFree>
17910 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
17920 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
17930 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
17940 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70  DbPage);.      p
17950 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
17960 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
17970 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
17980 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
17990 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b  ->aData[36], 0);
179a0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
179b0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
179c0 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a  ata[28], nFin);.
179d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
179e0 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
179f0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 46 69  pBt->pPager, nFi
17a00 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  n);.      pBt->n
17a10 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20  Page = nFin;.   
17a20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
17a30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17a40 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
17a50 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
17a60 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
17a70 65 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74  ert( nRef==sqlit
17a80 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
17a90 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
17aa0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65  urn rc;.}..#else
17ab0 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54   /* ifndef SQLIT
17ac0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
17ad0 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65  M */.# define se
17ae0 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29  tChildPtrmaps(x)
17af0 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69   SQLITE_OK.#endi
17b00 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
17b10 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
17b20 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20  irst phase of a 
17b30 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  two-phase commit
17b40 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
17b50 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c  ** causes a roll
17b60 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  back journal to 
17b70 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69  be created (if i
17b80 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  t does not alrea
17b90 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64  dy exist).** and
17ba0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
17bb0 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69  enough informati
17bc0 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20  on so that if a 
17bd0 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72  power loss occur
17be0 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
17bf0 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  e can be restore
17c00 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
17c10 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69  l state by playi
17c20 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a  ng back.** the j
17c30 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68  ournal.  Then th
17c40 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
17c50 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c  e journal are fl
17c60 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20  ushed out to.** 
17c70 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72  the disk.  After
17c80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
17c90 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c  safely on oxide,
17ca0 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20   the changes to 
17cb0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
17cc0 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  are written into
17cd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17ce0 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74  le and flushed t
17cf0 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74  o oxide..** At t
17d00 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63  he end of this c
17d10 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63  all, the rollbac
17d20 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20  k journal still 
17d30 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a  exists on the.**
17d40 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65   disk and we are
17d50 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
17d60 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65  ll locks, so the
17d70 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
17d80 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   not.** committe
17d90 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42  d.  See sqlite3B
17da0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
17db0 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65 63  wo() for the sec
17dc0 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65  ond phase of the
17dd0 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  .** commit proce
17de0 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ss..**.** This c
17df0 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  all is a no-op i
17e00 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  f no write-trans
17e10 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e  action is curren
17e20 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42  tly active on pB
17e30 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  t..**.** Otherwi
17e40 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74  se, sync the dat
17e50 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
17e60 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d  he btree pBt. zM
17e70 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a  aster points to.
17e80 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ** the name of a
17e90 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
17ea0 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
17eb0 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
17ec0 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
17ed0 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  al journal file,
17ee0 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64   or is NULL, ind
17ef0 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65  icating no maste
17f00 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  r journal file .
17f10 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62  ** (single datab
17f20 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
17f30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
17f40 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  s is called, the
17f50 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
17f60 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68  should already h
17f70 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61  ave been.** crea
17f80 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77  ted, populated w
17f90 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ith this journal
17fa0 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e   pointer and syn
17fb0 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
17fc0 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20  ** Once this is 
17fd0 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75  routine has retu
17fe0 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74  rned, the only t
17ff0 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f  hing required to
18000 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77   commit.** the w
18010 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
18020 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
18030 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65  se file is to de
18040 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
18050 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18060 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
18070 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f  One(Btree *p, co
18080 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
18090 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
180a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
180b0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
180c0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
180d0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
180e0 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74  ->pBt;.    sqlit
180f0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
18100 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18110 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
18120 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
18130 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
18140 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d   rc = autoVacuum
18150 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20  Commit(pBt);.   
18160 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18170 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18180 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
18190 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  e(p);.        re
181a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
181b0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
181c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
181d0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
181e0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a  e(pBt->pPager, z
181f0 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
18200 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
18210 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
18220 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18230 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
18240 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74   called from bot
18250 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  h BtreeCommitPha
18260 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65  seTwo() and Btre
18270 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61  eRollback().** a
18280 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
18290 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
182a0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
182b0 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61  d btreeEndTransa
182c0 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b  ction(Btree *p){
182d0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
182e0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
182f0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
18300 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
18310 3b 0a 0a 20 20 62 74 72 65 65 43 6c 65 61 72 48  ;..  btreeClearH
18320 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a  asContent(pBt);.
18330 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
18340 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70  >TRANS_NONE && p
18350 2d 3e 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65  ->db->activeVdbe
18360 43 6e 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  Cnt>1 ){.    /* 
18370 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 74 68  If there are oth
18380 65 72 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  er active statem
18390 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67  ents that belong
183a0 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
183b0 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c  e.    ** handle,
183c0 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20   downgrade to a 
183d0 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61  read-only transa
183e0 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72  ction. The other
183f0 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20   statements.    
18400 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20  ** may still be 
18410 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65  reading from the
18420 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20   database.  */. 
18430 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53     downgradeAllS
18440 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
18450 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e  ocks(p);.    p->
18460 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
18470 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  READ;.  }else{. 
18480 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e     /* If the han
18490 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e 64  dle had any kind
184a0 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   of transaction 
184b0 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20  open, decrement 
184c0 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e  the .    ** tran
184d0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66  saction count of
184e0 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
184f0 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  e. If the transa
18500 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20  ction count .   
18510 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20 73   ** reaches 0, s
18520 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74  et the shared st
18530 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e  ate to TRANS_NON
18540 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72  E. The unlockBtr
18550 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20 20  eeIfUnused().   
18560 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77   ** call below w
18570 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70  ill unlock the p
18580 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ager.  */.    if
18590 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  ( p->inTrans!=TR
185a0 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
185b0 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64    clearAllShared
185c0 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
185d0 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  p);.      pBt->n
185e0 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20  Transaction--;. 
185f0 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d       if( 0==pBt-
18600 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  >nTransaction ){
18610 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  .        pBt->in
18620 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
18630 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  ANS_NONE;.      
18640 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
18650 53 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  Set the current 
18660 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74  transaction stat
18670 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20  e to TRANS_NONE 
18680 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a  and unlock the .
18690 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66 20      ** pager if 
186a0 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64  this call closed
186b0 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f   the only read o
186c0 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
186d0 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e  ion.  */.    p->
186e0 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
186f0 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b  NONE;.    unlock
18700 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
18710 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
18720 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a  Integrity(p);.}.
18730 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68  ./*.** Commit th
18740 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75  e transaction cu
18750 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72  rrently in progr
18760 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
18770 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
18780 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68  ts the second ph
18790 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65  ase of a 2-phase
187a0 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a   commit.  The.**
187b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
187c0 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f  mitPhaseOne() ro
187d0 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
187e0 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73  irst phase and s
187f0 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f  hould.** be invo
18800 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  ked prior to cal
18810 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
18820 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42  e.  The sqlite3B
18830 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
18840 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ne().** routine 
18850 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b  did all the work
18860 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f   of writing info
18870 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64  rmation out to d
18880 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67  isk and flushing
18890 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
188a0 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72   so that they ar
188b0 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74  e written onto t
188c0 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e  he disk platter.
188d0 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f    All this.** ro
188e0 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20  utine has to do 
188f0 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75  is delete or tru
18900 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68  ncate or zero th
18910 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a  e header in the.
18920 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
18930 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63  journal (which c
18940 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61  auses the transa
18950 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29  ction to commit)
18960 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63   and.** drop loc
18970 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  ks..**.** This w
18980 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
18990 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
189a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
189b0 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
189c0 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
189d0 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
189e0 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
189f0 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
18a00 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
18a10 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70 29  aseTwo(Btree *p)
18a20 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
18a30 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
18a40 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
18a50 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
18a60 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
18a70 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
18a80 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
18a90 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d  ction open, comm
18aa0 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  it the shared-bt
18ab0 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73  rees .  ** trans
18ac0 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74  action and set t
18ad0 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
18ae0 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20  to TRANS_READ.. 
18af0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
18b00 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
18b10 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  E ){.    int rc;
18b20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
18b30 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
18b40 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
18b50 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
18b60 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
18b70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
18b80 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
18b90 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67  aseTwo(pBt->pPag
18ba0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
18bb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18bc0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
18bd0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
18be0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
18bf0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
18c00 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
18c10 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  READ;.  }..  btr
18c20 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
18c30 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
18c40 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
18c50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18c60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74  .}../*.** Do bot
18c70 68 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f  h phases of a co
18c80 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mmit..*/.int sql
18c90 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28  ite3BtreeCommit(
18ca0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
18cb0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
18cc0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
18cd0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
18ce0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
18cf0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
18d00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18d10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
18d20 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
18d30 28 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (p);.  }.  sqlit
18d40 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
18d50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18d60 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
18d70 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
18d80 20 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65   number of write
18d90 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e  -cursors open on
18da0 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68   this handle. Th
18db0 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a  is is for use.**
18dc0 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70   in assert() exp
18dd0 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20  ressions, so it 
18de0 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64  is only compiled
18df0 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f   if NDEBUG is no
18e00 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a  t.** defined..**
18e10 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
18e20 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75  oses of this rou
18e30 74 69 6e 65 2c 20 61 20 77 72 69 74 65 2d 63 75  tine, a write-cu
18e40 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73  rsor is any curs
18e50 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61  or that.** is ca
18e60 70 61 62 6c 65 20 6f 66 20 77 72 69 74 69 6e 67  pable of writing
18e70 20 74 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e   to the databse.
18e80 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 65    That means the
18e90 20 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f   cursor was.** o
18ea0 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64  riginally opened
18eb0 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 64   for writing and
18ec0 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20   the cursor has 
18ed0 6e 6f 74 20 62 65 20 64 69 73 61 62 6c 65 64 0a  not be disabled.
18ee0 2a 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74 73  ** by having its
18ef0 20 73 74 61 74 65 20 63 68 61 6e 67 65 64 20 74   state changed t
18f00 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a  o CURSOR_FAULT..
18f10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
18f20 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28  untWriteCursors(
18f30 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
18f40 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
18f50 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20  ;.  int r = 0;. 
18f60 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70   for(pCur=pBt->p
18f70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43  Cursor; pCur; pC
18f80 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b  ur=pCur->pNext){
18f90 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77  .    if( pCur->w
18fa0 72 46 6c 61 67 20 26 26 20 70 43 75 72 2d 3e 65  rFlag && pCur->e
18fb0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41  State!=CURSOR_FA
18fc0 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a  ULT ) r++; .  }.
18fd0 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65    return r;.}.#e
18fe0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
18ff0 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
19000 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f  e state to CURSO
19010 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20  R_FAULT and the 
19020 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f  error.** code to
19030 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65   errCode for eve
19040 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53  ry cursor on BtS
19050 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65  hared that pBtre
19060 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e  e.** references.
19070 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72  .**.** Every cur
19080 73 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c 20  sor is tripped, 
19090 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72  including cursor
190a0 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a  s that belong.**
190b0 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61   to other databa
190c0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
190d0 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65  hat happen to be
190e0 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20   sharing.** the 
190f0 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65  cache with pBtre
19100 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
19110 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65  utine gets calle
19120 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63  d when a rollbac
19130 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c  k occurs..** All
19140 20 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74   cursors using t
19150 68 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75  he same cache mu
19160 73 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a  st be tripped.**
19170 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d   to prevent them
19180 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20   from trying to 
19190 75 73 65 20 74 68 65 20 62 74 72 65 65 20 61 66  use the btree af
191a0 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  ter.** the rollb
191b0 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61  ack.  The rollba
191c0 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65  ck may have dele
191d0 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72  ted tables.** or
191e0 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65   moved root page
191f0 73 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20  s, so it is not 
19200 73 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a  sufficient to.**
19210 20 73 61 76 65 20 74 68 65 20 73 74 61 74 65 20   save the state 
19220 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  of the cursor.  
19230 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20  The cursor must 
19240 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  be.** invalidate
19250 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
19260 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
19270 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74  rsors(Btree *pBt
19280 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65  ree, int errCode
19290 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
192a0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
192b0 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
192c0 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
192d0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
192e0 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
192f0 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69   int i;.    sqli
19300 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
19310 73 6f 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65  sor(p);.    p->e
19320 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46  State = CURSOR_F
19330 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69  AULT;.    p->ski
19340 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b  pNext = errCode;
19350 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
19360 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  =p->iPage; i++){
19370 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
19380 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29  ge(p->apPage[i])
19390 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67  ;.      p->apPag
193a0 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  e[i] = 0;.    }.
193b0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
193c0 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
193d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
193e0 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
193f0 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20  on in progress. 
19400 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c   All cursors wil
19410 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65  l be.** invalide
19420 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
19430 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  ion.  Any attemp
19440 74 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f  t to use a curso
19450 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70  r.** that was op
19460 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  en at the beginn
19470 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72  ing of this oper
19480 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ation will resul
19490 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72  t.** in an error
194a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
194b0 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
194c0 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
194d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
194e0 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
194f0 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
19500 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
19510 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
19520 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
19530 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42  3BtreeRollback(B
19540 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
19550 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
19560 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
19570 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
19580 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
19590 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
195a0 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
195b0 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e  pBt, 0, 0);.#ifn
195c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
195d0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69  SHARED_CACHE.  i
195e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
195f0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
19600 69 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73 69  is a horrible si
19610 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f  tuation. An IO o
19620 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
19630 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74   occurred whilst
19640 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74  .    ** trying t
19650 6f 20 73 61 76 65 20 63 75 72 73 6f 72 20 70 6f  o save cursor po
19660 73 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73  sitions. If this
19670 20 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   is an automatic
19680 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20   rollback (as.  
19690 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20    ** the result 
196a0 6f 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c  of a constraint,
196b0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
196c0 65 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 74  e or IO error) t
196d0 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  hen .    ** the 
196e0 63 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e 74  cache may be int
196f0 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73  ernally inconsis
19700 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69  tent (not contai
19710 6e 20 76 61 6c 69 64 20 74 72 65 65 73 29 20 73  n valid trees) s
19720 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e  o.    ** we cann
19730 6f 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  ot simply return
19740 20 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74 68   the error to th
19750 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61  e caller. Instea
19760 64 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a  d, abort .    **
19770 20 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68 61   all queries tha
19780 74 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20 61  t may be using a
19790 6e 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  ny of the cursor
197a0 73 20 74 68 61 74 20 66 61 69 6c 65 64 20 74 6f  s that failed to
197b0 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   save..    */.  
197c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72    sqlite3BtreeTr
197d0 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20  ipAllCursors(p, 
197e0 72 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  rc);.  }.#endif.
197f0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
19800 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  (p);..  if( p->i
19810 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
19820 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ITE ){.    int r
19830 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  c2;..    assert(
19840 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42   TRANS_WRITE==pB
19850 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
19860 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71   );.    rc2 = sq
19870 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
19880 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
19890 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51  .    if( rc2!=SQ
198a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
198b0 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
198c0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c  ..    /* The rol
198d0 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64  lback may have d
198e0 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61  estroyed the pPa
198f0 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65  ge1->aData value
19900 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c  .  So.    ** cal
19910 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29  l btreeGetPage()
19920 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e   on page 1 again
19930 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   to make.    ** 
19940 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61  sure pPage1->aDa
19950 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63  ta is set correc
19960 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  tly. */.    if( 
19970 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
19980 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
19990 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
199a0 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d       int nPage =
199b0 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38   get4byte(28+(u8
199c0 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  *)pPage1->aData)
199d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
199e0 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  ( nPage==0 );.  
199f0 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
19a00 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   ) sqlite3PagerP
19a10 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
19a20 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
19a30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
19a40 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65  Bt->nPage!=nPage
19a50 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   );.      pBt->n
19a60 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Page = nPage;.  
19a70 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
19a80 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20  pPage1);.    }. 
19a90 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74     assert( count
19aa0 57 72 69 74 65 43 75 72 73 6f 72 73 28 70 42 74  WriteCursors(pBt
19ab0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==0 );.    pBt-
19ac0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
19ad0 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d   TRANS_READ;.  }
19ae0 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e  ..  btreeEndTran
19af0 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71  saction(p);.  sq
19b00 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
19b10 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
19b20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20  .}../*.** Start 
19b30 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74  a statement subt
19b40 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
19b50 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  subtransaction c
19b60 61 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  an can be rolled
19b70 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e  .** back indepen
19b80 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61  dently of the ma
19b90 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  in transaction. 
19ba0 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61  You must start a
19bb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
19bc0 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67   before starting
19bd0 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f   a subtransactio
19be0 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
19bf0 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61  ction is ended a
19c00 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
19c10 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   if the main tra
19c20 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73  nsaction commits
19c30 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a   or rolls back..
19c40 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20  **.** Statement 
19c50 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  subtransactions 
19c60 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20  are used around 
19c70 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73  individual SQL s
19c80 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61  tatements.** tha
19c90 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  t are contained 
19ca0 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e  within a BEGIN..
19cb0 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20  .COMMIT block.  
19cc0 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a  If a constraint.
19cd0 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ** error occurs 
19ce0 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
19cf0 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74  ment, the effect
19d00 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61   of that one sta
19d10 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65  tement.** can be
19d20 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74   rolled back wit
19d30 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72  hout having to r
19d40 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69  ollback the enti
19d50 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  re transaction..
19d60 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e  **.** A statemen
19d70 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f  t sub-transactio
19d80 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
19d90 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73   as an anonymous
19da0 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a   savepoint. The.
19db0 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  ** value passed 
19dc0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  as the second pa
19dd0 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74  rameter is the t
19de0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
19df0 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e  avepoints,.** in
19e00 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20  cluding the new 
19e10 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
19e20 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65  int, open on the
19e30 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66   B-Tree. i.e. if
19e40 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
19e50 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
19e60 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  ts and no other 
19e70 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
19e80 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20  ctions open,.** 
19e90 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e  iStatement is 1.
19ea0 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20   This anonymous 
19eb0 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65  savepoint can be
19ec0 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c   released or rol
19ed0 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e  led back.** usin
19ee0 67 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  g the sqlite3Btr
19ef0 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75  eeSavepoint() fu
19f00 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
19f10 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
19f20 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69  Stmt(Btree *p, i
19f30 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a  nt iStatement){.
19f40 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
19f50 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
19f60 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  Bt;.  sqlite3Btr
19f70 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
19f80 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
19f90 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
19fa0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
19fb0 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20  readOnly==0 );. 
19fc0 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d   assert( iStatem
19fd0 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ent>0 );.  asser
19fe0 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d  t( iStatement>p-
19ff0 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  >db->nSavepoint 
1a000 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
1a010 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1a020 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
1a030 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65    /* At the page
1a040 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65  r level, a state
1a050 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
1a060 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
1a070 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64  with.  ** an ind
1a080 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ex greater than 
1a090 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63  all savepoints c
1a0a0 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c  reated explicitl
1a0b0 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c  y using.  ** SQL
1a0c0 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20   statements. It 
1a0d0 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70  is illegal to op
1a0e0 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72  en, release or r
1a0f0 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a  ollback any.  **
1a100 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73   such savepoints
1a110 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65   while the state
1a120 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
1a130 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63   savepoint is ac
1a140 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tive..  */.  rc 
1a150 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
1a160 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  enSavepoint(pBt-
1a170 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d  >pPager, iStatem
1a180 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ent);.  sqlite3B
1a190 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1a1a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1a1b0 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
1a1c0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
1a1d0 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73  function, op, is
1a1e0 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e   always SAVEPOIN
1a1f0 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72  T_ROLLBACK.** or
1a200 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
1a210 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  SE. This functio
1a220 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65  n either release
1a230 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20  s or rolls back 
1a240 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  the.** savepoint
1a250 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
1a260 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f  arameter iSavepo
1a270 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  int, depending o
1a280 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20  n the value .** 
1a290 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72  of op..**.** Nor
1a2a0 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e  mally, iSavepoin
1a2b0 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
1a2c0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
1a2d0 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ro. However, if 
1a2e0 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49  op is.** SAVEPOI
1a2f0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
1a300 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79  n iSavepoint may
1a310 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20   also be -1. In 
1a320 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a  this case the .*
1a330 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
1a340 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
1a350 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20  tion are rolled 
1a360 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69  back. This is di
1a370 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20  fferent.** from 
1a380 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63  a normal transac
1a390 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  tion rollback, a
1a3a0 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72  s no locks are r
1a3b0 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a  eleased and the.
1a3c0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  ** transaction r
1a3d0 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a  emains open..*/.
1a3e0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1a3f0 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20  Savepoint(Btree 
1a400 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
1a410 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  iSavepoint){.  i
1a420 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1a430 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  K;.  if( p && p-
1a440 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1a450 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
1a460 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1a470 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
1a480 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
1a490 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41  ELEASE || op==SA
1a4a0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1a4b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1a4c0 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c  iSavepoint>=0 ||
1a4d0 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31   (iSavepoint==-1
1a4e0 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   && op==SAVEPOIN
1a4f0 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20  T_ROLLBACK) );. 
1a500 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
1a510 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20  nter(p);.    rc 
1a520 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61  = sqlite3PagerSa
1a530 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
1a540 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f  ger, op, iSavepo
1a550 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  int);.    if( rc
1a560 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a570 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70 6f       if( iSavepo
1a580 69 6e 74 3c 30 20 26 26 20 70 42 74 2d 3e 69 6e  int<0 && pBt->in
1a590 69 74 69 61 6c 6c 79 45 6d 70 74 79 20 29 20 70  itiallyEmpty ) p
1a5a0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20  Bt->nPage = 0;. 
1a5b0 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
1a5c0 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
1a5d0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67    pBt->nPage = g
1a5e0 65 74 34 62 79 74 65 28 32 38 20 2b 20 70 42 74  et4byte(28 + pBt
1a5f0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  ->pPage1->aData)
1a600 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  ;.      if( pBt-
1a610 3e 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >nPage==0 ){.   
1a620 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1a630 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
1a640 70 50 61 67 65 72 2c 20 28 69 6e 74 2a 29 26 70  pPager, (int*)&p
1a650 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
1a660 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
1a670 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1a680 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
1a690 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
1a6a0 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f  eate a new curso
1a6b0 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20  r for the BTree 
1a6c0 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e  whose root is on
1a6d0 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61   the page.** iTa
1a6e0 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f  ble. If a read-o
1a6f0 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72 65  nly cursor is re
1a700 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 61  quested, it is a
1a710 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74  ssumed that.** t
1a720 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64  he caller alread
1a730 79 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 61  y has at least a
1a740 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
1a750 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f  action open.** o
1a760 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
1a770 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77 72 69  lready. If a wri
1a780 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71  te-cursor is req
1a790 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20  uested, then.** 
1a7a0 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73  the caller is as
1a7b0 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e  sumed to have an
1a7c0 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
1a7d0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  saction..**.** I
1a7e0 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65  f wrFlag==0, the
1a7f0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
1a800 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f   only be used fo
1a810 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66  r reading..** If
1a820 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e   wrFlag==1, then
1a830 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
1a840 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
1a850 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72  ing or for.** wr
1a860 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63  iting if other c
1a870 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72  onditions for wr
1a880 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d  iting are also m
1a890 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72  et.  These.** ar
1a8a0 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  e the conditions
1a8b0 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65   that must be me
1a8c0 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77  t in order for w
1a8d0 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20  riting to.** be 
1a8e0 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31  allowed:.**.** 1
1a8f0 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  :  The cursor mu
1a900 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  st have been ope
1a910 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d  ned with wrFlag=
1a920 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68  =1.**.** 2:  Oth
1a930 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
1a940 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61  ections that sha
1a950 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  re the same page
1a960 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62  r cache.**     b
1a970 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ut which are not
1a980 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43   in the READ_UNC
1a990 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d  OMMITTED state m
1a9a0 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20  ay not have.**  
1a9b0 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20     cursors open 
1a9c0 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f  with wrFlag==0 o
1a9d0 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
1a9e0 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  .  Otherwise.** 
1a9f0 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20      the changes 
1aa00 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69  made by this wri
1aa10 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  te cursor would 
1aa20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a  be visible to.**
1aa30 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75       the read cu
1aa40 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68  rsors in the oth
1aa50 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
1aa60 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a  ection..**.** 3:
1aa70 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d    The database m
1aa80 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20  ust be writable 
1aa90 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c  (not on read-onl
1aaa0 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34  y media).**.** 4
1aab0 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  :  There must be
1aac0 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73   an active trans
1aad0 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  action..**.** No
1aae0 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e   checking is don
1aaf0 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
1ab00 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20  hat page iTable 
1ab10 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a  really is the.**
1ab20 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
1ab30 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69  b-tree.  If it i
1ab40 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
1ab50 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a  cursor acquired.
1ab60 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b  ** will not work
1ab70 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a   correctly..**.*
1ab80 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  * It is assumed 
1ab90 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
1aba0 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28  BtreeCursorZero(
1abb0 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  ) has been calle
1abc0 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20  d.** on pCur to 
1abd0 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d  initialize the m
1abe0 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f  emory space prio
1abf0 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68  r to invoking th
1ac00 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  is routine..*/.s
1ac10 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43  tatic int btreeC
1ac20 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
1ac30 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1ac40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac50 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
1ac60 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1ac70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
1ac90 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
1aca0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
1acb0 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
1acc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acd0 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
1ace0 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
1acf0 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
1ad00 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
1ad10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1ad20 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72  st arg to compar
1ad30 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ison function */
1ad40 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
1ad50 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
1ad60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
1ad70 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f  ce for new curso
1ad80 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  r */.){.  BtShar
1ad90 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1ada0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1adb0 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65   /* Shared b-tre
1adc0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20 61  e handle */..  a
1add0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
1ade0 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
1adf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
1ae00 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61  Flag==0 || wrFla
1ae10 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  g==1 );..  /* Th
1ae20 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
1ae30 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65  rt statements ve
1ae40 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68 69  rify that if thi
1ae50 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65 20  s is a sharable 
1ae60 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74  .  ** b-tree dat
1ae70 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65  abase, the conne
1ae80 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
1ae90 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61   the required ta
1aea0 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a  ble locks, .  **
1aeb0 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68   and that no oth
1aec0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
1aed0 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f  s any open curso
1aee0 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  r that conflicts
1aef0 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73   with .  ** this
1af00 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73   lock.  */.  ass
1af10 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61  ert( hasSharedCa
1af20 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
1af30 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f  iTable, pKeyInfo
1af40 21 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29 20 29  !=0, wrFlag+1) )
1af50 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
1af60 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61  ag==0 || !hasRea
1af70 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54  dConflicts(p, iT
1af80 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41  able) );..  /* A
1af90 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63  ssert that the c
1afa0 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64  aller has opened
1afb0 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 72   the required tr
1afc0 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20  ansaction. */.  
1afd0 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
1afe0 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b  ns>TRANS_NONE );
1aff0 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
1b000 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61  g==0 || p->inTra
1b010 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1b020 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
1b030 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74 2d  ->pPage1 && pBt-
1b040 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
1b050 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 77  ;..  if( NEVER(w
1b060 72 46 6c 61 67 20 26 26 20 70 42 74 2d 3e 72 65  rFlag && pBt->re
1b070 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 72  adOnly) ){.    r
1b080 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
1b090 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
1b0a0 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74   iTable==1 && bt
1b0b0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
1b0c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
1b0d0 72 6e 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b  rn SQLITE_EMPTY;
1b0e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74  .  }..  /* Now t
1b0f0 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72  hat no other err
1b100 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66  ors can occur, f
1b110 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e  inish filling in
1b120 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20   the BtCursor.  
1b130 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64  ** variables and
1b140 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72   link the cursor
1b150 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72   into the BtShar
1b160 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70  ed list.  */.  p
1b170 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20  Cur->pgnoRoot = 
1b180 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20  (Pgno)iTable;.  
1b190 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31  pCur->iPage = -1
1b1a0 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ;.  pCur->pKeyIn
1b1b0 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
1b1c0 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20   pCur->pBtree = 
1b1d0 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d  p;.  pCur->pBt =
1b1e0 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77 72   pBt;.  pCur->wr
1b1f0 46 6c 61 67 20 3d 20 28 75 38 29 77 72 46 6c 61  Flag = (u8)wrFla
1b200 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  g;.  pCur->pNext
1b210 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
1b220 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65  .  if( pCur->pNe
1b230 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  xt ){.    pCur->
1b240 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
1b250 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e  Cur;.  }.  pBt->
1b260 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a  pCursor = pCur;.
1b270 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
1b280 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
1b290 0a 20 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52  .  pCur->cachedR
1b2a0 6f 77 69 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  owid = 0;.  retu
1b2b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1b2c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1b2d0 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
1b2e0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1b2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b300 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
1b310 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
1b320 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
1b330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b340 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1b350 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
1b360 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
1b370 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
1b380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b390 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
1b3a0 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
1b3b0 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
1b3c0 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
1b3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b3e0 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78  * First arg to x
1b3f0 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42  Compare() */.  B
1b400 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
1b410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
1b430 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68  ite new cursor h
1b440 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
1b450 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
1b460 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
1b470 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70   = btreeCursor(p
1b480 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67  , iTable, wrFlag
1b490 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72  , pKeyInfo, pCur
1b4a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1b4b0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1b4c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1b4d0 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
1b4e0 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f   of a BtCursor o
1b4f0 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a  bject in bytes..
1b500 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72  **.** This inter
1b510 66 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20  faces is needed 
1b520 73 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66  so that users of
1b530 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65   cursors can pre
1b540 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66  allocate.** suff
1b550 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74  icient storage t
1b560 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e  o hold a cursor.
1b570 20 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f    The BtCursor o
1b580 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a  bject is opaque.
1b590 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74  ** to users so t
1b5a0 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68  hey cannot do th
1b5b0 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73  e sizeof() thems
1b5c0 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73  elves - they mus
1b5d0 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72  t call.** this r
1b5e0 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73  outine..*/.int s
1b5f0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1b600 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72  rSize(void){.  r
1b610 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a  eturn ROUND8(siz
1b620 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a  eof(BtCursor));.
1b630 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
1b640 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20  ize memory that 
1b650 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65  will be converte
1b660 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f  d into a BtCurso
1b670 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  r object..**.** 
1b680 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f  The simple appro
1b690 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62  ach here would b
1b6a0 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68  e to memset() th
1b6b0 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a  e entire object.
1b6c0 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74  ** to zero.  But
1b6d0 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68   it turns out th
1b6e0 61 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20  at the apPage[] 
1b6f0 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61  and aiIdx[] arra
1b700 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65  ys.** do not nee
1b710 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61  d to be zeroed a
1b720 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61 72 67  nd they are larg
1b730 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76  e, so we can sav
1b740 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75  e a lot.** of ru
1b750 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69  n-time by skippi
1b760 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  ng the initializ
1b770 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65  ation of those e
1b780 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64  lements..*/.void
1b790 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1b7a0 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72  sorZero(BtCursor
1b7b0 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70   *p){.  memset(p
1b7c0 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74  , 0, offsetof(Bt
1b7d0 43 75 72 73 6f 72 2c 20 69 50 61 67 65 29 29 3b  Cursor, iPage));
1b7e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
1b7f0 65 20 63 61 63 68 65 64 20 72 6f 77 69 64 20 76  e cached rowid v
1b800 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 63 75  alue of every cu
1b810 72 73 6f 72 20 69 6e 20 74 68 65 20 73 61 6d 65  rsor in the same
1b820 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a   database file.*
1b830 2a 20 61 73 20 70 43 75 72 20 61 6e 64 20 68 61  * as pCur and ha
1b840 76 69 6e 67 20 74 68 65 20 73 61 6d 65 20 72 6f  ving the same ro
1b850 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  ot page number a
1b860 73 20 70 43 75 72 2e 20 20 54 68 65 20 76 61 6c  s pCur.  The val
1b870 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ue is.** set to 
1b880 69 52 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  iRowid..**.** On
1b890 6c 79 20 70 6f 73 69 74 69 76 65 20 72 6f 77 69  ly positive rowi
1b8a0 64 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e  d values are con
1b8b0 73 69 64 65 72 65 64 20 76 61 6c 69 64 20 66 6f  sidered valid fo
1b8c0 72 20 74 68 69 73 20 63 61 63 68 65 2e 0a 2a 2a  r this cache..**
1b8d0 20 54 68 65 20 63 61 63 68 65 20 69 73 20 69 6e   The cache is in
1b8e0 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72  itialized to zer
1b8f0 6f 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e  o, indicating an
1b900 20 69 6e 76 61 6c 69 64 20 63 61 63 68 65 2e 0a   invalid cache..
1b910 2a 2a 20 41 20 62 74 72 65 65 20 77 69 6c 6c 20  ** A btree will 
1b920 77 6f 72 6b 20 66 69 6e 65 20 77 69 74 68 20 7a  work fine with z
1b930 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20  ero or negative 
1b940 72 6f 77 69 64 73 2e 20 20 57 65 20 6a 75 73 74  rowids.  We just
1b950 20 63 61 6e 6e 6f 74 0a 2a 2a 20 63 61 63 68 65   cannot.** cache
1b960 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76   zero or negativ
1b970 65 20 72 6f 77 69 64 73 2c 20 77 68 69 63 68 20  e rowids, which 
1b980 6d 65 61 6e 73 20 74 61 62 6c 65 73 20 74 68 61  means tables tha
1b990 74 20 75 73 65 20 7a 65 72 6f 20 6f 72 0a 2a 2a  t use zero or.**
1b9a0 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73   negative rowids
1b9b0 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74   might run a lit
1b9c0 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 42 75 74  tle slower.  But
1b9d0 20 69 6e 20 70 72 61 63 74 69 63 65 2c 20 7a 65   in practice, ze
1b9e0 72 6f 0a 2a 2a 20 6f 72 20 6e 65 67 61 74 69 76  ro.** or negativ
1b9f0 65 20 72 6f 77 69 64 73 20 61 72 65 20 76 65 72  e rowids are ver
1ba00 79 20 75 6e 63 6f 6d 6d 6f 6e 20 73 6f 20 74 68  y uncommon so th
1ba10 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  is should not be
1ba20 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76   a problem..*/.v
1ba30 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
1ba40 53 65 74 43 61 63 68 65 64 52 6f 77 69 64 28 42  SetCachedRowid(B
1ba50 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 73  tCursor *pCur, s
1ba60 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 52 6f  qlite3_int64 iRo
1ba70 77 69 64 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  wid){.  BtCursor
1ba80 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 43 75   *p;.  for(p=pCu
1ba90 72 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  r->pBt->pCursor;
1baa0 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
1bab0 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f  .    if( p->pgno
1bac0 52 6f 6f 74 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f  Root==pCur->pgno
1bad0 52 6f 6f 74 20 29 20 70 2d 3e 63 61 63 68 65 64  Root ) p->cached
1bae0 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a  Rowid = iRowid;.
1baf0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
1bb00 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 3d  ur->cachedRowid=
1bb10 3d 69 52 6f 77 69 64 20 29 3b 0a 7d 0a 0a 2f 2a  =iRowid );.}../*
1bb20 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
1bb30 61 63 68 65 64 20 72 6f 77 69 64 20 66 6f 72 20  ached rowid for 
1bb40 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72  the given cursor
1bb50 2e 20 20 41 20 6e 65 67 61 74 69 76 65 20 6f 72  .  A negative or
1bb60 20 7a 65 72 6f 0a 2a 2a 20 72 65 74 75 72 6e 20   zero.** return 
1bb70 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 20  value indicates 
1bb80 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 63  that the rowid c
1bb90 61 63 68 65 20 69 73 20 69 6e 76 61 6c 69 64 20  ache is invalid 
1bba0 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a  and should be.**
1bbb0 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 74 68   ignored.  If th
1bbc0 65 20 72 6f 77 69 64 20 63 61 63 68 65 20 68 61  e rowid cache ha
1bbd0 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62  s never before b
1bbe0 65 65 6e 20 73 65 74 2c 20 74 68 65 6e 20 61 0a  een set, then a.
1bbf0 2a 2a 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72  ** zero is retur
1bc00 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  ned..*/.sqlite3_
1bc10 69 6e 74 36 34 20 73 71 6c 69 74 65 33 42 74 72  int64 sqlite3Btr
1bc20 65 65 47 65 74 43 61 63 68 65 64 52 6f 77 69 64  eeGetCachedRowid
1bc30 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1bc40 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d  {.  return pCur-
1bc50 3e 63 61 63 68 65 64 52 6f 77 69 64 3b 0a 7d 0a  >cachedRowid;.}.
1bc60 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
1bc70 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64  ursor.  The read
1bc80 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1bc90 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65  abase file is re
1bca0 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74  leased.** when t
1bcb0 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69  he last cursor i
1bcc0 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
1bcd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
1bce0 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  seCursor(BtCurso
1bcf0 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65  r *pCur){.  Btre
1bd00 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72  e *pBtree = pCur
1bd10 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20  ->pBtree;.  if( 
1bd20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e  pBtree ){.    in
1bd30 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65  t i;.    BtShare
1bd40 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
1bd50 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
1bd60 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
1bd70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
1bd80 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
1bd90 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43  Cur);.    if( pC
1bda0 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  ur->pPrev ){.   
1bdb0 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e     pCur->pPrev->
1bdc0 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e  pNext = pCur->pN
1bdd0 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
1bde0 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73        pBt->pCurs
1bdf0 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  or = pCur->pNext
1be00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1be10 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  pCur->pNext ){. 
1be20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74       pCur->pNext
1be30 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e  ->pPrev = pCur->
1be40 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20  pPrev;.    }.   
1be50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
1be60 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
1be70 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1be80 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  e(pCur->apPage[i
1be90 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e  ]);.    }.    un
1bea0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
1beb0 64 28 70 42 74 29 3b 0a 20 20 20 20 69 6e 76 61  d(pBt);.    inva
1bec0 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61  lidateOverflowCa
1bed0 63 68 65 28 70 43 75 72 29 3b 0a 20 20 20 20 2f  che(pCur);.    /
1bee0 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70  * sqlite3_free(p
1bef0 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c  Cur); */.    sql
1bf00 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1bf10 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65  Btree);.  }.  re
1bf20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1bf30 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
1bf40 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a  re the BtCursor*
1bf50 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
1bf60 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c  gument has a val
1bf70 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  id.** BtCursor.i
1bf80 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
1bf90 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  If it is not alr
1bfa0 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c  eady valid, call
1bfb0 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
1bfc0 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20  ll() to fill it 
1bfd0 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73  in..**.** BtCurs
1bfe0 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63  or.info is a cac
1bff0 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d  he of the inform
1c000 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72  ation in the cur
1c010 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73  rent cell..** Us
1c020 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72  ing this cache r
1c030 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65  educes the numbe
1c040 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74  r of calls to bt
1c050 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a  reeParseCell()..
1c060 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35  **.** 2007-06-25
1c070 3a 20 20 54 68 65 72 65 20 69 73 20 61 20 62 75  :  There is a bu
1c080 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f  g in some versio
1c090 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74 20  ns of MSVC that 
1c0a0 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d  cause the.** com
1c0b0 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20 77  piler to crash w
1c0c0 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  hen getCellInfo(
1c0d0 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  ) is implemented
1c0e0 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20   as a macro..** 
1c0f0 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20 6d  But there is a m
1c100 65 61 73 75 72 65 61 62 6c 65 20 73 70 65 65 64  easureable speed
1c110 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73   advantage to us
1c120 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e  ing the macro on
1c130 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65   gcc.** (when le
1c140 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69  ss compiler opti
1c150 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d  mizations like -
1c160 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75 73  Os or -O0 are us
1c170 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f  ed and the.** co
1c180 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f  mpiler is not do
1c190 69 6e 67 20 61 67 72 65 73 73 69 76 65 20 69 6e  ing agressive in
1c1a0 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20  lining.)  So we 
1c1b0 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74  use a real funct
1c1c0 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20  ion.** for MSVC 
1c1d0 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20  and a macro for 
1c1e0 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e  everything else.
1c1f0 20 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0a    Ticket #2457..
1c200 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
1c210 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  G.  static void 
1c220 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42  assertCellInfo(B
1c230 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1c240 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
1c250 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65  o;.    int iPage
1c260 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
1c270 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f      memset(&info
1c280 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  , 0, sizeof(info
1c290 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72  ));.    btreePar
1c2a0 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
1c2b0 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72  age[iPage], pCur
1c2c0 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20  ->aiIdx[iPage], 
1c2d0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
1c2e0 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f  rt( memcmp(&info
1c2f0 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73  , &pCur->info, s
1c300 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20  izeof(info))==0 
1c310 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23  );.  }.#else.  #
1c320 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c  define assertCel
1c330 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a  lInfo(x).#endif.
1c340 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a  #ifdef _MSC_VER.
1c350 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20    /* Use a real 
1c360 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43  function in MSVC
1c370 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   to work around 
1c380 62 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d  bugs in that com
1c390 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74  piler. */.  stat
1c3a0 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49  ic void getCellI
1c3b0 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
1c3c0 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  ur){.    if( pCu
1c3d0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
1c3e0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50   ){.      int iP
1c3f0 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
1c400 65 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50 61  e;.      btreePa
1c410 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
1c420 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72  Page[iPage],pCur
1c430 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26  ->aiIdx[iPage],&
1c440 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20  pCur->info);.   
1c450 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
1c460 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ey = 1;.    }els
1c470 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 43  e{.      assertC
1c480 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1c490 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f     }.  }.#else /
1c4a0 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45  * if not _MSC_VE
1c4b0 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20  R */.  /* Use a 
1c4c0 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68  macro in all oth
1c4d0 65 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20  er compilers so 
1c4e0 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f  that the functio
1c4f0 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a  n is inlined */.
1c500 23 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49  #define getCellI
1c510 6e 66 6f 28 70 43 75 72 29 20 20 20 20 20 20 20  nfo(pCur)       
1c520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1c550 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66  .  if( pCur->inf
1c560 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20  o.nSize==0 ){   
1c570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5a0 5c 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  \.    int iPage 
1c5b0 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 20  = pCur->iPage;  
1c5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5f0 20 5c 0a 20 20 20 20 62 74 72 65 65 50 61 72 73   \.    btreePars
1c600 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
1c610 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e  ge[iPage],pCur->
1c620 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43  aiIdx[iPage],&pC
1c630 75 72 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20 20  ur->info); \.   
1c640 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
1c650 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
1c660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c680 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1c690 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20  }else{          
1c6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1c6e0 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66     assertCellInf
1c6f0 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20 20 20  o(pCur);        
1c700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1c730 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d    }.#endif /* _M
1c740 53 43 5f 56 45 52 20 2a 2f 0a 0a 23 69 66 6e 64  SC_VER */..#ifnd
1c750 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54 68  ef NDEBUG  /* Th
1c760 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20 75  e next routine u
1c770 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20  sed only within 
1c780 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1c790 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74  nts */./*.** Ret
1c7a0 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
1c7b0 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20 69  given BtCursor i
1c7c0 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c 69  s valid.  A vali
1c7d0 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a  d cursor is one.
1c7e0 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72 72 65  ** that is curre
1c7f0 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ntly pointing to
1c800 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e   a row in a (non
1c810 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a  -empty) table..*
1c820 2a 20 54 68 69 73 20 69 73 20 61 20 76 65 72 69  * This is a veri
1c830 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65  fication routine
1c840 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77 69   is used only wi
1c850 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  thin assert() st
1c860 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74  atements..*/.int
1c870 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1c880 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75 72  sorIsValid(BtCur
1c890 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65  sor *pCur){.  re
1c8a0 74 75 72 6e 20 70 43 75 72 20 26 26 20 70 43 75  turn pCur && pCu
1c8b0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1c8c0 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69  R_VALID;.}.#endi
1c8d0 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a  f /* NDEBUG */..
1c8e0 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65  /*.** Set *pSize
1c8f0 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
1c900 74 68 65 20 62 75 66 66 65 72 20 6e 65 65 64 65  the buffer neede
1c910 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61  d to hold the va
1c920 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65  lue of.** the ke
1c930 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  y for the curren
1c940 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65  t entry.  If the
1c950 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
1c960 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20  ointing.** to a 
1c970 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53  valid entry, *pS
1c980 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e  ize is set to 0.
1c990 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61   .**.** For a ta
1c9a0 62 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e 54  ble with the INT
1c9b0 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68  KEY flag set, th
1c9c0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1c9d0 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74  ns the key.** it
1c9e0 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75  self, not the nu
1c9f0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
1ca00 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20   the key..**.** 
1ca10 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
1ca20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 75 72  position the cur
1ca30 73 6f 72 20 70 72 69 6f 72 20 74 6f 20 69 6e 76  sor prior to inv
1ca40 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  oking this routi
1ca50 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  ne..** .** This 
1ca60 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66  routine cannot f
1ca70 61 69 6c 2e 20 20 49 74 20 61 6c 77 61 79 73 20  ail.  It always 
1ca80 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
1ca90 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  K.  .*/.int sqli
1caa0 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
1cab0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1cac0 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61  i64 *pSize){.  a
1cad0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1cae0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1caf0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1cb00 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1cb10 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  INVALID || pCur-
1cb20 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1cb30 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70  VALID );.  if( p
1cb40 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
1cb50 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
1cb60 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d   *pSize = 0;.  }
1cb70 65 6c 73 65 7b 0a 20 20 20 20 67 65 74 43 65 6c  else{.    getCel
1cb80 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
1cb90 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e   *pSize = pCur->
1cba0 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20  info.nKey;.  }. 
1cbb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1cbc0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
1cbd0 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75  *pSize to the nu
1cbe0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
1cbf0 20 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74   data in the ent
1cc00 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  ry the.** cursor
1cc10 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1cc20 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  s to..**.** The 
1cc30 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72  caller must guar
1cc40 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 63  antee that the c
1cc50 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
1cc60 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a  g to a non-NULL.
1cc70 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20  ** valid entry. 
1cc80 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1cc90 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   the calling pro
1cca0 63 65 64 75 72 65 20 6d 75 73 74 20 67 75 61 72  cedure must guar
1ccb0 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68  antee.** that th
1ccc0 65 20 63 75 72 73 6f 72 20 68 61 73 20 43 75 72  e cursor has Cur
1ccd0 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53  sor.eState==CURS
1cce0 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20  OR_VALID..**.** 
1ccf0 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70  Failure is not p
1cd00 6f 73 73 69 62 6c 65 2e 20 20 54 68 69 73 20 66  ossible.  This f
1cd10 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 72  unction always r
1cd20 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
1cd30 2e 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a 75  ..** It might ju
1cd40 73 74 20 61 73 20 77 65 6c 6c 20 62 65 20 61 20  st as well be a 
1cd50 70 72 6f 63 65 64 75 72 65 20 28 72 65 74 75 72  procedure (retur
1cd60 6e 69 6e 67 20 76 6f 69 64 29 20 62 75 74 20 77  ning void) but w
1cd70 65 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f  e continue.** to
1cd80 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   return an integ
1cd90 65 72 20 72 65 73 75 6c 74 20 63 6f 64 65 20 66  er result code f
1cda0 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65  or historical re
1cdb0 61 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  asons..*/.int sq
1cdc0 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69  lite3BtreeDataSi
1cdd0 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ze(BtCursor *pCu
1cde0 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a  r, u32 *pSize){.
1cdf0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1ce00 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1ce10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1ce20 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1ce30 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65  OR_VALID );.  ge
1ce40 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
1ce50 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72  .  *pSize = pCur
1ce60 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20  ->info.nData;.  
1ce70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ce80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
1ce90 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1cea0 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   of an overflow 
1ceb0 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
1cec0 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a  base (parameter.
1ced0 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66  ** ovfl), this f
1cee0 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68  unction finds th
1cef0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
1cf00 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
1cf10 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64  n the .** linked
1cf20 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f   list of overflo
1cf30 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73  w pages. If poss
1cf40 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68  ible, it uses th
1cf50 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  e auto-vacuum.**
1cf60 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74   pointer-map dat
1cf70 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61  a instead of rea
1cf80 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ding the content
1cf90 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f   of page ovfl to
1cfa0 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49   do so. .**.** I
1cfb0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1cfc0 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  s an SQLite erro
1cfd0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1cfe0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a  ed. Otherwise:.*
1cff0 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75  *.** The page nu
1d000 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
1d010 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
1d020 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
1d030 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e  t is .** written
1d040 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20   to *pPgnoNext. 
1d050 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20  If page ovfl is 
1d060 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
1d070 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20   its linked .** 
1d080 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74  list, *pPgnoNext
1d090 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
1d0a0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67   .**.** If ppPag
1d0b0 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61  e is not NULL, a
1d0c0 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  nd a reference t
1d0d0 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62  o the MemPage ob
1d0e0 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69  ject correspondi
1d0f0 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75  ng.** to page nu
1d100 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f  mber pOvfl was o
1d110 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70  btained, then *p
1d120 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
1d130 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a  point to that.**
1d140 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69   reference. It i
1d150 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
1d160 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
1d170 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61  er to call relea
1d180 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a  sePage().** on *
1d190 70 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74  ppPage to free t
1d1a0 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e  he reference. In
1d1b0 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61   no reference wa
1d1c0 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61  s obtained (beca
1d1d0 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74  use.** the point
1d1e0 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20  er-map was used 
1d1f0 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61  to obtain the va
1d200 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65  lue for *pPgnoNe
1d210 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70  xt), then.** *pp
1d220 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a  Page is set to z
1d230 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
1d240 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  nt getOverflowPa
1d250 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
1d260 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pBt,            
1d270 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
1d280 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
1d290 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20  o ovfl,         
1d2a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1d2b0 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  rent overflow pa
1d2c0 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d  ge number */.  M
1d2d0 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
1d2e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1d2f0 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64  UT: MemPage hand
1d300 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29  le (may be NULL)
1d310 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
1d320 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20  oNext           
1d330 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20     /* OUT: Next 
1d340 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
1d350 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e  mber */.){.  Pgn
1d360 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65  o next = 0;.  Me
1d370 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
1d380 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1d390 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
1d3a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1d3b0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1d3c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  ) );.  assert(pP
1d3d0 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64  gnoNext);..#ifnd
1d3e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1d3f0 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54  UTOVACUUM.  /* T
1d400 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e  ry to find the n
1d410 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
1d420 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73  overflow list us
1d430 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74  ing the.  ** aut
1d440 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d  ovacuum pointer-
1d450 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73  map pages. Guess
1d460 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70   that the next p
1d470 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65  age in .  ** the
1d480 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69   overflow list i
1d490 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  s page number (o
1d4a0 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20  vfl+1). If that 
1d4b0 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a  guess turns .  *
1d4c0 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e  * out to be wron
1d4d0 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  g, fall back to 
1d4e0 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  loading the data
1d4f0 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e   of page .  ** n
1d500 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65  umber ovfl to de
1d510 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74  termine the next
1d520 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20   page number..  
1d530 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  */.  if( pBt->au
1d540 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
1d550 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50  Pgno pgno;.    P
1d560 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66  gno iGuess = ovf
1d570 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70  l+1;.    u8 eTyp
1d580 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50  e;..    while( P
1d590 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1d5a0 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75  , iGuess) || iGu
1d5b0 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ess==PENDING_BYT
1d5c0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1d5d0 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20       iGuess++;. 
1d5e0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47     }..    if( iG
1d5f0 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63  uess<=btreePagec
1d600 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
1d610 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
1d620 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26  t(pBt, iGuess, &
1d630 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20  eType, &pgno);. 
1d640 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1d650 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d  ITE_OK && eType=
1d660 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
1d670 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20  2 && pgno==ovfl 
1d680 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20  ){.        next 
1d690 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20  = iGuess;.      
1d6a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
1d6b0 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
1d6c0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1d6d0 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20  assert( next==0 
1d6e0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  || rc==SQLITE_DO
1d6f0 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  NE );.  if( rc==
1d700 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d710 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
1d720 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70  ge(pBt, ovfl, &p
1d730 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 61 73  Page, 0);.    as
1d740 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
1d750 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20  _OK || pPage==0 
1d760 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1d770 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d780 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74    next = get4byt
1d790 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  e(pPage->aData);
1d7a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
1d7b0 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b  PgnoNext = next;
1d7c0 0a 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b  .  if( ppPage ){
1d7d0 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70  .    *ppPage = p
1d7e0 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Page;.  }else{. 
1d7f0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1d800 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
1d810 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
1d820 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  DONE ? SQLITE_OK
1d830 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   : rc);.}../*.**
1d840 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
1d850 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61  a buffer to a pa
1d860 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61  ge, or from a pa
1d870 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a  ge to a buffer..
1d880 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69  **.** pPayload i
1d890 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  s a pointer to d
1d8a0 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61  ata stored on da
1d8b0 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
1d8c0 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d  age..** If argum
1d8d0 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65  ent eOp is false
1d8e0 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74  , then nByte byt
1d8f0 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  es of data are c
1d900 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50  opied.** from pP
1d910 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75  ayload to the bu
1d920 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20  ffer pointed at 
1d930 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20  by pBuf. If eOp 
1d940 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e  is true,.** then
1d950 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1d960 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  te() is called o
1d970 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42  n pDbPage and nB
1d980 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20  yte bytes.** of 
1d990 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20  data are copied 
1d9a0 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
1d9b0 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64  pBuf to pPayload
1d9c0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
1d9d0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
1d9e0 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77   success, otherw
1d9f0 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ise an error cod
1da00 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1da10 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20   copyPayload(.  
1da20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20  void *pPayload, 
1da30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
1da40 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74  nter to page dat
1da50 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  a */.  void *pBu
1da60 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
1da70 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
1da80 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  uffer */.  int n
1da90 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  Byte,           
1daa0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1dab0 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20  f bytes to copy 
1dac0 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20  */.  int eOp,   
1dad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dae0 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d  * 0 -> copy from
1daf0 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79   page, 1 -> copy
1db00 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62   to page */.  Db
1db10 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20  Page *pDbPage   
1db20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
1db30 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c  containing pPayl
1db40 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  oad */.){.  if( 
1db50 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  eOp ){.    /* Co
1db60 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66  py data from buf
1db70 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77  fer to page (a w
1db80 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20  rite operation) 
1db90 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  */.    int rc = 
1dba0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1dbb0 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  e(pDbPage);.    
1dbc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1dbd0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1dbe0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1dbf0 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
1dc00 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20   pBuf, nByte);. 
1dc10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43   }else{.    /* C
1dc20 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61  opy data from pa
1dc30 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20  ge to buffer (a 
1dc40 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20  read operation) 
1dc50 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42  */.    memcpy(pB
1dc60 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42  uf, pPayload, nB
1dc70 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  yte);.  }.  retu
1dc80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1dc90 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1dca0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
1dcb0 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74  read or overwrit
1dcc0 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  e payload inform
1dcd0 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65  ation.** for the
1dce0 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
1dcf0 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70  pCur cursor is p
1dd00 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20 74  ointing to. If t
1dd10 68 65 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65  he eOp.** parame
1dd20 74 65 72 20 69 73 20 30 2c 20 74 68 69 73 20 69  ter is 0, this i
1dd30 73 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69  s a read operati
1dd40 6f 6e 20 28 64 61 74 61 20 63 6f 70 69 65 64 20  on (data copied 
1dd50 69 6e 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70  into.** buffer p
1dd60 42 75 66 29 2e 20 49 66 20 69 74 20 69 73 20 6e  Buf). If it is n
1dd70 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74 65  on-zero, a write
1dd80 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 66 72   (data copied fr
1dd90 6f 6d 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75  om.** buffer pBu
1dda0 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61  f)..**.** A tota
1ddb0 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73  l of "amt" bytes
1ddc0 20 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69   are read or wri
1ddd0 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61  tten beginning a
1dde0 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44  t "offset"..** D
1ddf0 61 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f  ata is read to o
1de00 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65  r from the buffe
1de10 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68  r pBuf..**.** Th
1de20 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20  e content being 
1de30 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20  read or written 
1de40 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20  might appear on 
1de50 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a  the main page.**
1de60 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64   or be scattered
1de70 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65   out on multiple
1de80 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
1de90 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 74  .**.** If the Bt
1dea0 43 75 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f  Cursor.isIncrblo
1deb0 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20  bHandle flag is 
1dec0 73 65 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72  set, and the cur
1ded0 72 65 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65  rent.** cursor e
1dee0 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72  ntry uses one or
1def0 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
1df00 61 67 65 73 2c 20 74 68 69 73 20 66 75 6e 63 74  ages, this funct
1df10 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73  ion.** allocates
1df20 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c   space for and l
1df30 61 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65 73 20  azily popluates 
1df40 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
1df50 65 2d 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68 65  e-list .** cache
1df60 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72   array (BtCursor
1df70 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75 62  .aOverflow). Sub
1df80 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73  sequent calls us
1df90 65 20 74 68 69 73 0a 2a 2a 20 63 61 63 68 65 20  e this.** cache 
1dfa0 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20  to make seeking 
1dfb0 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
1dfc0 6f 66 66 73 65 74 20 6d 6f 72 65 20 65 66 66 69  offset more effi
1dfd0 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63  cient..**.** Onc
1dfe0 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
1dff0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61  ge-list cache ha
1e000 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
1e010 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69  , it may be.** i
1e020 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f  nvalidated if so
1e030 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20  me other cursor 
1e040 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61  writes to the sa
1e050 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a  me table, or if.
1e060 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ** the cursor is
1e070 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66   moved to a diff
1e080 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74  erent row. Addit
1e090 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f  ionally, in auto
1e0a0 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c  -vacuum.** mode,
1e0b0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
1e0c0 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69  vents may invali
1e0d0 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  date an overflow
1e0e0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
1e0f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69  ..**.**   * An i
1e100 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
1e110 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d  m,.**   * A comm
1e120 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75  it in auto_vacuu
1e130 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a  m="full" mode,.*
1e140 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61  *   * Creating a
1e150 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75   table (may requ
1e160 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76  ire moving an ov
1e170 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f  erflow page)..*/
1e180 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65  .static int acce
1e190 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  ssPayload(.  BtC
1e1a0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
1e1b0 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
1e1c0 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
1e1d0 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
1e1e0 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20  u32 offset,     
1e1f0 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65       /* Begin re
1e200 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69  ading this far i
1e210 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  nto payload */. 
1e220 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20   u32 amt,       
1e230 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
1e240 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f  is many bytes */
1e250 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1e260 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65   *pBuf, /* Write
1e270 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20   the bytes into 
1e280 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a  this buffer */ .
1e290 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20    int eOp       
1e2a0 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74         /* zero t
1e2b0 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f  o read. non-zero
1e2c0 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b   to write. */.){
1e2d0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1e2e0 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e   *aPayload;.  in
1e2f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1e300 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20  ;.  u32 nKey;.  
1e310 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20  int iIdx = 0;.  
1e320 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
1e330 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1e340 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42  ur->iPage]; /* B
1e350 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72  tree page of cur
1e360 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  rent entry */.  
1e370 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1e380 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20  pCur->pBt;      
1e390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1e3a0 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72  tree this cursor
1e3b0 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a   belongs to */..
1e3c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
1e3d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1e3e0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1e3f0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
1e400 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
1e410 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50  [pCur->iPage]<pP
1e420 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
1e430 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1e440 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1e450 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  ;..  getCellInfo
1e460 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f  (pCur);.  aPaylo
1e470 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ad = pCur->info.
1e480 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e  pCell + pCur->in
1e490 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b  fo.nHeader;.  nK
1e4a0 65 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74  ey = (pPage->int
1e4b0 4b 65 79 20 3f 20 30 20 3a 20 28 69 6e 74 29 70  Key ? 0 : (int)p
1e4c0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b  Cur->info.nKey);
1e4d0 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 6f 66  ..  if( NEVER(of
1e4e0 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b  fset+amt > nKey+
1e4f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61  pCur->info.nData
1e500 29 20 0a 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f  ) .   || &aPaylo
1e510 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad[pCur->info.nL
1e520 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e  ocal] > &pPage->
1e530 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c  aData[pBt->usabl
1e540 65 53 69 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20  eSize].  ){.    
1e550 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61  /* Trying to rea
1e560 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20  d or write past 
1e570 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
1e580 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ata is an error 
1e590 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
1e5a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1e5b0 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  T;.  }..  /* Che
1e5c0 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20  ck if data must 
1e5d0 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20  be read/written 
1e5e0 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65  to/from the btre
1e5f0 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a  e page itself. *
1e600 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  /.  if( offset<p
1e610 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1e620 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20   ){.    int a = 
1e630 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f  amt;.    if( a+o
1e640 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f  ffset>pCur->info
1e650 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  .nLocal ){.     
1e660 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   a = pCur->info.
1e670 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b  nLocal - offset;
1e680 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1e690 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
1e6a0 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70  yload[offset], p
1e6b0 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61  Buf, a, eOp, pPa
1e6c0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
1e6d0 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
1e6e0 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
1e6f0 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c   amt -= a;.  }el
1e700 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d  se{.    offset -
1e710 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
1e720 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  cal;.  }..  if( 
1e730 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1e740 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f   amt>0 ){.    co
1e750 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65  nst u32 ovflSize
1e760 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
1e770 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65  ze - 4;  /* Byte
1e780 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76  s content per ov
1e790 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50  fl page */.    P
1e7a0 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20  gno nextPage;.. 
1e7b0 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
1e7c0 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64  t4byte(&aPayload
1e7d0 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  [pCur->info.nLoc
1e7e0 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  al]);..#ifndef S
1e7f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
1e800 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  LOB.    /* If th
1e810 65 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  e isIncrblobHand
1e820 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 20 61  le flag is set a
1e830 6e 64 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e  nd the BtCursor.
1e840 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20  aOverflow[].    
1e850 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  ** has not been 
1e860 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63  allocated, alloc
1e870 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 20  ate it now. The 
1e880 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61  array is sized a
1e890 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74  t.    ** one ent
1e8a0 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72  ry for each over
1e8b0 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
1e8c0 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
1e8d0 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   The.    ** page
1e8e0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66   number of the f
1e8f0 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
1e900 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ge is stored in 
1e910 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20  aOverflow[0],.  
1e920 20 20 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c 75    ** etc. A valu
1e930 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f  e of 0 in the aO
1e940 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20  verflow[] array 
1e950 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b  means "not yet k
1e960 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68  nown".    ** (th
1e970 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c  e cache is lazil
1e980 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20  y populated)..  
1e990 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75    */.    if( pCu
1e9a0 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  r->isIncrblobHan
1e9b0 64 6c 65 20 26 26 20 21 70 43 75 72 2d 3e 61 4f  dle && !pCur->aO
1e9c0 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
1e9d0 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43   int nOvfl = (pC
1e9e0 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ur->info.nPayloa
1e9f0 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d-pCur->info.nLo
1ea00 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f  cal+ovflSize-1)/
1ea10 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20  ovflSize;.      
1ea20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
1ea30 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65  = (Pgno *)sqlite
1ea40 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65  3MallocZero(size
1ea50 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b  of(Pgno)*nOvfl);
1ea60 0a 20 20 20 20 20 20 2f 2a 20 6e 4f 76 66 6c 20  .      /* nOvfl 
1ea70 69 73 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69  is always positi
1ea80 76 65 2e 20 20 49 66 20 69 74 20 77 65 72 65 20  ve.  If it were 
1ea90 7a 65 72 6f 2c 20 66 65 74 63 68 50 61 79 6c 6f  zero, fetchPaylo
1eaa0 61 64 20 77 6f 75 6c 64 20 68 61 76 65 0a 20 20  ad would have.  
1eab0 20 20 20 20 2a 2a 20 62 65 65 6e 20 75 73 65 64      ** been used
1eac0 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 69 73   instead of this
1ead0 20 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 20   routine. */.   
1eae0 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 6e 4f     if( ALWAYS(nO
1eaf0 76 66 6c 29 20 26 26 20 21 70 43 75 72 2d 3e 61  vfl) && !pCur->a
1eb00 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
1eb10 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1eb20 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
1eb30 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1eb40 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
1eb50 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
1eb60 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
1eb70 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65  and the.    ** e
1eb80 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72  ntry for the fir
1eb90 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72  st required over
1eba0 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c  flow page is val
1ebb0 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20  id, skip.    ** 
1ebc0 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a  directly to it..
1ebd0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1ebe0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26  Cur->aOverflow &
1ebf0 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  & pCur->aOverflo
1ec00 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a  w[offset/ovflSiz
1ec10 65 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78  e] ){.      iIdx
1ec20 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53   = (offset/ovflS
1ec30 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74  ize);.      next
1ec40 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
1ec50 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20  erflow[iIdx];.  
1ec60 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66      offset = (of
1ec70 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset%ovflSize);.
1ec80 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1ec90 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c    for( ; rc==SQL
1eca0 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
1ecb0 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64  && nextPage; iId
1ecc0 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53  x++){..#ifndef S
1ecd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
1ece0 4c 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  LOB.      /* If 
1ecf0 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61  required, popula
1ed00 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
1ed10 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
1ed20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43   */.      if( pC
1ed30 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b  ur->aOverflow ){
1ed40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1ed50 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  !pCur->aOverflow
1ed60 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e  [iIdx] || pCur->
1ed70 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d  aOverflow[iIdx]=
1ed80 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  =nextPage);.    
1ed90 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
1eda0 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74  low[iIdx] = next
1edb0 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65  Page;.      }.#e
1edc0 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20  ndif..      if( 
1edd0 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65  offset>=ovflSize
1ede0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
1edf0 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74  he only reason t
1ee00 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
1ee10 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68   is to obtain th
1ee20 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
1ee30 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
1ee40 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
1ee50 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
1ee60 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20  . The page.     
1ee70 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f     ** data is no
1ee80 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66  t required. So f
1ee90 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b  irst try to look
1eea0 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a  up the overflow.
1eeb0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d          ** page-
1eec0 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61  list cache, if a
1eed0 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61  ny, then fall ba
1eee0 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65  ck to the getOve
1eef0 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20  rflowPage().    
1ef00 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
1ef10 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e  .        */.#ifn
1ef20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ef30 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 20  INCRBLOB.       
1ef40 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
1ef50 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f  flow && pCur->aO
1ef60 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20  verflow[iIdx+1] 
1ef70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  ){.          nex
1ef80 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
1ef90 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b  verflow[iIdx+1];
1efa0 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
1efb0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
1efc0 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
1efd0 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74  owPage(pBt, next
1efe0 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61  Page, 0, &nextPa
1eff0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66  ge);.        off
1f000 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b  set -= ovflSize;
1f010 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1f020 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f        /* Need to
1f030 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
1f040 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e  properly. It con
1f050 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68  tains some of th
1f060 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e  e.        ** ran
1f070 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ge of data that 
1f080 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65  is being read (e
1f090 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65  Op==0) or writte
1f0a0 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20  n (eOp!=0)..    
1f0b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 44      */.        D
1f0c0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
1f0d0 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20          int a = 
1f0e0 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  amt;.        rc 
1f0f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
1f100 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  t(pBt->pPager, n
1f110 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67  extPage, &pDbPag
1f120 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1f130 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f140 0a 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c  .          aPayl
1f150 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  oad = sqlite3Pag
1f160 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
1f170 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65  e);.          ne
1f180 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
1f190 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  e(aPayload);.   
1f1a0 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f         if( a + o
1f1b0 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65  ffset > ovflSize
1f1c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f1d0 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f  a = ovflSize - o
1f1e0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20  ffset;.         
1f1f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
1f200 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
1f210 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34  Payload[offset+4
1f220 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
1f230 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20   pDbPage);.     
1f240 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1f250 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
1f260 0a 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65  .          offse
1f270 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
1f280 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20   amt -= a;.     
1f290 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a       pBuf += a;.
1f2a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f2b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
1f2c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f2d0 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
1f2e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1f2f0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
1f300 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1f310 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74  ./*.** Read part
1f320 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f   of the key asso
1f330 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
1f340 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c  or pCur.  Exactl
1f350 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73  y.** "amt" bytes
1f360 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65   will be transfe
1f370 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
1f380 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
1f390 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
1f3a0 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  set"..**.** The 
1f3b0 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75  caller must ensu
1f3c0 72 65 20 74 68 61 74 20 70 43 75 72 20 69 73 20  re that pCur is 
1f3d0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61  pointing to a va
1f3e0 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68  lid row.** in th
1f3f0 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52  e table..**.** R
1f400 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1f410 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
1f420 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
1f430 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
1f440 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
1f450 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1f460 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
1f470 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
1f480 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
1f490 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
1f4a0 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43  ite3BtreeKey(BtC
1f4b0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
1f4c0 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
1f4d0 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
1f4e0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1f4f0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1f500 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1f510 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1f520 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
1f530 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
1f540 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
1f550 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1f560 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1f570 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
1f580 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
1f590 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1f5a0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74  ->nCell );.  ret
1f5b0 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
1f5c0 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
1f5d0 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
1f5e0 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d  har*)pBuf, 0);.}
1f5f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
1f600 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 73  t of the data as
1f610 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
1f620 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63  rsor pCur.  Exac
1f630 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74  tly.** "amt" byt
1f640 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
1f650 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  fered into pBuf[
1f660 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
1f670 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
1f680 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65  ffset"..**.** Re
1f690 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
1f6a0 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
1f6b0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
1f6c0 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
1f6d0 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
1f6e0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
1f6f0 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
1f700 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
1f710 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
1f720 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
1f730 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74 43  te3BtreeData(BtC
1f740 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
1f750 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
1f760 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
1f770 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65   int rc;..#ifnde
1f780 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
1f790 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43  CRBLOB.  if ( pC
1f7a0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1f7b0 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
1f7c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f7d0 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  ABORT;.  }.#endi
1f7e0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  f..  assert( cur
1f7f0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1f800 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
1f810 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
1f820 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
1f830 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f840 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
1f850 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1f860 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
1f870 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
1f880 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
1f890 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1f8a0 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ge] );.    asser
1f8b0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
1f8c0 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
1f8d0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1f8e0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
1f8f0 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
1f900 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
1f910 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20  set, amt, pBuf, 
1f920 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
1f930 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1f940 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1f950 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  o payload inform
1f960 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65  ation from the e
1f970 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a  ntry that the .*
1f980 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  * pCur cursor is
1f990 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
1f9a0 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f  he pointer is to
1f9b0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
1f9c0 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20  f.** the key if 
1f9d0 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69  skipKey==0 and i
1f9e0 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
1f9f0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74  beginning of dat
1fa00 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d  a if.** skipKey=
1fa10 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  =1.  The number 
1fa20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69  of bytes of avai
1fa30 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69  lable key/data i
1fa40 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
1fa50 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41  o *pAmt.  If *pA
1fa60 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  mt==0, then the 
1fa70 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77  value returned w
1fa80 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20  ill not be.** a 
1fa90 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a  valid pointer..*
1faa0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1fab0 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  e is an optimiza
1fac0 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d  tion.  It is com
1fad0 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69  mon for the enti
1fae0 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61  re key.** and da
1faf0 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ta to fit on the
1fb00 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20   local page and 
1fb10 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
1fb20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70  no overflow.** p
1fb30 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74  ages.  When that
1fb40 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75   is so, this rou
1fb50 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64  tine can be used
1fb60 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a   to access the.*
1fb70 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77  * key and data w
1fb80 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20  ithout making a 
1fb90 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65  copy.  If the ke
1fba0 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70  y and/or data sp
1fbb0 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65  ills.** onto ove
1fbc0 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65  rflow pages, the
1fbd0 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
1fbe0 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74  ) must be used t
1fbf0 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20  o reassemble.** 
1fc00 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64  the key/data and
1fc10 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20   copy it into a 
1fc20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  preallocated buf
1fc30 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  fer..**.** The p
1fc40 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
1fc50 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
1fc60 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69  looks directly i
1fc70 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a  nto the cached.*
1fc80 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  * page of the da
1fc90 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74  tabase.  The dat
1fca0 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f  a might change o
1fcb0 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20  r move the next 
1fcc0 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65  time.** any btre
1fcd0 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  e routine is cal
1fce0 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  led..*/.static c
1fcf0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1fd00 61 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64  ar *fetchPayload
1fd10 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
1fd20 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
1fd30 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
1fd40 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
1fd50 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74  m */.  int *pAmt
1fd60 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ,           /* W
1fd70 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
1fd80 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
1fd90 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  es here */.  int
1fda0 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20   skipKey        
1fdb0 20 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e    /* read beginn
1fdc0 69 6e 67 20 61 74 20 64 61 74 61 20 69 66 20 74  ing at data if t
1fdd0 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29  his is true */.)
1fde0 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
1fdf0 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d  r *aPayload;.  M
1fe00 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
1fe10 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 75 33 32   u32 nKey;.  u32
1fe20 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65   nLocal;..  asse
1fe30 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70  rt( pCur!=0 && p
1fe40 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
1fe50 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1fe60 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61  ur->iPage]);.  a
1fe70 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1fe80 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1fe90 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  D );.  assert( c
1fea0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1feb0 70 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67 65  pCur) );.  pPage
1fec0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
1fed0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
1fee0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
1fef0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1ff00 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
1ff10 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 75  .  if( NEVER(pCu
1ff20 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
1ff30 29 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50 61  ) ){.    btreePa
1ff40 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
1ff50 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1ff60 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  ], pCur->aiIdx[p
1ff70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20  Cur->iPage],.   
1ff80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff90 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
1ffa0 7d 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70  }.  aPayload = p
1ffb0 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b  Cur->info.pCell;
1ffc0 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70  .  aPayload += p
1ffd0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65  Cur->info.nHeade
1ffe0 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  r;.  if( pPage->
1fff0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b  intKey ){.    nK
20000 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ey = 0;.  }else{
20010 0a 20 20 20 20 6e 4b 65 79 20 3d 20 28 69 6e 74  .    nKey = (int
20020 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79  )pCur->info.nKey
20030 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70  ;.  }.  if( skip
20040 4b 65 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c  Key ){.    aPayl
20050 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20  oad += nKey;.   
20060 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e   nLocal = pCur->
20070 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b  info.nLocal - nK
20080 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ey;.  }else{.   
20090 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e   nLocal = pCur->
200a0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20  info.nLocal;.   
200b0 20 61 73 73 65 72 74 28 20 6e 4c 6f 63 61 6c 3c   assert( nLocal<
200c0 3d 6e 4b 65 79 20 29 3b 0a 20 20 7d 0a 20 20 2a  =nKey );.  }.  *
200d0 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20  pAmt = nLocal;. 
200e0 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64   return aPayload
200f0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  ;.}.../*.** For 
20100 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63  the entry that c
20110 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f  ursor pCur is po
20120 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61  int to, return a
20130 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20  s.** many bytes 
20140 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61  of the key or da
20150 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61  ta as are availa
20160 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ble on the local
20170 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e  .** b-tree page.
20180 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62    Write the numb
20190 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
201a0 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74  bytes into *pAmt
201b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
201c0 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ter returned is 
201d0 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20  ephemeral.  The 
201e0 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76  key/data may mov
201f0 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72  e.** or be destr
20200 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  oyed on the next
20210 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72   call to any Btr
20220 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69  ee routine,.** i
20230 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66  ncluding calls f
20240 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64  rom other thread
20250 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61  s against the sa
20260 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e  me cache..** Hen
20270 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74  ce, a mutex on t
20280 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75  he BtShared shou
20290 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72  ld be held prior
202a0 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74   to calling.** t
202b0 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
202c0 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
202d0 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74  s is used to get
202e0 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f   quick access to
202f0 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a   key and data.**
20300 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
20310 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65  ase where no ove
20320 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20  rflow pages are 
20330 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76  used..*/.const v
20340 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
20350 65 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73  eKeyFetch(BtCurs
20360 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
20370 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f  Amt){.  const vo
20380 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61 73 73  id *p = 0;.  ass
20390 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
203a0 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
203b0 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
203c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
203d0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
203e0 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 41 4c  Cur) );.  if( AL
203f0 57 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61 74  WAYS(pCur->eStat
20400 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e==CURSOR_VALID)
20410 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 63 6f 6e   ){.    p = (con
20420 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61  st void*)fetchPa
20430 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74  yload(pCur, pAmt
20440 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
20450 72 6e 20 70 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f  rn p;.}.const vo
20460 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
20470 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72 73  DataFetch(BtCurs
20480 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
20490 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f  Amt){.  const vo
204a0 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61 73 73  id *p = 0;.  ass
204b0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
204c0 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
204d0 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
204e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
204f0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
20500 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 41 4c  Cur) );.  if( AL
20510 57 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61 74  WAYS(pCur->eStat
20520 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e==CURSOR_VALID)
20530 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 63 6f 6e   ){.    p = (con
20540 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61  st void*)fetchPa
20550 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74  yload(pCur, pAmt
20560 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 1);.  }.  retu
20570 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn p;.}.../*.** 
20580 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
20590 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68  down to a new ch
205a0 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e  ild page.  The n
205b0 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20  ewPgno argument 
205c0 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e  is the.** page n
205d0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69  umber of the chi
205e0 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ld page to move 
205f0 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  to..**.** This f
20600 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
20610 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
20620 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65  f the page-heade
20630 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66  r flags field of
20640 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c  .** the new chil
20650 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20  d page does not 
20660 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67 73 20  match the flags 
20670 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72  field of the par
20680 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20  ent (i.e..** if 
20690 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61  an intkey page a
206a0 70 70 65 61 72 73 20 74 6f 20 62 65 20 74 68 65  ppears to be the
206b0 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e   parent of a non
206c0 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72  -intkey page, or
206d0 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e  .** vice-versa).
206e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
206f0 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72  oveToChild(BtCur
20700 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e  sor *pCur, u32 n
20710 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72  ewPgno){.  int r
20720 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 43 75  c;.  int i = pCu
20730 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50  r->iPage;.  MemP
20740 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20  age *pNewPage;. 
20750 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
20760 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61   pCur->pBt;..  a
20770 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
20780 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
20790 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
207a0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
207b0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
207c0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42  t( pCur->iPage<B
207d0 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54  TCURSOR_MAX_DEPT
207e0 48 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  H );.  if( pCur-
207f0 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f  >iPage>=(BTCURSO
20800 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29  R_MAX_DEPTH-1) )
20810 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
20820 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
20830 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74  ;.  }.  rc = get
20840 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
20850 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50   newPgno, &pNewP
20860 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
20870 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43   return rc;.  pC
20880 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20  ur->apPage[i+1] 
20890 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43  = pNewPage;.  pC
208a0 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d  ur->aiIdx[i+1] =
208b0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67   0;.  pCur->iPag
208c0 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e  e++;..  pCur->in
208d0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
208e0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
208f0 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50  = 0;.  if( pNewP
20900 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20  age->nCell<1 || 
20910 70 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79  pNewPage->intKey
20920 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  !=pCur->apPage[i
20930 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ]->intKey ){.   
20940 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
20950 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
20960 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
20970 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
20980 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67  NDEBUG./*.** Pag
20990 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20  e pParent is an 
209a0 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65  internal (non-le
209b0 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54  af) tree page. T
209c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
209d0 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61   asserts that pa
209e0 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
209f0 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69   is the left-chi
20a00 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74  ld if the iIdx't
20a10 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67  h.** cell in pag
20a20 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69  e pParent. Or, i
20a30 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20  f iIdx is equal 
20a40 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  to the total num
20a50 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20  ber of.** cells 
20a60 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74  in pParent, that
20a70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68   page number iCh
20a80 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74  ild is the right
20a90 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65  -child of.** the
20aa0 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
20ab0 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65   void assertPare
20ac0 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20  ntIndex(MemPage 
20ad0 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49  *pParent, int iI
20ae0 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29  dx, Pgno iChild)
20af0 7b 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78  {.  assert( iIdx
20b00 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  <=pParent->nCell
20b10 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d   );.  if( iIdx==
20b20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
20b30 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
20b40 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
20b50 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
20b60 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69  hdrOffset+8])==i
20b70 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65  Child );.  }else
20b80 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
20b90 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
20ba0 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d  pParent, iIdx))=
20bb0 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d  =iChild );.  }.}
20bc0 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65  .#else.#  define
20bd0 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
20be0 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69  ex(x,y,z) .#endi
20bf0 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  f../*.** Move th
20c00 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74  e cursor up to t
20c10 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
20c20 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20  **.** pCur->idx 
20c30 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 65  is set to the ce
20c40 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f  ll index that co
20c50 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74  ntains the point
20c60 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  er.** to the pag
20c70 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  e we are coming 
20c80 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65  from.  If we are
20c90 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65   coming from the
20ca0 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  .** right-most c
20cb0 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70  hild page then p
20cc0 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
20cd0 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e  to one more than
20ce0 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20  .** the largest 
20cf0 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  cell index..*/.s
20d00 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54  tatic void moveT
20d10 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72  oParent(BtCursor
20d20 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
20d30 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
20d40 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
20d50 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
20d60 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
20d70 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
20d80 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  Cur->iPage>0 );.
20d90 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
20da0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
20db0 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50  ge] );.  assertP
20dc0 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20  arentIndex(.    
20dd0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
20de0 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
20df0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
20e00 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
20e10 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
20e20 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67  pCur->iPage]->pg
20e30 6e 6f 0a 20 20 29 3b 0a 20 20 72 65 6c 65 61 73  no.  );.  releas
20e40 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
20e50 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
20e60 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d  ;.  pCur->iPage-
20e70 2d 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  -;.  pCur->info.
20e80 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
20e90 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
20ea0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
20eb0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
20ec0 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  int to the root 
20ed0 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72  page of its b-tr
20ee0 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ee structure..**
20ef0 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65  .** If the table
20f00 20 68 61 73 20 61 20 76 69 72 74 75 61 6c 20 72   has a virtual r
20f10 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74  oot page, then t
20f20 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
20f30 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74  ed to point.** t
20f40 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f  o the virtual ro
20f50 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61 64 20  ot page instead 
20f60 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f  of the actual ro
20f70 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65  ot page. A table
20f80 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61   has a.** virtua
20f90 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e  l root page when
20fa0 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74   the actual root
20fb0 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
20fc0 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a  o cells and a .*
20fd0 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70  * single child p
20fe0 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e  age. This can on
20ff0 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68 20 74  ly happen with t
21000 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20  he table rooted 
21010 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a  at page 1..**.**
21020 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 73   If the b-tree s
21030 74 72 75 63 74 75 72 65 20 69 73 20 65 6d 70 74  tructure is empt
21040 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  y, the cursor st
21050 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a  ate is set to .*
21060 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  * CURSOR_INVALID
21070 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
21080 20 63 75 72 73 6f 72 20 69 73 20 73 65 74 20 74   cursor is set t
21090 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  o point to the f
210a0 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63  irst.** cell loc
210b0 61 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74  ated on the root
210c0 20 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f   (or virtual roo
210d0 74 29 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  t) page and the 
210e0 63 75 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20  cursor state.** 
210f0 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52  is set to CURSOR
21100 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66  _VALID..**.** If
21110 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
21120 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75  eturns successfu
21130 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61  lly, it may be a
21140 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a  ssumed that the.
21150 2a 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20 66  ** page-header f
21160 6c 61 67 73 20 69 6e 64 69 63 61 74 65 20 74 68  lags indicate th
21170 61 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d  at the [virtual]
21180 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68   root-page is th
21190 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b  e expected .** k
211a0 69 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61  ind of b-tree pa
211b0 67 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e  ge (i.e. if when
211c0 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72   opening the cur
211d0 73 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64  sor the caller d
211e0 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66  id not.** specif
211f0 79 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  y a KeyInfo stru
21200 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20  cture the flags 
21210 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30  byte is set to 0
21220 78 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20  x05 or 0x0D,.** 
21230 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61 62  indicating a tab
21240 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66  le b-tree, or if
21250 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20   the caller did 
21260 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66  specify a KeyInf
21270 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  o .** structure 
21280 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69  the flags byte i
21290 73 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72  s set to 0x02 or
212a0 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e   0x0A, indicatin
212b0 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d  g an index.** b-
212c0 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  tree)..*/.static
212d0 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28   int moveToRoot(
212e0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
212f0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  .  MemPage *pRoo
21300 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
21310 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65  LITE_OK;.  Btree
21320 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72   *p = pCur->pBtr
21330 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ee;.  BtShared *
21340 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
21350 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
21360 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
21370 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
21380 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55  SOR_INVALID < CU
21390 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
213a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
213b0 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43  RSOR_VALID   < C
213c0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
213d0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
213e0 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20  URSOR_FAULT   > 
213f0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
21400 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
21410 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
21420 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a  _REQUIRESEEK ){.
21430 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
21440 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
21450 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  LT ){.      asse
21460 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
21470 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  xt!=SQLITE_OK );
21480 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43  .      return pC
21490 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
214a0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
214b0 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
214c0 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  pCur);.  }..  if
214d0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
214e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
214f0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70     for(i=1; i<=p
21500 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
21510 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
21520 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
21530 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
21540 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b  pCur->iPage = 0;
21550 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
21560 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
21570 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  e(pBt, pCur->pgn
21580 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70  oRoot, &pCur->ap
21590 50 61 67 65 5b 30 5d 29 3b 0a 20 20 20 20 69 66  Page[0]);.    if
215a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
215b0 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
215c0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
215d0 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65  NVALID;.      re
215e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
215f0 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
21600 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   0;..    /* If p
21610 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73  Cur->pKeyInfo is
21620 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
21630 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20  the caller that 
21640 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75 72 73  opened this curs
21650 6f 72 0a 20 20 20 20 2a 2a 20 65 78 70 65 63 74  or.    ** expect
21660 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e  ed to open it on
21670 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65   an index b-tree
21680 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
21690 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 20 20  pKeyInfo is.    
216a0 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c  ** NULL, the cal
216b0 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61  ler expects a ta
216c0 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74  ble b-tree. If t
216d0 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63  his is not the c
216e0 61 73 65 2c 0a 20 20 20 20 2a 2a 20 72 65 74 75  ase,.    ** retu
216f0 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52  rn an SQLITE_COR
21700 52 55 50 54 20 65 72 72 6f 72 2e 20 20 2a 2f 0a  RUPT error.  */.
21710 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
21720 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
21730 4b 65 79 3d 3d 31 20 7c 7c 20 70 43 75 72 2d 3e  Key==1 || pCur->
21740 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
21750 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  y==0 );.    if( 
21760 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
21770 3d 30 29 21 3d 70 43 75 72 2d 3e 61 70 50 61 67  =0)!=pCur->apPag
21780 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  e[0]->intKey ){.
21790 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
217a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
217b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
217c0 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
217d0 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 6f  e root page is o
217e0 66 20 74 68 65 20 63 6f 72 72 65 63 74 20 74 79  f the correct ty
217f0 70 65 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65  pe. This must be
21800 20 74 68 65 0a 20 20 2a 2a 20 63 61 73 65 20 61   the.  ** case a
21810 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 74 68  s the call to th
21820 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  is function that
21830 20 6c 6f 61 64 65 64 20 74 68 65 20 72 6f 6f 74   loaded the root
21840 2d 70 61 67 65 20 28 65 69 74 68 65 72 0a 20 20  -page (either.  
21850 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 6f 72 20  ** this call or 
21860 61 20 70 72 65 76 69 6f 75 73 20 69 6e 76 6f 63  a previous invoc
21870 61 74 69 6f 6e 29 20 77 6f 75 6c 64 20 68 61 76  ation) would hav
21880 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75  e detected corru
21890 70 74 69 6f 6e 20 0a 20 20 2a 2a 20 69 66 20 74  ption .  ** if t
218a0 68 65 20 61 73 73 75 6d 70 74 69 6f 6e 20 77 65  he assumption we
218b0 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64  re not true, and
218c0 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
218d0 62 6c 65 20 66 6f 72 20 74 68 65 20 66 6c 61 67  ble for the flag
218e0 73 20 0a 20 20 2a 2a 20 62 79 74 65 20 74 6f 20  s .  ** byte to 
218f0 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69  have been modifi
21900 65 64 20 77 68 69 6c 65 20 74 68 69 73 20 63 75  ed while this cu
21910 72 73 6f 72 20 69 73 20 68 6f 6c 64 69 6e 67 20  rsor is holding 
21920 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 2a 2a  a reference.  **
21930 20 74 6f 20 74 68 65 20 70 61 67 65 2e 20 20 2a   to the page.  *
21940 2f 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72  /.  pRoot = pCur
21950 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61  ->apPage[0];.  a
21960 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67  ssert( pRoot->pg
21970 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  no==pCur->pgnoRo
21980 6f 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ot );.  assert( 
21990 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 26 26  pRoot->isInit &&
219a0 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f   (pCur->pKeyInfo
219b0 3d 3d 30 29 3d 3d 70 52 6f 6f 74 2d 3e 69 6e 74  ==0)==pRoot->int
219c0 4b 65 79 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e  Key );..  pCur->
219d0 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20  aiIdx[0] = 0;.  
219e0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
219f0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74   = 0;.  pCur->at
21a00 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72  Last = 0;.  pCur
21a10 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
21a20 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e  ..  if( pRoot->n
21a30 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f  Cell==0 && !pRoo
21a40 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  t->leaf ){.    P
21a50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20  gno subpage;.   
21a60 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f   if( pRoot->pgno
21a70 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=1 ) return SQL
21a80 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
21a90 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20  ;.    subpage = 
21aa0 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d  get4byte(&pRoot-
21ab0 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64  >aData[pRoot->hd
21ac0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
21ad0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
21ae0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
21af0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
21b00 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65  ld(pCur, subpage
21b10 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
21b20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 28  pCur->eState = (
21b30 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29  (pRoot->nCell>0)
21b40 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55  ?CURSOR_VALID:CU
21b50 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20  RSOR_INVALID);. 
21b60 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
21b70 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
21b80 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
21b90 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   the left-most l
21ba0 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
21bb0 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74  h the.** entry t
21bc0 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
21bd0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
21be0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ..**.** The left
21bf0 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68  -most leaf is th
21c00 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73  e one with the s
21c10 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68  mallest key - th
21c20 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73  e first.** in as
21c30 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
21c40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
21c50 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75  eToLeftmost(BtCu
21c60 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
21c70 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
21c80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
21c90 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
21ca0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
21cb0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
21cc0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
21cd0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
21ce0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
21cf0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
21d00 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65  TE_OK && !(pPage
21d10 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
21d20 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c  pCur->iPage])->l
21d30 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72  eaf ){.    asser
21d40 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
21d50 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67  Cur->iPage]<pPag
21d60 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
21d70 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
21d80 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
21d90 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
21da0 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20  ->iPage]));.    
21db0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
21dc0 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
21dd0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
21de0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
21df0 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
21e00 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  the right-most l
21e10 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
21e20 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  h the.** page to
21e30 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
21e40 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
21e50 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66    Notice the dif
21e60 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65  ference.** betwe
21e70 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  en moveToLeftmos
21e80 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69  t() and moveToRi
21e90 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65  ghtmost().  move
21ea0 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20  ToLeftmost().** 
21eb0 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d  finds the left-m
21ec0 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
21ed0 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68  h the *entry* wh
21ee0 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68  ereas moveToRigh
21ef0 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
21f00 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
21f10 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
21f20 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20  e *page*..**.** 
21f30 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  The right-most e
21f40 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20  ntry is the one 
21f50 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74  with the largest
21f60 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a   key - the last.
21f70 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64  ** key in ascend
21f80 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
21f90 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
21fa0 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  ightmost(BtCurso
21fb0 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
21fc0 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
21fd0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
21fe0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
21ff0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  0;..  assert( cu
22000 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
22010 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
22020 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
22030 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
22040 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
22050 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
22060 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
22070 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e  [pCur->iPage])->
22080 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
22090 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
220a0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
220b0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
220c0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
220d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
220e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
220f0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
22100 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
22110 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
22120 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43  ITE_OK ){.    pC
22130 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
22140 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e  iPage] = pPage->
22150 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75  nCell-1;.    pCu
22160 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
22170 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  0;.    pCur->val
22180 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a  idNKey = 0;.  }.
22190 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
221a0 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
221b0 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  or to the first 
221c0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
221d0 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
221e0 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
221f0 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
22200 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
22210 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
22220 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
22230 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
22240 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
22250 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
22260 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
22270 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  irst(BtCursor *p
22280 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
22290 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
222a0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
222b0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
222c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
222d0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
222e0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
222f0 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
22300 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
22310 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
22320 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
22330 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
22340 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
22350 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22360 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
22370 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
22380 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  =0 );.      *pRe
22390 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20  s = 1;.      rc 
223a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
223b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
223c0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
223d0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
223e0 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
223f0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
22400 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65     rc = moveToLe
22410 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
22420 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
22430 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
22440 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
22450 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
22460 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
22470 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
22480 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
22490 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
224a0 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
224b0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
224c0 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
224d0 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
224e0 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
224f0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
22500 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72  3BtreeLast(BtCur
22510 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
22520 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
22530 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  . .  assert( cur
22540 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
22550 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
22560 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
22570 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
22580 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
22590 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
225a0 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  sor already poin
225b0 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ts to the last e
225c0 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61 20  ntry, this is a 
225d0 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20  no-op. */.  if( 
225e0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43  CURSOR_VALID==pC
225f0 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 70 43  ur->eState && pC
22600 75 72 2d 3e 61 74 4c 61 73 74 20 29 7b 0a 23 69  ur->atLast ){.#i
22610 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
22620 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c  G.    /* This bl
22630 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73  ock serves to as
22640 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
22650 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f  cursor really do
22660 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a  es point .    **
22670 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
22680 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ry in the b-tree
22690 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  . */.    int ii;
226a0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
226b0 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  i<pCur->iPage; i
226c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
226d0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
226e0 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ii]==pCur->apPag
226f0 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  e[ii]->nCell );.
22700 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
22710 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
22720 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72  ur->iPage]==pCur
22730 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
22740 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29  Page]->nCell-1 )
22750 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
22760 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
22770 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b  >iPage]->leaf );
22780 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
22790 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
227a0 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
227b0 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
227c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
227d0 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f  ){.    if( CURSO
227e0 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
227f0 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
22800 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
22810 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
22820 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
22830 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
22840 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22850 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22860 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
22870 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70  ALID );.      *p
22880 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
22890 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
228a0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ost(pCur);.     
228b0 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20   pCur->atLast = 
228c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 31  rc==SQLITE_OK ?1
228d0 3a 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  :0;.    }.  }.  
228e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
228f0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
22900 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
22910 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e  ts to an entry n
22920 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20  ear the key .** 
22930 73 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64  specified by pId
22940 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20  xKey or intKey. 
22950 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65    Return a succe
22960 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46  ss code..**.** F
22970 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73  or INTKEY tables
22980 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72  , the intKey par
22990 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20  ameter is used. 
229a0 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73   pIdxKey .** mus
229b0 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20  t be NULL.  For 
229c0 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49  index tables, pI
229d0 64 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e  dxKey is used an
229e0 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69  d intKey.** is i
229f0 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  gnored..**.** If
22a00 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20   an exact match 
22a10 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68  is not found, th
22a20 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
22a30 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20   always.** left 
22a40 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65  pointing at a le
22a50 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f  af page which wo
22a60 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74  uld hold the ent
22a70 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65  ry if it.** were
22a80 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63   present.  The c
22a90 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e  ursor might poin
22aa0 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68  t to an entry th
22ab0 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f  at comes.** befo
22ac0 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20  re or after the 
22ad0 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e  key..**.** An in
22ae0 74 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e  teger is written
22af0 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63   into *pRes whic
22b00 68 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  h is the result 
22b10 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20  of.** comparing 
22b20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65  the key with the
22b30 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
22b40 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a  the cursor is .*
22b50 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65  * pointing.  The
22b60 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20   meaning of the 
22b70 69 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20  integer written 
22b80 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73  into.** *pRes is
22b90 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
22ba0 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20  **     *pRes<0  
22bb0 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
22bc0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
22bd0 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
22be0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
22bf0 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20       is smaller 
22c00 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
22c10 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61  Key or if the ta
22c20 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20  ble is empty.** 
22c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c40 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
22c50 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66  is therefore lef
22c60 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69  t point to nothi
22c70 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ng..**.**     *p
22c80 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63  Res==0     The c
22c90 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
22ca0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
22cb0 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
22cc0 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63              exac
22cd0 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b  tly matches intK
22ce0 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
22cf0 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20  *     *pRes>0   
22d00 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
22d10 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
22d20 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
22d30 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22d40 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68      is larger th
22d50 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  an intKey/pIdxKe
22d60 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c  y..**.*/.int sql
22d70 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
22d80 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72  npacked(.  BtCur
22d90 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
22da0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
22db0 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f  r to be moved */
22dc0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
22dd0 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55  d *pIdxKey, /* U
22de0 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
22df0 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65  y */.  i64 intKe
22e00 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
22e10 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79  /* The table key
22e20 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69   */.  int biasRi
22e30 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ght,           /
22e40 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20  * If true, bias 
22e50 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68  the search to th
22e60 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
22e70 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
22e80 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
22e90 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73  e search results
22ea0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
22eb0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
22ec0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
22ed0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
22ee0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
22ef0 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
22f00 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
22f10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
22f20 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  es );.  assert( 
22f30 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70  (pIdxKey==0)==(p
22f40 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
22f50 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
22f60 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65  e cursor is alre
22f70 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61  ady positioned a
22f80 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61  t the point we a
22f90 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74  re trying.  ** t
22fa0 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20  o move to, then 
22fb0 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69 74 68  just return with
22fc0 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f  out doing any wo
22fd0 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72  rk */.  if( pCur
22fe0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
22ff0 5f 56 41 4c 49 44 20 26 26 20 70 43 75 72 2d 3e  _VALID && pCur->
23000 76 61 6c 69 64 4e 4b 65 79 20 0a 20 20 20 26 26  validNKey .   &&
23010 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
23020 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20  ->intKey .  ){. 
23030 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
23040 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  o.nKey==intKey )
23050 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
23060 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
23070 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
23080 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61  .    if( pCur->a
23090 74 4c 61 73 74 20 26 26 20 70 43 75 72 2d 3e 69  tLast && pCur->i
230a0 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20  nfo.nKey<intKey 
230b0 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
230c0 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
230d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
230e0 20 7d 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d   }.  }..  rc = m
230f0 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
23100 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
23110 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
23120 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23130 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
23140 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge] );.  assert(
23150 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
23160 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e  ur->iPage]->isIn
23170 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
23180 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23190 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
231a0 3e 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  >0 || pCur->eSta
231b0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
231c0 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  ID );.  if( pCur
231d0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
231e0 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
231f0 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
23200 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
23210 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
23220 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
23230 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
23240 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
23250 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
23260 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49  0]->intKey || pI
23270 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b  dxKey );.  for(;
23280 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c  ;){.    int lwr,
23290 20 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63   upr;.    Pgno c
232a0 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61  hldPg;.    MemPa
232b0 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
232c0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
232d0 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20 63  Page];.    int c
232e0 3b 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d  ;..    /* pPage-
232f0 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67  >nCell must be g
23300 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
23310 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
23320 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a   root-page.    *
23330 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75  * the cursor wou
23340 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56  ld have been INV
23350 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74  ALID above and t
23360 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70  his for(;;) loop
23370 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e  .    ** not run.
23380 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
23390 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74  the root-page, t
233a0 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68  hen the moveToCh
233b0 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20  ild() routine.  
233c0 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20    ** would have 
233d0 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65 64  already detected
233e0 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20   db corruption. 
233f0 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65  Similarly, pPage
23400 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20   must.    ** be 
23410 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28  the right kind (
23420 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20  index or table) 
23430 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  of b-tree page. 
23440 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a  Otherwise.    **
23450 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29   a moveToChild()
23460 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29   or moveToRoot()
23470 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65   call would have
23480 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70   detected corrup
23490 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73  tion.  */.    as
234a0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
234b0 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  ll>0 );.    asse
234c0 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
234d0 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20  y==(pIdxKey==0) 
234e0 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a  );.    lwr = 0;.
234f0 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d      upr = pPage-
23500 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66  >nCell-1;.    if
23510 28 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a 20  ( biasRight ){. 
23520 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
23530 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
23540 28 75 31 36 29 75 70 72 3b 0a 20 20 20 20 7d 65  (u16)upr;.    }e
23550 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  lse{.      pCur-
23560 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
23570 67 65 5d 20 3d 20 28 75 31 36 29 28 28 75 70 72  ge] = (u16)((upr
23580 2b 6c 77 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a  +lwr)/2);.    }.
23590 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
235a0 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75     int idx = pCu
235b0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
235c0 50 61 67 65 5d 3b 20 2f 2a 20 49 6e 64 65 78 20  Page]; /* Index 
235d0 6f 66 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20  of current cell 
235e0 69 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 20 20  in pPage */.    
235f0 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20    u8 *pCell;    
23600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23610 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
23620 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c   to current cell
23630 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20   in pPage */..  
23640 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
23650 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Size = 0;.      
23660 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
23670 28 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70  (pPage, idx) + p
23680 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
23690 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ze;.      if( pP
236a0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
236b0 20 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c         i64 nCell
236c0 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Key;.        if(
236d0 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
236e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  ){.          u32
236f0 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20   dummy;.        
23700 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61    pCell += getVa
23710 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 64 75  rint32(pCell, du
23720 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  mmy);.        }.
23730 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e          getVarin
23740 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26  t(pCell, (u64*)&
23750 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  nCellKey);.     
23760 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d     if( nCellKey=
23770 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  =intKey ){.     
23780 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20       c = 0;.    
23790 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43      }else if( nC
237a0 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  ellKey<intKey ){
237b0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d  .          c = -
237c0 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
237d0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
237e0 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74  rt( nCellKey>int
237f0 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Key );.         
23800 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20   c = +1;.       
23810 20 7d 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d   }.        pCur-
23820 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a  >validNKey = 1;.
23830 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e          pCur->in
23840 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b  fo.nKey = nCellK
23850 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ey;.      }else{
23860 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
23870 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65  maximum supporte
23880 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 33  d page-size is 3
23890 32 37 36 38 20 62 79 74 65 73 2e 20 54 68 69 73  2768 bytes. This
238a0 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20   means that.    
238b0 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d      ** the maxim
238c0 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63  um number of rec
238d0 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64  ord bytes stored
238e0 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54   on an index B-T
238f0 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ree.        ** p
23900 61 67 65 20 69 73 20 61 74 20 6d 6f 73 74 20 38  age is at most 8
23910 31 39 38 20 62 79 74 65 73 2c 20 77 68 69 63 68  198 bytes, which
23920 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61   may be stored a
23930 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20  s a 2-byte.     
23940 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68     ** varint. Th
23950 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
23960 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70  s used to attemp
23970 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69  t to avoid parsi
23980 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ng .        ** t
23990 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62  he entire cell b
239a0 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74  y checking for t
239b0 68 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74  he cases where t
239c0 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20  he record is .  
239d0 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20        ** stored 
239e0 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20  entirely within 
239f0 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
23a00 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68  by inspecting th
23a10 65 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20  e first .       
23a20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74   ** 2 bytes of t
23a30 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20  he cell..       
23a40 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
23a50 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d  nCell = pCell[0]
23a60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 28  ;.        if( !(
23a70 6e 43 65 6c 6c 20 26 20 30 78 38 30 29 20 26 26  nCell & 0x80) &&
23a80 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d   nCell<=pPage->m
23a90 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  axLocal ){.     
23aa0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
23ab0 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20  nch runs if the 
23ac0 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
23ad0 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73  d of the cell is
23ae0 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
23af0 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69  single byte vari
23b00 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72  nt and the recor
23b10 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  d fits entirely 
23b20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20  on the main.    
23b30 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20        ** b-tree 
23b40 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
23b50 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56      c = sqlite3V
23b60 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
23b70 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
23b80 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65  pCell[1], pIdxKe
23b90 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
23ba0 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d  e if( !(pCell[1]
23bb0 20 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20   & 0x80) .      
23bc0 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20      && (nCell = 
23bd0 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37  ((nCell&0x7f)<<7
23be0 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70  ) + pCell[1])<=p
23bf0 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20  Page->maxLocal. 
23c00 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
23c10 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
23c20 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20  d-size field is 
23c30 61 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20  a 2 byte varint 
23c40 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a  and the record .
23c50 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74            ** fit
23c60 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
23c70 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61  e main b-tree pa
23c80 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
23c90 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62    c = sqlite3Vdb
23ca0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
23cb0 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43  Cell, (void*)&pC
23cc0 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29  ell[2], pIdxKey)
23cd0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
23ce0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
23cf0 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f  e record flows o
23d00 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20  ver onto one or 
23d10 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
23d20 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20  ges. In.        
23d30 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74    ** this case t
23d40 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65  he whole cell ne
23d50 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64  eds to be parsed
23d60 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  , a buffer alloc
23d70 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  ated.          *
23d80 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c  * and accessPayl
23d90 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65  oad() used to re
23da0 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72  trieve the recor
23db0 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  d into the.     
23dc0 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62       ** buffer b
23dd0 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64  efore VdbeRecord
23de0 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65  Compare() can be
23df0 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20   called. */.    
23e00 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c        void *pCel
23e10 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  lKey;.          
23e20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c  u8 * const pCell
23e30 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70  Body = pCell - p
23e40 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
23e50 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 74  ze;.          bt
23e60 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
23e70 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79  pPage, pCellBody
23e80 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  , &pCur->info);.
23e90 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20            nCell 
23ea0 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66  = (int)pCur->inf
23eb0 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  o.nKey;.        
23ec0 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    pCellKey = sql
23ed0 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c  ite3Malloc( nCel
23ee0 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  l );.          i
23ef0 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29  f( pCellKey==0 )
23f00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
23f10 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
23f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
23f30 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
23f40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
23f50 20 20 20 20 20 20 20 72 63 20 3d 20 61 63 63 65         rc = acce
23f60 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
23f70 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67  0, nCell, (unsig
23f80 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b  ned char*)pCellK
23f90 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ey, 0);.        
23fa0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
23fb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
23fc0 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
23fd0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
23fe0 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
23ff0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24000 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
24010 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
24020 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b  re(nCell, pCellK
24030 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  ey, pIdxKey);.  
24040 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
24050 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
24060 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24070 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30  }.      if( c==0
24080 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
24090 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
240a0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
240b0 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
240c0 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20   idx;.          
240d0 75 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20  upr = lwr - 1;. 
240e0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
240f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
24100 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d           *pRes =
24110 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
24120 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
24130 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
24140 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
24150 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
24160 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20      if( c<0 ){. 
24170 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
24180 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  +1;.      }else{
24190 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69  .        upr = i
241a0 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  dx-1;.      }.  
241b0 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
241c0 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
241d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
241e0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
241f0 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
24200 28 28 6c 77 72 2b 75 70 72 29 2f 32 29 3b 0a 20  ((lwr+upr)/2);. 
24210 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
24220 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20   lwr==upr+1 );. 
24230 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
24240 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
24250 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
24260 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
24270 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
24280 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e  f( lwr>=pPage->n
24290 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68  Cell ){.      ch
242a0 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
242b0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
242c0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
242d0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
242e0 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
242f0 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
24300 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20  pPage, lwr));.  
24310 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c 64    }.    if( chld
24320 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  Pg==0 ){.      a
24330 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
24340 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
24350 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
24360 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
24370 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
24380 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = c;.      rc = 
24390 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
243a0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
243b0 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ish;.    }.    p
243c0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
243d0 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c  >iPage] = (u16)l
243e0 77 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e  wr;.    pCur->in
243f0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
24400 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
24410 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  y = 0;.    rc = 
24420 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
24430 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69  , chldPg);.    i
24440 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76  f( rc ) goto mov
24450 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a  eto_finish;.  }.
24460 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20  moveto_finish:. 
24470 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
24480 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
24490 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  E if the cursor 
244a0 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
244b0 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  at an entry of t
244c0 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
244d0 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74  TRUE will be ret
244e0 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61  urned after a ca
244f0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
24500 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a  eeNext() moves.*
24510 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  * past the last 
24520 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
24530 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72  le or sqlite3Btr
24540 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70  eePrev() moves p
24550 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  ast.** the first
24560 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73   entry.  TRUE is
24570 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
24580 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
24590 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
245a0 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43  ite3BtreeEof(BtC
245b0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
245c0 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66  /* TODO: What if
245d0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69   the cursor is i
245e0 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  n CURSOR_REQUIRE
245f0 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62  SEEK but all tab
24600 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20  le entries.  ** 
24610 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65  have been delete
24620 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c  d? This API will
24630 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20   need to change 
24640 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  to return an err
24650 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20  or code.  ** as 
24660 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c  well as the bool
24670 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65  ean result value
24680 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
24690 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70  (CURSOR_VALID!=p
246a0 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a  Cur->eState);.}.
246b0 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
246c0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
246d0 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74   next entry in t
246e0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
246f0 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
24700 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
24710 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
24720 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
24730 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c  ointing to the l
24740 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
24750 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
24760 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
24770 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
24780 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
24790 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
247a0 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
247b0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
247c0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
247d0 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67  nt idx;.  MemPag
247e0 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
247f0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
24800 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
24810 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
24820 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
24830 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
24840 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
24850 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
24860 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29  ssert( pRes!=0 )
24870 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49  ;.  if( CURSOR_I
24880 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
24890 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65  tate ){.    *pRe
248a0 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  s = 1;.    retur
248b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
248c0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69  .  if( pCur->ski
248d0 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 70  pNext>0 ){.    p
248e0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
248f0 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  0;.    *pRes = 0
24900 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
24910 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43  ITE_OK;.  }.  pC
24920 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
24930 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  ;..  pPage = pCu
24940 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
24950 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20  iPage];.  idx = 
24960 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ++pCur->aiIdx[pC
24970 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
24980 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
24990 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
249a0 20 69 64 78 3c 3d 70 50 61 67 65 2d 3e 6e 43 65   idx<=pPage->nCe
249b0 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69  ll );..  pCur->i
249c0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
249d0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
249e0 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 64 78 3e   = 0;.  if( idx>
249f0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
24a00 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
24a10 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
24a20 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
24a30 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26  pCur, get4byte(&
24a40 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
24a50 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
24a60 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
24a70 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
24a80 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
24a90 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
24aa0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
24ab0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
24ac0 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20  .    }.    do{. 
24ad0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
24ae0 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
24af0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
24b00 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
24b10 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
24b20 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74  LID;.        ret
24b30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
24b40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76       }.      mov
24b50 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
24b60 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70  .      pPage = p
24b70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
24b80 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77  ->iPage];.    }w
24b90 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64  hile( pCur->aiId
24ba0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d  x[pCur->iPage]>=
24bb0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
24bc0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
24bd0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
24be0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63  tKey ){.      rc
24bf0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
24c00 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ext(pCur, pRes);
24c10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24c20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
24c30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
24c40 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52  rn rc;.  }.  *pR
24c50 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  es = 0;.  if( pP
24c60 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
24c70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
24c80 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f  K;.  }.  rc = mo
24c90 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
24ca0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
24cb0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20  .}.../*.** Step 
24cc0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
24cd0 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72  e back to the pr
24ce0 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20  evious entry in 
24cf0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
24d00 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
24d10 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
24d20 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
24d30 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
24d40 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
24d50 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
24d60 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
24d70 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
24d80 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74  ne was called, t
24d90 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e  hen set *pRes=1.
24da0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
24db0 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43  treePrevious(BtC
24dc0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
24dd0 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
24de0 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
24df0 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
24e00 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
24e10 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
24e20 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
24e30 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
24e40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
24e50 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
24e60 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  rc;.  }.  pCur->
24e70 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 66  atLast = 0;.  if
24e80 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
24e90 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
24ea0 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b  {.    *pRes = 1;
24eb0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
24ec0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
24ed0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c   pCur->skipNext<
24ee0 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  0 ){.    pCur->s
24ef0 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
24f00 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
24f10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24f20 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b  ;.  }.  pCur->sk
24f30 69 70 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70  ipNext = 0;..  p
24f40 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
24f50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
24f60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
24f70 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69  e->isInit );.  i
24f80 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
24f90 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d  ){.    int idx =
24fa0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
24fb0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72  r->iPage];.    r
24fc0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
24fd0 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66  pCur, get4byte(f
24fe0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
24ff0 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72  dx)));.    if( r
25000 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
25010 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
25020 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
25030 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65  most(pCur);.  }e
25040 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
25050 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
25060 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20  ->iPage]==0 ){. 
25070 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
25080 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
25090 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
250a0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
250b0 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  ;.        *pRes 
250c0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 1;.        ret
250d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
250e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76       }.      mov
250f0 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
25100 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
25110 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
25120 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
25130 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70  NKey = 0;..    p
25140 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
25150 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70  >iPage]--;.    p
25160 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
25170 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
25180 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
25190 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67  >intKey && !pPag
251a0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
251b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
251c0 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c  eePrevious(pCur,
251d0 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73   pRes);.    }els
251e0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
251f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
25200 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a   }.  *pRes = 0;.
25210 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25220 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
25230 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74   new page from t
25240 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25250 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
25260 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
25270 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74  s dirty.  (In ot
25280 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74  her words, sqlit
25290 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a  e3PagerWrite().*
252a0 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  * has already be
252b0 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  en called on the
252c0 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65   new page.)  The
252d0 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c   new page has al
252e0 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72  so.** been refer
252f0 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61  enced and the ca
25300 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73  lling routine is
25310 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
25320 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69   calling.** sqli
25330 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
25340 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  on the new page 
25350 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e  when it is done.
25360 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
25370 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
25380 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74  success.  Any ot
25390 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  her return value
253a0 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e   indicates.** an
253b0 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65   error.  *ppPage
253c0 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20   and *pPgno are 
253d0 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65  undefined in the
253e0 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72   event of an err
253f0 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e  or..** Do not in
25400 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65  voke sqlite3Page
25410 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50  rUnref() on *ppP
25420 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  age if an error 
25430 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
25440 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62  ** If the "nearb
25450 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  y" parameter is 
25460 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 20 28 66  not 0, then a (f
25470 65 65 62 6c 65 29 20 65 66 66 6f 72 74 20 69 73  eeble) effort is
25480 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63   made to .** loc
25490 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65  ate a page close
254a0 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d   to the page num
254b0 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54  ber "nearby".  T
254c0 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
254d0 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74  in an.** attempt
254e0 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64   to keep related
254f0 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20   pages close to 
25500 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68  each other in th
25510 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
25520 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72  .** which in tur
25530 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62  n can make datab
25540 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65  ase access faste
25550 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
25560 22 65 78 61 63 74 22 20 70 61 72 61 6d 65 74 65  "exact" paramete
25570 72 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20  r is not 0, and 
25580 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  the page-number 
25590 6e 65 61 72 62 79 20 65 78 69 73 74 73 20 0a 2a  nearby exists .*
255a0 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68  * anywhere on th
255b0 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
255c0 6e 20 69 74 20 69 73 20 67 75 61 72 65 6e 74 65  n it is guarente
255d0 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ed to be returne
255e0 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e  d. This.** is on
255f0 6c 79 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d  ly used by auto-
25600 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73  vacuum databases
25610 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67   when allocating
25620 20 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f   a new table..*/
25630 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
25640 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20  cateBtreePage(. 
25650 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
25660 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
25670 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50  age, .  Pgno *pP
25680 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61  gno, .  Pgno nea
25690 72 62 79 2c 0a 20 20 75 38 20 65 78 61 63 74 0a  rby,.  u8 exact.
256a0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
256b0 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  age1;.  int rc;.
256c0 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20    u32 n;     /* 
256d0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
256e0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
256f0 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20  */.  u32 k;     
25700 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
25710 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  ves on the trunk
25720 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
25730 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
25740 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d  Trunk = 0;.  Mem
25750 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b  Page *pPrevTrunk
25760 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50   = 0;.  Pgno mxP
25770 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61  age;     /* Tota
25780 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  l size of the da
25790 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
257a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
257b0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
257c0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50  ->mutex) );.  pP
257d0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
257e0 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62  e1;.  mxPage = b
257f0 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
25800 74 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79  t);.  n = get4by
25810 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
25820 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61  a[36]);.  testca
25830 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20  se( n==mxPage-1 
25840 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61  );.  if( n>=mxPa
25850 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
25860 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
25870 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
25880 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  n>0 ){.    /* Th
25890 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e  ere are pages on
258a0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
258b0 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f  Reuse one of tho
258c0 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20  se pages. */.   
258d0 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20   Pgno iTrunk;.  
258e0 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20    u8 searchList 
258f0 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66  = 0; /* If the f
25900 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65  ree-list must be
25910 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e   searched for 'n
25920 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20  earby' */.    . 
25930 20 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65 78     /* If the 'ex
25940 61 63 74 27 20 70 61 72 61 6d 65 74 65 72 20 77  act' parameter w
25950 61 73 20 74 72 75 65 20 61 6e 64 20 61 20 71 75  as true and a qu
25960 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  ery of the point
25970 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68  er-map.    ** sh
25980 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ows that the pag
25990 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f  e 'nearby' is so
259a0 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  mewhere on the f
259b0 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20  ree-list, then. 
259c0 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
259d0 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65  -list will be se
259e0 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20  arched for that 
259f0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  page..    */.#if
25a00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
25a10 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
25a20 69 66 28 20 65 78 61 63 74 20 26 26 20 6e 65 61  if( exact && nea
25a30 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20  rby<=mxPage ){. 
25a40 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20       u8 eType;. 
25a50 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61       assert( nea
25a60 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  rby>0 );.      a
25a70 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
25a80 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20  Vacuum );.      
25a90 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
25aa0 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79  Bt, nearby, &eTy
25ab0 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  pe, 0);.      if
25ac0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
25ad0 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
25ae0 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
25af0 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  GE ){.        se
25b00 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20  archList = 1;.  
25b10 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 50 67      }.      *pPg
25b20 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20  no = nearby;.   
25b30 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
25b40 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
25b50 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20  free-list count 
25b60 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b  by 1. Set iTrunk
25b70 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
25b80 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73   the.    ** firs
25b90 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  t free-list trun
25ba0 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75  k page. iPrevTru
25bb0 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  nk is initially 
25bc0 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  1..    */.    rc
25bd0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
25be0 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
25bf0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
25c00 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
25c10 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
25c20 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
25c30 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  n-1);..    /* Th
25c40 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68  e code within th
25c50 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f  is loop is run o
25c60 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20  nly once if the 
25c70 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72  'searchList' var
25c80 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  iable.    ** is 
25c90 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77  not true. Otherw
25ca0 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63  ise, it runs onc
25cb0 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b  e for each trunk
25cc0 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20  -page on the.   
25cd0 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e   ** free-list un
25ce0 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65  til the page 'ne
25cf0 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64  arby' is located
25d00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20  ..    */.    do 
25d10 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  {.      pPrevTru
25d20 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  nk = pTrunk;.   
25d30 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e     if( pPrevTrun
25d40 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72  k ){.        iTr
25d50 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
25d60 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
25d70 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  a[0]);.      }el
25d80 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75  se{.        iTru
25d90 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
25da0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
25db0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
25dc0 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e   testcase( iTrun
25dd0 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
25de0 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78     if( iTrunk>mx
25df0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
25e00 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
25e10 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
25e20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
25e30 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
25e40 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
25e50 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
25e60 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
25e70 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  ){.        pTrun
25e80 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  k = 0;.        g
25e90 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
25ea0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  _page;.      }..
25eb0 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79        k = get4by
25ec0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
25ed0 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  a[4]);.      if(
25ee0 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68   k==0 && !search
25ef0 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
25f00 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73  /* The trunk has
25f10 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74   no leaves and t
25f20 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62  he list is not b
25f30 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a  eing searched. .
25f40 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78          ** So ex
25f50 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20  tract the trunk 
25f60 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20  page itself and 
25f70 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65  use it as the ne
25f80 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  wly .        ** 
25f90 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
25fa0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
25fb0 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20  ( pPrevTrunk==0 
25fc0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
25fd0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
25fe0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
25ff0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
26000 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
26010 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
26020 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
26030 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  }.        *pPgno
26040 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
26050 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
26060 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
26070 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
26080 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70   4);.        *pp
26090 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
260a0 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
260b0 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
260c0 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
260d0 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
260e0 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
260f0 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  pPgno, n-1));.  
26100 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
26110 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u32)(pBt->usabl
26120 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a  eSize/4 - 2) ){.
26130 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
26140 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20   of k is out of 
26150 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65  range.  Database
26160 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   corruption */. 
26170 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
26180 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
26190 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
261a0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
261b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
261c0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
261d0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
261e0 73 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65  searchList && ne
261f0 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a  arby==iTrunk ){.
26200 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
26210 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61  ist is being sea
26220 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74  rched and this t
26230 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65  runk page is the
26240 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
26250 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65   to allocate, re
26260 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
26270 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65  her it has leave
26280 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
26290 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70        assert( *p
262a0 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a  Pgno==iTrunk );.
262b0 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
262c0 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
262d0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
262e0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
262f0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
26300 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
26310 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
26320 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
26330 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
26340 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
26350 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  .        if( k==
26360 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
26370 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
26380 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
26390 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
263a0 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
263b0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
263c0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
263d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
263e0 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  cpy(&pPrevTrunk-
263f0 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
26400 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
26410 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
26420 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26430 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
26440 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75  unk page is requ
26450 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ired by the call
26460 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69  er but it contai
26470 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ns .          **
26480 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65   pointers to fre
26490 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54  e-list leaves. T
264a0 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65  he first leaf be
264b0 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20  comes a trunk.  
264c0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
264d0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
264e0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
264f0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e       MemPage *pN
26500 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20  ewTrunk;.       
26510 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e     Pgno iNewTrun
26520 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
26530 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b  runk->aData[8]);
26540 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
26550 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20  NewTrunk>mxPage 
26560 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ){ .            
26570 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
26580 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
26590 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
265a0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
265b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
265c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 4e      testcase( iN
265d0 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20  ewTrunk==mxPage 
265e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
265f0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
26600 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26  Bt, iNewTrunk, &
26610 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  pNewTrunk, 0);. 
26620 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
26630 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26640 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
26650 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
26660 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
26670 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
26680 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
26690 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  NewTrunk->pDbPag
266a0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
266b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
266c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
266d0 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
266e0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
266f0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
26700 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
26710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26720 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
26730 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
26740 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
26750 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   4);.          p
26760 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75  ut4byte(&pNewTru
26770 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  nk->aData[4], k-
26780 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  1);.          me
26790 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
267a0 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75  >aData[8], &pTru
267b0 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28  nk->aData[12], (
267c0 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20  k-1)*4);.       
267d0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
267e0 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
267f0 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
26800 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
26810 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
26820 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
26830 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ble(pPage1->pDbP
26840 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  age) );.        
26850 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
26860 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
26870 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
26880 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
26890 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
268a0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
268b0 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
268c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
268d0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
268e0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
268f0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
26900 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
26910 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
26920 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
26930 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65  k->aData[0], iNe
26940 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
26950 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
26960 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
26970 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
26980 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
26990 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
269a0 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
269b0 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65  pPgno, n-1));.#e
269c0 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65  ndif.      }else
269d0 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20   if( k>0 ){.    
269e0 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61      /* Extract a
269f0 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74   leaf from the t
26a00 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  runk */.        
26a10 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20  u32 closest;.   
26a20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b       Pgno iPage;
26a30 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
26a40 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20  d char *aData = 
26a50 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20  pTrunk->aData;. 
26a60 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
26a70 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
26a80 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
26a90 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
26aa0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
26ab0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
26ac0 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
26ad0 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
26ae0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
26af0 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20  u32 i;.         
26b00 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20   int dist;.     
26b10 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
26b20 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69 73 74  ;.          dist
26b30 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
26b40 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b  ta[8]) - nearby;
26b50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64  .          if( d
26b60 69 73 74 3c 30 20 29 20 64 69 73 74 20 3d 20 2d  ist<0 ) dist = -
26b70 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
26b80 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b  for(i=1; i<k; i+
26b90 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
26ba0 69 6e 74 20 64 32 20 3d 20 67 65 74 34 62 79 74  int d2 = get4byt
26bb0 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
26bc0 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20   - nearby;.     
26bd0 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 30 20         if( d2<0 
26be0 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20  ) d2 = -d2;.    
26bf0 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64          if( d2<d
26c00 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
26c10 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
26c20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
26c30 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20  dist = d2;.     
26c40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26c50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
26c60 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  se{.          cl
26c70 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
26c80 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50     }..        iP
26c90 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
26ca0 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
26cb0 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  4]);.        tes
26cc0 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
26cd0 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
26ce0 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65  if( iPage>mxPage
26cf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
26d00 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
26d10 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
26d20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
26d30 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
26d40 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74    }.        test
26d50 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50  case( iPage==mxP
26d60 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  age );.        i
26d70 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c  f( !searchList |
26d80 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20  | iPage==nearby 
26d90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
26da0 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20   noContent;.    
26db0 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
26dc0 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
26dd0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
26de0 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64  : %d was leaf %d
26df0 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20   of %d on trunk 
26e00 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %d".            
26e10 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20       ": %d more 
26e20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20  free pages\n",. 
26e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e40 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b  *pPgno, closest+
26e50 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  1, k, pTrunk->pg
26e60 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
26e70 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74       if( closest
26e80 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  <k-1 ){.        
26e90 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
26ea0 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20  a[8+closest*4], 
26eb0 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34  &aData[4+k*4], 4
26ec0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
26ed0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
26ee0 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  e(&aData[4], k-1
26ef0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
26f00 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
26f10 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 72  rIswriteable(pTr
26f20 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  unk->pDbPage) );
26f30 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e  .          noCon
26f40 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74  tent = !btreeGet
26f50 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
26f60 2a 70 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  *pPgno);.       
26f70 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
26f80 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
26f90 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74  , ppPage, noCont
26fa0 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ent);.          
26fb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26fc0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
26fd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
26fe0 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65  erWrite((*ppPage
26ff0 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  )->pDbPage);.   
27000 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
27010 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27020 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
27030 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
27040 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
27050 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27060 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
27070 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
27080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
27090 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
270a0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72  runk);.      pPr
270b0 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20  evTrunk = 0;.   
270c0 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c   }while( searchL
270d0 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ist );.  }else{.
270e0 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
270f0 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65   no pages on the
27100 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 63 72   freelist, so cr
27110 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  eate a new page 
27120 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  at the.    ** en
27130 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f  d of the file */
27140 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
27150 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
27160 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
27170 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
27180 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
27190 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
271a0 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
271b0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
271c0 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e  GE(pBt) ) pBt->n
271d0 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66  Page++;..#ifndef
271e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
271f0 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
27200 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
27210 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  && PTRMAP_ISPAGE
27220 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65  (pBt, pBt->nPage
27230 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
27240 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74   *pPgno refers t
27250 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  o a pointer-map 
27260 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74  page, allocate t
27270 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20  wo new pages.   
27280 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64     ** at the end
27290 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73   of the file ins
272a0 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65  tead of one. The
272b0 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64   first allocated
272c0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
272d0 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69  ecomes a new poi
272e0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74  nter-map page, t
272f0 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65  he second is use
27300 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
27310 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
27320 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30  MemPage *pPg = 0
27330 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
27340 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
27350 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70  m end of file (p
27360 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29  ointer-map page)
27370 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  \n", pBt->nPage)
27380 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
27390 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e   pBt->nPage!=PEN
273a0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
273b0 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20  Bt) );.      rc 
273c0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
273d0 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20  Bt, pBt->nPage, 
273e0 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20  &pPg, 1);.      
273f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27400 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
27410 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
27420 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65  ite(pPg->pDbPage
27430 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
27440 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  sePage(pPg);.   
27450 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
27460 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
27470 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b       pBt->nPage+
27480 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  +;.      if( pBt
27490 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47  ->nPage==PENDING
274a0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
274b0 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b  ){ pBt->nPage++;
274c0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
274d0 20 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20      put4byte(28 
274e0 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67  + (u8*)pBt->pPag
274f0 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e  e1->aData, pBt->
27500 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67  nPage);.    *pPg
27510 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b  no = pBt->nPage;
27520 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ..    assert( *p
27530 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
27540 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
27550 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
27560 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
27570 6f 2c 20 70 70 50 61 67 65 2c 20 31 29 3b 0a 20  o, ppPage, 1);. 
27580 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
27590 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  rn rc;.    rc = 
275a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
275b0 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
275c0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
275d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
275e0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
275f0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
27600 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c  }.    TRACE(("AL
27610 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
27620 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20  end of file\n", 
27630 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20  *pPgno));.  }.. 
27640 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
27650 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
27660 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f  GE(pBt) );..end_
27670 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20  allocate_page:. 
27680 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
27690 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  unk);.  releaseP
276a0 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
276b0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
276c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
276d0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
276e0 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67  Refcount((*ppPag
276f0 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29  e)->pDbPage)>1 )
27700 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
27710 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
27720 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27730 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
27740 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61      }.    (*ppPa
27750 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  ge)->isInit = 0;
27760 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
27770 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  pPage = 0;.  }. 
27780 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27790 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
277a0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64  on is used to ad
277b0 64 20 70 61 67 65 20 69 50 61 67 65 20 74 6f 20  d page iPage to 
277c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
277d0 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a  e free-list. .**
277e0 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
277f0 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
27800 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70 61  not already a pa
27810 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c  rt of the free-l
27820 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ist..**.** The v
27830 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
27840 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
27850 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
27860 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e  ion is optional.
27870 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65  .** If the calle
27880 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76  r happens to hav
27890 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
278a0 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63  he MemPage objec
278b0 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  t .** correspond
278c0 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61 67  ing to page iPag
278d0 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20  e handy, it may 
278e0 70 61 73 73 20 69 74 20 61 73 20 74 68 65 20 73  pass it as the s
278f0 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a  econd value. .**
27900 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d   Otherwise, it m
27910 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a  ay pass NULL..**
27920 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72  .** If a pointer
27930 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62   to a MemPage ob
27940 6a 65 63 74 20 69 73 20 70 61 73 73 65 64 20 61  ject is passed a
27950 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
27960 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65  ument,.** its re
27970 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
27980 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20   not altered by 
27990 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
279a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
279b0 65 50 61 67 65 32 28 42 74 53 68 61 72 65 64 20  ePage2(BtShared 
279c0 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70  *pBt, MemPage *p
279d0 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50  MemPage, Pgno iP
279e0 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  age){.  MemPage 
279f0 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20  *pTrunk = 0;    
27a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
27a10 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
27a20 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54  age */.  Pgno iT
27a30 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  runk = 0;       
27a40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27a50 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
27a60 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
27a70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67  age */ .  MemPag
27a80 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
27a90 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a  >pPage1;      /*
27aa0 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65   Local reference
27ab0 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20   to page 1 */.  
27ac0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20  MemPage *pPage; 
27ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ae0 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e      /* Page bein
27af0 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20  g freed. May be 
27b00 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  NULL. */.  int r
27b10 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
27b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27b30 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
27b40 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20  .  int nFree;   
27b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b60 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
27b70 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
27b80 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a  s on free-list *
27b90 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
27ba0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
27bb0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
27bc0 20 61 73 73 65 72 74 28 20 69 50 61 67 65 3e 31   assert( iPage>1
27bd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
27be0 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50  MemPage || pMemP
27bf0 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65  age->pgno==iPage
27c00 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50   );..  if( pMemP
27c10 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
27c20 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20   = pMemPage;.   
27c30 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
27c40 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
27c50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
27c60 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
27c70 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67  Lookup(pBt, iPag
27c80 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  e);.  }..  /* In
27c90 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
27ca0 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70   page count on p
27cb0 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20  Page1 */.  rc = 
27cc0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
27cd0 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
27ce0 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  e);.  if( rc ) g
27cf0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
27d00 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34  ;.  nFree = get4
27d10 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
27d20 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34  ata[36]);.  put4
27d30 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
27d40 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31  ata[36], nFree+1
27d50 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 73  );..  if( pBt->s
27d60 65 63 75 72 65 44 65 6c 65 74 65 20 29 7b 0a 20  ecureDelete ){. 
27d70 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63     /* If the sec
27d80 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f  ure_delete optio
27d90 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
27da0 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73  en.    ** always
27db0 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65   fully overwrite
27dc0 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
27dd0 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e  tion with zeros.
27de0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
27df0 28 21 70 50 61 67 65 20 26 26 20 28 28 72 63 20  (!pPage && ((rc 
27e00 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
27e10 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67  Bt, iPage, &pPag
27e20 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20  e, 0))!=0) ).   
27e30 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20    ||            
27e40 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  ((rc = sqlite3Pa
27e50 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
27e60 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20  pDbPage))!=0).  
27e70 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
27e80 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
27e90 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
27ea0 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20  Page->aData, 0, 
27eb0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65  pPage->pBt->page
27ec0 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Size);.  }..  /*
27ed0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
27ee0 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
27ef0 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20  acuum, write an 
27f00 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69  entry in the poi
27f10 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f  nter-map.  ** to
27f20 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
27f30 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e  he page is free.
27f40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55  .  */.  if( ISAU
27f50 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
27f60 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
27f70 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45  Page, PTRMAP_FRE
27f80 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a  EPAGE, 0, &rc);.
27f90 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
27fa0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
27fb0 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61    }..  /* Now ma
27fc0 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63 74  nipulate the act
27fd0 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72 65  ual database fre
27fe0 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72 65  e-list structure
27ff0 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a  . There are two.
28000 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69    ** possibiliti
28010 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d  es. If the free-
28020 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c  list is currentl
28030 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74  y empty, or if t
28040 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72  he first.  ** tr
28050 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
28060 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c  free-list is ful
28070 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67  l, then this pag
28080 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a  e will become a.
28090 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69    ** new free-li
280a0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f  st trunk page. O
280b0 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c  therwise, it wil
280c0 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20  l become a leaf 
280d0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73  of the.  ** firs
280e0 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
280f0 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65 65  the current free
28100 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63  -list. This bloc
28110 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20 20  k tests if it.  
28120 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
28130 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20 61  o add the page a
28140 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73  s a new free-lis
28150 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69  t leaf..  */.  i
28160 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20  f( nFree!=0 ){. 
28170 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20     u32 nLeaf;   
28180 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28190 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f  Initial number o
281a0 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20  f leaf cells on 
281b0 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20  trunk page */.. 
281c0 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
281d0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
281e0 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63  ata[32]);.    rc
281f0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
28200 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54  pBt, iTrunk, &pT
28210 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66  runk, 0);.    if
28220 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28230 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
28240 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
28250 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67  }..    nLeaf = g
28260 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
28270 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
28280 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
28290 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20  bleSize>32 );.  
282a0 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75    if( nLeaf > (u
282b0 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  32)pBt->usableSi
282c0 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20  ze/4 - 2 ){.    
282d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
282e0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
282f0 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
28300 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  out;.    }.    i
28310 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29  f( nLeaf < (u32)
28320 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
28330 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f  4 - 8 ){.      /
28340 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
28350 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20  here is room on 
28360 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74  the trunk page t
28370 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61 67  o insert the pag
28380 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67  e.      ** being
28390 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77 20   freed as a new 
283a0 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  leaf..      **. 
283b0 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
283c0 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  t the trunk page
283d0 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66   is not really f
283e0 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e  ull until it con
283f0 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75  tains.      ** u
28400 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20  sableSize/4 - 2 
28410 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61  entries, not usa
28420 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e  bleSize/4 - 8 en
28430 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76 65  tries as we have
28440 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e  .      ** coded.
28450 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20 63    But due to a c
28460 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76  oding error in v
28470 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
28480 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20  e prior to.     
28490 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62   ** 3.6.0, datab
284a0 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c 69  ases with freeli
284b0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68  st trunk pages h
284c0 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  olding more than
284d0 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
284e0 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69  Size/4 - 8 entri
284f0 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72  es will be repor
28500 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20  ted as corrupt. 
28510 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20   In order.      
28520 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62  ** to maintain b
28530 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
28540 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65  bility with olde
28550 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
28560 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77  Lite,.      ** w
28570 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
28580 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20  to restrict the 
28590 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
285a0 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f  s to usableSize/
285b0 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66  4 - 8.      ** f
285c0 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65  or now.  At some
285d0 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
285e0 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79  ture (once every
285f0 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64  one has upgraded
28600 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36  .      ** to 3.6
28610 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20  .0 or later) we 
28620 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20  should consider 
28630 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69  fixing the condi
28640 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20  tional above.   
28650 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75     ** to read "u
28660 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69  sableSize/4-2" i
28670 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c  nstead of "usabl
28680 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20  eSize/4-8"..    
28690 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
286a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
286b0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
286c0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
286d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
286e0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
286f0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
28700 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20  ], nLeaf+1);.   
28710 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
28720 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e  Trunk->aData[8+n
28730 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b  Leaf*4], iPage);
28740 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
28750 67 65 20 26 26 20 21 70 42 74 2d 3e 73 65 63 75  ge && !pBt->secu
28760 72 65 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20  reDelete ){.    
28770 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
28780 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67  erDontWrite(pPag
28790 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
287a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
287b0 63 20 3d 20 62 74 72 65 65 53 65 74 48 61 73 43  c = btreeSetHasC
287c0 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67  ontent(pBt, iPag
287d0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
287e0 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
287f0 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20  AGE: %d leaf on 
28800 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22  trunk page %d\n"
28810 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72  ,pPage->pgno,pTr
28820 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  unk->pgno));.   
28830 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
28840 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
28850 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
28860 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70   flows to this p
28870 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61  oint, then it wa
28880 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
28890 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74  o add the.  ** t
288a0 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72  he page being fr
288b0 65 65 64 20 61 73 20 61 20 6c 65 61 66 20 70 61  eed as a leaf pa
288c0 67 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ge of the first 
288d0 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65  trunk in the fre
288e0 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73  e-list..  ** Pos
288f0 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
28900 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65  e free-list is e
28910 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c  mpty, or possibl
28920 79 20 62 65 63 61 75 73 65 20 74 68 65 20 0a 20  y because the . 
28930 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20   ** first trunk 
28940 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
28950 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72   is full. Either
28960 20 77 61 79 2c 20 74 68 65 20 70 61 67 65 20 62   way, the page b
28970 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20  eing freed.  ** 
28980 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
28990 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20  new first trunk 
289a0 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65  page in the free
289b0 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  -list..  */.  if
289c0 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51  ( pPage==0 && SQ
289d0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62  LITE_OK!=(rc = b
289e0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
289f0 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20   iPage, &pPage, 
28a00 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  0)) ){.    goto 
28a10 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
28a20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
28a30 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
28a40 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
28a50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28a60 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
28a70 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
28a80 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
28a90 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a  aData, iTrunk);.
28aa0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
28ab0 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b  e->aData[4], 0);
28ac0 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
28ad0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
28ae0 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28  iPage);.  TRACE(
28af0 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
28b00 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72  new trunk page r
28b10 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20  eplacing %d\n", 
28b20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72  pPage->pgno, iTr
28b30 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65  unk));..freepage
28b40 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67  _out:.  if( pPag
28b50 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  e ){.    pPage->
28b60 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  isInit = 0;.  }.
28b70 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
28b80 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  age);.  releaseP
28b90 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
28ba0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74  eturn rc;.}.stat
28bb0 69 63 20 76 6f 69 64 20 66 72 65 65 50 61 67 65  ic void freePage
28bc0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
28bd0 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66   int *pRC){.  if
28be0 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45  ( (*pRC)==SQLITE
28bf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  _OK ){.    *pRC 
28c00 3d 20 66 72 65 65 50 61 67 65 32 28 70 50 61 67  = freePage2(pPag
28c10 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70  e->pBt, pPage, p
28c20 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d  Page->pgno);.  }
28c30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
28c40 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
28c50 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
28c60 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c  h the given Cell
28c70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28c80 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67  clearCell(MemPag
28c90 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e  e *pPage, unsign
28ca0 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b  ed char *pCell){
28cb0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
28cc0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
28cd0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
28ce0 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b    Pgno ovflPgno;
28cf0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
28d00 20 6e 4f 76 66 6c 3b 0a 20 20 75 31 36 20 6f 76   nOvfl;.  u16 ov
28d10 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61  flPageSize;..  a
28d20 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
28d30 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
28d40 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
28d50 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
28d60 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
28d70 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , &info);.  if( 
28d80 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d  info.iOverflow==
28d90 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
28da0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e  SQLITE_OK;  /* N
28db0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
28dc0 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74  . Return without
28dd0 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
28de0 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e  */.  }.  ovflPgn
28df0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  o = get4byte(&pC
28e00 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
28e10 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow]);.  assert( 
28e20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
28e30 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67  > 4 );.  ovflPag
28e40 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
28e50 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e  bleSize - 4;.  n
28e60 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61  Ovfl = (info.nPa
28e70 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f  yload - info.nLo
28e80 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  cal + ovflPageSi
28e90 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65  ze - 1)/ovflPage
28ea0 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
28eb0 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e  ovflPgno==0 || n
28ec0 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c  Ovfl>0 );.  whil
28ed0 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20  e( nOvfl-- ){.  
28ee0 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30    Pgno iNext = 0
28ef0 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
28f00 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66  Ovfl = 0;.    if
28f10 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20  ( ovflPgno<2 || 
28f20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61  ovflPgno>btreePa
28f30 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
28f40 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f        /* 0 is no
28f50 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  t a legal page n
28f60 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31  umber and page 1
28f70 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20   cannot be an . 
28f80 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
28f90 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65   page. Therefore
28fa0 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f   if ovflPgno<2 o
28fb0 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  r past the end o
28fc0 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  f the .      ** 
28fd0 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73  file the databas
28fe0 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
28ff0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
29000 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
29010 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
29020 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20    if( nOvfl ){. 
29030 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
29040 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f  rflowPage(pBt, o
29050 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c  vflPgno, &pOvfl,
29060 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20   &iNext);.      
29070 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
29080 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rc;.    }..    i
29090 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28  f( ( pOvfl || ((
290a0 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67  pOvfl = btreePag
290b0 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66  eLookup(pBt, ovf
290c0 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20  lPgno))!=0) ).  
290d0 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
290e0 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
290f0 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d  Ovfl->pDbPage)!=
29100 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  1.    ){.      /
29110 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65  * There is no re
29120 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20  ason any cursor 
29130 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f  should have an o
29140 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
29150 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  ence .      ** t
29160 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
29170 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
29180 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62  a cell that is b
29190 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64  eing deleted/upd
291a0 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53  ated..      ** S
291b0 6f 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  o if there exist
291c0 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
291d0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69  reference to thi
291e0 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  s page, then it 
291f0 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e  .      ** must n
29200 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20  ot really be an 
29210 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e  overflow page an
29220 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  d the database m
29230 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ust be corrupt. 
29240 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20  .      ** It is 
29250 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63  helpful to detec
29260 74 20 74 68 69 73 20 62 65 66 6f 72 65 20 63 61  t this before ca
29270 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32 28  lling freePage2(
29280 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20  ), as .      ** 
29290 66 72 65 65 50 61 67 65 32 28 29 20 6d 61 79 20  freePage2() may 
292a0 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f  zero the page co
292b0 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75 72 65  ntents if secure
292c0 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a  -delete mode is.
292d0 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64        ** enabled
292e0 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65 72 66  . If this 'overf
292f0 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70 65 6e  low' page happen
29300 73 20 74 6f 20 62 65 20 61 20 70 61 67 65 20 74  s to be a page t
29310 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
29320 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61   caller is itera
29330 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20  ting through or 
29340 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74  using in some ot
29350 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20  her way, this.  
29360 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72      ** can be pr
29370 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20  oblematic..     
29380 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
29390 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
293a0 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  PT;.    }else{. 
293b0 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
293c0 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20  ge2(pBt, pOvfl, 
293d0 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d  ovflPgno);.    }
293e0 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20  ..    if( pOvfl 
293f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29400 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c  PagerUnref(pOvfl
29410 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
29420 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  }.    if( rc ) r
29430 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76  eturn rc;.    ov
29440 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a  flPgno = iNext;.
29450 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
29460 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
29470 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65   Create the byte
29480 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74   sequence used t
29490 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65  o represent a ce
294a0 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65  ll on page pPage
294b0 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68  .** and write th
294c0 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  at byte sequence
294d0 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20   into pCell[].  
294e0 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  Overflow pages a
294f0 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
29500 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73  and filled in as
29510 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
29520 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
29530 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  re.** is respons
29540 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
29550 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20  sure sufficient 
29560 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61  space has been a
29570 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20  llocated.** for 
29580 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e  pCell[]..**.** N
29590 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64  ote that pCell d
295a0 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  oes not necessar
295b0 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20  y need to point 
295c0 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  to the pPage->aD
295d0 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43  ata.** area.  pC
295e0 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ell might point 
295f0 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72  to some temporar
29600 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20  y storage.  The 
29610 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  cell will.** be 
29620 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74  constructed in t
29630 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72  his temporary ar
29640 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69  ea then copied i
29650 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
29660 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74  .** later..*/.st
29670 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
29680 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
29690 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
296a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
296b0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
296c0 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the cell */.  un
296d0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
296e0 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ll,          /* 
296f0 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  Complete text of
29700 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63   the cell */.  c
29710 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
29720 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a   i64 nKey,    /*
29730 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f   The key */.  co
29740 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
29750 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20  int nData,   /* 
29760 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  The data */.  in
29770 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20  t nZero,        
29780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29790 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73  Extra zero bytes
297a0 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44   to append to pD
297b0 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ata */.  int *pn
297c0 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
297d0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
297e0 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20   cell size here 
297f0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79  */.){.  int nPay
29800 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38  load;.  const u8
29810 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53   *pSrc;.  int nS
29820 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74  rc, n, rc;.  int
29830 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65   spaceLeft;.  Me
29840 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
29850 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f  ;.  MemPage *pTo
29860 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75  Release = 0;.  u
29870 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
29880 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64  rior;.  unsigned
29890 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b   char *pPayload;
298a0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
298b0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
298c0 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d   Pgno pgnoOvfl =
298d0 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65   0;.  int nHeade
298e0 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  r;.  CellInfo in
298f0 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  fo;..  assert( s
29900 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
29910 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
29920 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50  tex) );..  /* pP
29930 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  age is not neces
29940 73 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65  sarily writeable
29950 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67   since pCell mig
29960 68 74 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a  ht be auxiliary.
29970 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63    ** buffer spac
29980 65 20 74 68 61 74 20 69 73 20 73 65 70 61 72 61  e that is separa
29990 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67  te from the pPag
299a0 65 20 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f  e buffer area */
299b0 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c  .  assert( pCell
299c0 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
299d0 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e   pCell>=&pPage->
299e0 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
299f0 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
29a00 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
29a10 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
29a20 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
29a30 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
29a40 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48   header. */.  nH
29a50 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  eader = 0;.  if(
29a60 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
29a70 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
29a80 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  4;.  }.  if( pPa
29a90 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
29aa0 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75     nHeader += pu
29ab0 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
29ac0 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e  Header], nData+n
29ad0 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Zero);.  }else{.
29ae0 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72      nData = nZer
29af0 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65  o = 0;.  }.  nHe
29b00 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
29b10 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  t(&pCell[nHeader
29b20 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29  ], *(u64*)&nKey)
29b30 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
29b40 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
29b50 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73  ll, &info);.  as
29b60 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64  sert( info.nHead
29b70 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20  er==nHeader );. 
29b80 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b   assert( info.nK
29b90 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73  ey==nKey );.  as
29ba0 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61  sert( info.nData
29bb0 3d 3d 28 75 33 32 29 28 6e 44 61 74 61 2b 6e 5a  ==(u32)(nData+nZ
29bc0 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  ero) );.  .  /* 
29bd0 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c  Fill in the payl
29be0 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61  oad */.  nPayloa
29bf0 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72  d = nData + nZer
29c00 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  o;.  if( pPage->
29c10 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53  intKey ){.    pS
29c20 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  rc = pData;.    
29c30 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20  nSrc = nData;.  
29c40 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d    nData = 0;.  }
29c50 65 6c 73 65 7b 20 0a 20 20 20 20 69 66 28 20 4e  else{ .    if( N
29c60 45 56 45 52 28 6e 4b 65 79 3e 30 78 37 66 66 66  EVER(nKey>0x7fff
29c70 66 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 29  ffff || pKey==0)
29c80 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
29c90 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
29ca0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
29cb0 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69 6e 74  nPayload += (int
29cc0 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20  )nKey;.    pSrc 
29cd0 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63  = pKey;.    nSrc
29ce0 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20   = (int)nKey;.  
29cf0 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e  }.  *pnSize = in
29d00 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63  fo.nSize;.  spac
29d10 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f  eLeft = info.nLo
29d20 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20  cal;.  pPayload 
29d30 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  = &pCell[nHeader
29d40 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70  ];.  pPrior = &p
29d50 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
29d60 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20  low];..  while( 
29d70 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20  nPayload>0 ){.  
29d80 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d    if( spaceLeft=
29d90 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
29da0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
29db0 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20  CUUM.      Pgno 
29dc0 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e  pgnoPtrmap = pgn
29dd0 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c  oOvfl; /* Overfl
29de0 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d  ow page pointer-
29df0 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a  map entry page *
29e00 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
29e10 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
29e20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20         do{.     
29e30 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b       pgnoOvfl++;
29e40 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65  .        } while
29e50 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52  ( .          PTR
29e60 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
29e70 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e  pgnoOvfl) || pgn
29e80 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42  oOvfl==PENDING_B
29e90 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20  YTE_PAGE(pBt) . 
29ea0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
29eb0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  }.#endif.      r
29ec0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
29ed0 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66  ePage(pBt, &pOvf
29ee0 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67  l, &pgnoOvfl, pg
29ef0 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e  noOvfl, 0);.#ifn
29f00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
29f10 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
29f20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
29f30 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
29f40 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68  o-vacuum, and th
29f50 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73  e second or subs
29f60 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  equent.      ** 
29f70 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
29f80 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64   being allocated
29f90 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74  , add an entry t
29fa0 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
29fb0 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  p.      ** for t
29fc0 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20  hat page now. . 
29fd0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
29fe0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
29ff0 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
2a000 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20  age, then write 
2a010 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20  a partial entry 
2a020 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  .      ** to the
2a030 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66   pointer-map. If
2a040 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e   we write nothin
2a050 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65  g to this pointe
2a060 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20  r-map slot,.    
2a070 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70    ** then the op
2a080 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f  timistic overflo
2a090 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69  w chain processi
2a0a0 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28  ng in clearCell(
2a0b0 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d  ).      ** may m
2a0c0 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20  isinterpret the 
2a0d0 75 6e 69 6e 69 74 69 61 6c 69 73 65 64 20 76 61  uninitialised va
2a0e0 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20  lues and delete 
2a0f0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f  the.      ** wro
2a100 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ng pages from th
2a110 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
2a120 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
2a130 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
2a140 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
2a150 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54  ){.        u8 eT
2a160 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61  ype = (pgnoPtrma
2a170 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  p?PTRMAP_OVERFLO
2a180 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  W2:PTRMAP_OVERFL
2a190 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74  OW1);.        pt
2a1a0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
2a1b0 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67  oOvfl, eType, pg
2a1c0 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a  noPtrmap, &rc);.
2a1d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2a1e0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
2a1f0 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a  asePage(pOvfl);.
2a200 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a210 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
2a220 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2a230 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
2a240 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
2a250 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2a260 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
2a270 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  f pToRelease is 
2a280 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50  not zero than pP
2a290 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f  rior points into
2a2a0 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
2a2b0 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65       ** of pToRe
2a2c0 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72  lease.  Make sur
2a2d0 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  e pToRelease is 
2a2e0 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e  still writeable.
2a2f0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
2a300 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20  ( pToRelease==0 
2a310 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
2a320 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65  swriteable(pToRe
2a330 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20  lease->pDbPage) 
2a340 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
2a350 70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f  pPrior is part o
2a360 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20  f the data area 
2a370 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d  of pPage, then m
2a380 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20  ake sure pPage. 
2a390 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c       ** is still
2a3a0 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20   writeable */.  
2a3b0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69      assert( pPri
2a3c0 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  or<pPage->aData 
2a3d0 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67  || pPrior>=&pPag
2a3e0 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
2a3f0 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
2a400 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
2a410 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2a420 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
2a430 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ;..      put4byt
2a440 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76  e(pPrior, pgnoOv
2a450 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  fl);.      relea
2a460 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
2a470 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c  e);.      pToRel
2a480 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20  ease = pOvfl;.  
2a490 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76      pPrior = pOv
2a4a0 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  fl->aData;.     
2a4b0 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
2a4c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79  , 0);.      pPay
2a4d0 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61  load = &pOvfl->a
2a4e0 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73  Data[4];.      s
2a4f0 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e  paceLeft = pBt->
2a500 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
2a510 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50      }.    n = nP
2a520 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20  ayload;.    if( 
2a530 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20  n>spaceLeft ) n 
2a540 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20  = spaceLeft;..  
2a550 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
2a560 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
2a570 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69  han pPayload poi
2a580 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
2a590 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66  a area.    ** of
2a5a0 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
2a5b0 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
2a5c0 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
2a5d0 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73  eable. */.    as
2a5e0 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65  sert( pToRelease
2a5f0 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  ==0 || sqlite3Pa
2a600 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2a610 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61  ToRelease->pDbPa
2a620 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ge) );..    /* I
2a630 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61  f pPayload is pa
2a640 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
2a650 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68  rea of pPage, th
2a660 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61  en make sure pPa
2a670 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  ge.    ** is sti
2a680 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
2a690 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79      assert( pPay
2a6a0 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74  load<pPage->aDat
2a6b0 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26  a || pPayload>=&
2a6c0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
2a6d0 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
2a6e0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2a6f0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2a700 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2a710 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e  e) );..    if( n
2a720 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  Src>0 ){.      i
2a730 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20  f( n>nSrc ) n = 
2a740 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65  nSrc;.      asse
2a750 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20  rt( pSrc );.    
2a760 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
2a770 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20  d, pSrc, n);.   
2a780 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
2a790 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30  mset(pPayload, 0
2a7a0 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , n);.    }.    
2a7b0 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20  nPayload -= n;. 
2a7c0 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     pPayload += n
2a7d0 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b  ;.    pSrc += n;
2a7e0 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a  .    nSrc -= n;.
2a7f0 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d      spaceLeft -=
2a800 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63   n;.    if( nSrc
2a810 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72  ==0 ){.      nSr
2a820 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20  c = nData;.     
2a830 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20   pSrc = pData;. 
2a840 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61     }.  }.  relea
2a850 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
2a860 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
2a870 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2a880 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68   Remove the i-th
2a890 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
2a8a0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2a8b0 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e  effects pPage on
2a8c0 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ly..** The cell 
2a8d0 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66  content is not f
2a8e0 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61  reed or dealloca
2a8f0 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75  ted.  It is assu
2a900 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
2a910 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  cell content has
2a920 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d   been copied som
2a930 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68  eplace else.  Th
2a940 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a  is routine just.
2a950 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72  ** removes the r
2a960 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
2a970 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
2a980 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74  .**.** "sz" must
2a990 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
2a9a0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63  f bytes in the c
2a9b0 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ell..*/.static v
2a9c0 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d  oid dropCell(Mem
2a9d0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
2a9e0 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e   idx, int sz, in
2a9f0 74 20 2a 70 52 43 29 7b 0a 20 20 69 6e 74 20 69  t *pRC){.  int i
2aa00 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  ;          /* Lo
2aa10 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
2aa20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
2aa30 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c  /* Offset to cel
2aa40 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c  l content of cel
2aa50 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  l being deleted 
2aa60 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
2aa70 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61       /* pPage->a
2aa80 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74  Data */.  u8 *pt
2aa90 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  r;        /* Use
2aaa0 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20  d to move bytes 
2aab0 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61  around within da
2aac0 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ta[] */.  int rc
2aad0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
2aae0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
2aaf0 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
2ab00 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f    /* Beginning o
2ab10 66 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 30  f the header.  0
2ab20 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31 30   most pages.  10
2ab30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69  0 page 1 */..  i
2ab40 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
2ab50 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  ;..  assert( idx
2ab60 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65  >=0 && idx<pPage
2ab70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
2ab80 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a  ert( sz==cellSiz
2ab90 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b  e(pPage, idx) );
2aba0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2abb0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2abc0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2abd0 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
2abe0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2abf0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
2ac00 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20  utex) );.  data 
2ac10 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
2ac20 20 20 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50    ptr = &data[pP
2ac30 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
2ac40 2b 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d  + 2*idx];.  pc =
2ac50 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a   get2byte(ptr);.
2ac60 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
2ac70 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74  drOffset;.  test
2ac80 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79  case( pc==get2by
2ac90 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
2aca0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
2acb0 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42  pc+sz==pPage->pB
2acc0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
2acd0 0a 20 20 69 66 28 20 70 63 20 3c 20 67 65 74 32  .  if( pc < get2
2ace0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
2acf0 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50  ]) || pc+sz > pP
2ad00 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
2ad10 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43  Size ){.    *pRC
2ad20 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2ad30 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
2ad40 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66  rn;.  }.  rc = f
2ad50 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  reeSpace(pPage, 
2ad60 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72  pc, sz);.  if( r
2ad70 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  c ){.    *pRC = 
2ad80 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
2ad90 20 20 7d 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b    }.  for(i=idx+
2ada0 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  1; i<pPage->nCel
2adb0 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b  l; i++, ptr+=2){
2adc0 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74  .    ptr[0] = pt
2add0 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d  r[2];.    ptr[1]
2ade0 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20   = ptr[3];.  }. 
2adf0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b   pPage->nCell--;
2ae00 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
2ae10 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d  a[hdr+3], pPage-
2ae20 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65  >nCell);.  pPage
2ae30 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 7d 0a  ->nFree += 2;.}.
2ae40 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20  ./*.** Insert a 
2ae50 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67  new cell on pPag
2ae60 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20  e at cell index 
2ae70 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e  "i".  pCell poin
2ae80 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e  ts to the.** con
2ae90 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tent of the cell
2aea0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
2aeb0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c  ell content will
2aec0 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65   fit on the page
2aed0 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68  , then put it th
2aee0 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77  ere.  If it.** w
2aef0 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65  ill not fit, the
2af00 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  n make a copy of
2af10 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
2af20 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a  t into pTemp if.
2af30 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20  ** pTemp is not 
2af40 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73  null.  Regardles
2af50 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f  s of pTemp, allo
2af60 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79  cate a new entry
2af70 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f  .** in pPage->aO
2af80 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69  vfl[] and make i
2af90 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63  t point to the c
2afa0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74  ell content (eit
2afb0 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20  her.** in pTemp 
2afc0 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
2afd0 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20  pCell) and also 
2afe0 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78  record its index
2aff0 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67  . .** Allocating
2b000 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
2b010 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69  pPage->aCell[] i
2b020 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20  mplies that .** 
2b030 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2b040 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e   is incremented.
2b050 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20  .**.** If nSkip 
2b060 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
2b070 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68  n do not copy th
2b080 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79  e first nSkip by
2b090 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65  tes of the.** ce
2b0a0 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ll. The caller w
2b0b0 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68  ill overwrite th
2b0c0 65 6d 20 61 66 74 65 72 20 74 68 69 73 20 66 75  em after this fu
2b0d0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20  nction returns. 
2b0e0 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e  If.** nSkip is n
2b0f0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43  on-zero, then pC
2b100 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e  ell may not poin
2b110 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20  t to an invalid 
2b120 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
2b130 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e  .** (but pCell+n
2b140 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20 76  Skip is always v
2b150 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  alid)..*/.static
2b160 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c   void insertCell
2b170 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
2b180 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e  ge,   /* Page in
2b190 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20  to which we are 
2b1a0 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  copying */.  int
2b1b0 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f   i,            /
2b1c0 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d  * New cell becom
2b1d0 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  es the i-th cell
2b1e0 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
2b1f0 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
2b200 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
2b210 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a  f the new cell *
2b220 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20  /.  int sz,     
2b230 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
2b240 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65  f content in pCe
2b250 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d  ll */.  u8 *pTem
2b260 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  p,        /* Tem
2b270 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20  p storage space 
2b280 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65  for pCell, if ne
2b290 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  eded */.  Pgno i
2b2a0 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49  Child,      /* I
2b2b0 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c  f non-zero, repl
2b2c0 61 63 65 20 66 69 72 73 74 20 34 20 62 79 74 65  ace first 4 byte
2b2d0 73 20 77 69 74 68 20 74 68 69 73 20 76 61 6c 75  s with this valu
2b2e0 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20  e */.  int *pRC 
2b2f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
2b300 20 61 6e 64 20 77 72 69 74 65 20 72 65 74 75 72   and write retur
2b310 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65  n code from here
2b320 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78   */.){.  int idx
2b330 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68   = 0;      /* Wh
2b340 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77  ere to write new
2b350 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
2b360 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
2b370 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   j;            /
2b380 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
2b390 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20  /.  int end;    
2b3a0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
2b3b0 79 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73  yte past the las
2b3c0 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  t cell pointer i
2b3d0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
2b3e0 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20  t ins;          
2b3f0 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61  /* Index in data
2b400 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c  [] where new cel
2b410 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73  l pointer is ins
2b420 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63  erted */.  int c
2b430 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20  ellOffset;   /* 
2b440 41 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74  Address of first
2b450 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
2b460 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20   data[] */.  u8 
2b470 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f  *data;         /
2b480 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * The content of
2b490 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20   the whole page 
2b4a0 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
2b4b0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66         /* Used f
2b4c0 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d  or moving inform
2b4d0 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20  ation around in 
2b4e0 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 69 6e 74  data[] */..  int
2b4f0 20 6e 53 6b 69 70 20 3d 20 28 69 43 68 69 6c 64   nSkip = (iChild
2b500 20 3f 20 34 20 3a 20 30 29 3b 0a 0a 20 20 69 66   ? 4 : 0);..  if
2b510 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
2b520 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  ..  assert( i>=0
2b530 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43   && i<=pPage->nC
2b540 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ell+pPage->nOver
2b550 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74  flow );.  assert
2b560 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d  ( pPage->nCell<=
2b570 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
2b580 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70  Bt) && MX_CELL(p
2b590 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30  Page->pBt)<=5460
2b5a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2b5b0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d  age->nOverflow<=
2b5c0 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d  ArraySize(pPage-
2b5d0 3e 61 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73  >aOvfl) );.  ass
2b5e0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2b5f0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2b600 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2b610 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75  /* The cell shou
2b620 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73  ld normally be s
2b630 69 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20  ized correctly. 
2b640 20 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d   However, when m
2b650 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c  oving a.  ** mal
2b660 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d  formed cell from
2b670 20 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20   a leaf page to 
2b680 61 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65  an interior page
2b690 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69  , if the cell si
2b6a0 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74  ze.  ** wanted t
2b6b0 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34  o be less than 4
2b6c0 20 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64   but got rounded
2b6d0 20 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20   up to 4 on the 
2b6e0 6c 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a  leaf, then size.
2b6f0 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65    ** might be le
2b700 73 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d  ss than 8 (leaf-
2b710 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20  size + pointer) 
2b720 6f 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20  on the interior 
2b730 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a  node.  Hence.  *
2b740 2a 20 74 68 65 20 74 65 72 6d 20 61 66 74 65 72  * the term after
2b750 20 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66   the || in the f
2b760 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
2b770 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ). */.  assert( 
2b780 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  sz==cellSizePtr(
2b790 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c  pPage, pCell) ||
2b7a0 20 28 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c   (sz==8 && iChil
2b7b0 64 3e 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50  d>0) );.  if( pP
2b7c0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c  age->nOverflow |
2b7d0 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46  | sz+2>pPage->nF
2b7e0 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ree ){.    if( p
2b7f0 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65  Temp ){.      me
2b800 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70  mcpy(pTemp+nSkip
2b810 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73  , pCell+nSkip, s
2b820 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20  z-nSkip);.      
2b830 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20  pCell = pTemp;. 
2b840 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68     }.    if( iCh
2b850 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74  ild ){.      put
2b860 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68  4byte(pCell, iCh
2b870 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ild);.    }.    
2b880 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  j = pPage->nOver
2b890 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65  flow++;.    asse
2b8a0 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65  rt( j<(int)(size
2b8b0 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29  of(pPage->aOvfl)
2b8c0 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  /sizeof(pPage->a
2b8d0 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20  Ovfl[0])) );.   
2b8e0 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d   pPage->aOvfl[j]
2b8f0 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a  .pCell = pCell;.
2b900 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c      pPage->aOvfl
2b910 5b 6a 5d 2e 69 64 78 20 3d 20 28 75 31 36 29 69  [j].idx = (u16)i
2b920 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
2b930 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
2b940 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
2b950 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
2b960 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2b970 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
2b980 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
2b990 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  n;.    }.    ass
2b9a0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2b9b0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2b9c0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
2b9d0 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
2b9e0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 63 65 6c  ->aData;.    cel
2b9f0 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
2ba00 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20  >cellOffset;.   
2ba10 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65   end = cellOffse
2ba20 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
2ba30 6c 6c 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65  ll;.    ins = ce
2ba40 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a  llOffset + 2*i;.
2ba50 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
2ba60 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a  eSpace(pPage, sz
2ba70 2c 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28  , &idx);.    if(
2ba80 20 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63   rc ){ *pRC = rc
2ba90 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20  ; return; }.    
2baa0 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53  /* The allocateS
2bab0 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67  pace() routine g
2bac0 75 61 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f  uarantees the fo
2bad0 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 70 72 6f 70  llowing two prop
2bae0 65 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66  erties.    ** if
2baf0 20 69 74 20 72 65 74 75 72 6e 73 20 73 75 63 63   it returns succ
2bb00 65 73 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ess */.    asser
2bb10 74 28 20 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20  t( idx >= end+2 
2bb20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
2bb30 64 78 2b 73 7a 20 3c 3d 20 70 50 61 67 65 2d 3e  dx+sz <= pPage->
2bb40 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2bb50 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43  );.    pPage->nC
2bb60 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65  ell++;.    pPage
2bb70 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29  ->nFree -= (u16)
2bb80 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65  (2 + sz);.    me
2bb90 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e  mcpy(&data[idx+n
2bba0 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b  Skip], pCell+nSk
2bbb0 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
2bbc0 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
2bbd0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
2bbe0 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69  &data[idx], iChi
2bbf0 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ld);.    }.    f
2bc00 6f 72 28 6a 3d 65 6e 64 2c 20 70 74 72 3d 26 64  or(j=end, ptr=&d
2bc10 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a  ata[j]; j>ins; j
2bc20 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20  -=2, ptr-=2){.  
2bc30 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72      ptr[0] = ptr
2bc40 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b  [-2];.      ptr[
2bc50 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20  1] = ptr[-1];.  
2bc60 20 20 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65    }.    put2byte
2bc70 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78  (&data[ins], idx
2bc80 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
2bc90 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  &data[pPage->hdr
2bca0 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65  Offset+3], pPage
2bcb0 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65  ->nCell);.#ifnde
2bcc0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2bcd0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
2bce0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74   pPage->pBt->aut
2bcf0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
2bd00 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79   /* The cell may
2bd10 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74   contain a point
2bd20 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  er to an overflo
2bd30 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77  w page. If so, w
2bd40 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  rite.      ** th
2bd50 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  e entry for the 
2bd60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
2bd70 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  to the pointer m
2bd80 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ap..      */.   
2bd90 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
2bda0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
2bdb0 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65  , pRC);.    }.#e
2bdc0 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ndif.  }.}../*.*
2bdd0 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20  * Add a list of 
2bde0 63 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e  cells to a page.
2bdf0 20 20 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c    The page shoul
2be00 64 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65  d be initially e
2be10 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  mpty..** The cel
2be20 6c 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ls are guarantee
2be30 64 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  d to fit on the 
2be40 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
2be50 76 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67  void assemblePag
2be60 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  e(.  MemPage *pP
2be70 61 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61  age,   /* The pa
2be80 67 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c  ge to be assembl
2be90 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ied */.  int nCe
2bea0 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ll,        /* Th
2beb0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  e number of cell
2bec0 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73  s to add to this
2bed0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
2bee0 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20  apCell,      /* 
2bef0 50 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c  Pointers to cell
2bf00 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36   bodies */.  u16
2bf10 20 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f   *aSize        /
2bf20 2a 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63  * Sizes of the c
2bf30 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ells */.){.  int
2bf40 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   i;            /
2bf50 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
2bf60 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72  /.  u8 *pCellptr
2bf70 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
2bf80 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f   of next cell po
2bf90 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63  inter */.  int c
2bfa0 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20  ellbody;     /* 
2bfb0 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
2bfc0 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75  cell body */.  u
2bfd0 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d  8 * const data =
2bfe0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20   pPage->aData;  
2bff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
2c000 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f  inter to data fo
2c010 72 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e  r pPage */.  con
2c020 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61  st int hdr = pPa
2c030 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20  ge->hdrOffset;  
2c040 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
2c050 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20  et of header on 
2c060 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  pPage */.  const
2c070 20 69 6e 74 20 6e 55 73 61 62 6c 65 20 3d 20 70   int nUsable = p
2c080 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
2c090 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65  eSize; /* Usable
2c0a0 20 73 69 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f   size of page */
2c0b0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
2c0c0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
2c0d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2c0e0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2c0f0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2c100 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2c110 6e 43 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c  nCell>=0 && nCel
2c120 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  l<=MX_CELL(pPage
2c130 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c  ->pBt) && MX_CEL
2c140 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35  L(pPage->pBt)<=5
2c150 34 36 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  460 );.  assert(
2c160 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2c170 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2c180 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
2c190 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
2c1a0 20 70 61 67 65 20 68 61 73 20 6a 75 73 74 20 62   page has just b
2c1b0 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a 65  een zeroed by ze
2c1c0 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20 61 73  roPage() */.  as
2c1d0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
2c1e0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ll==0 );.  asser
2c1f0 74 28 20 67 65 74 32 62 79 74 65 28 26 64 61 74  t( get2byte(&dat
2c200 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62  a[hdr+5])==nUsab
2c210 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74  le );..  pCellpt
2c220 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  r = &data[pPage-
2c230 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43  >cellOffset + nC
2c240 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f  ell*2];.  cellbo
2c250 64 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20  dy = nUsable;.  
2c260 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69  for(i=nCell-1; i
2c270 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70  >=0; i--){.    p
2c280 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20  Cellptr -= 2;.  
2c290 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 61 53    cellbody -= aS
2c2a0 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 70 75 74 32  ize[i];.    put2
2c2b0 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 63  byte(pCellptr, c
2c2c0 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65  ellbody);.    me
2c2d0 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62  mcpy(&data[cellb
2c2e0 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c  ody], apCell[i],
2c2f0 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 7d 0a   aSize[i]);.  }.
2c300 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
2c310 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b  [hdr+3], nCell);
2c320 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
2c330 61 5b 68 64 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f  a[hdr+5], cellbo
2c340 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  dy);.  pPage->nF
2c350 72 65 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20  ree -= (nCell*2 
2c360 2b 20 6e 55 73 61 62 6c 65 20 2d 20 63 65 6c 6c  + nUsable - cell
2c370 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e  body);.  pPage->
2c380 6e 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65  nCell = (u16)nCe
2c390 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ll;.}../*.** The
2c3a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d   following param
2c3b0 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20  eters determine 
2c3c0 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e  how many adjacen
2c3d0 74 20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f  t pages get invo
2c3e0 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c  lved.** in a bal
2c3f0 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ancing operation
2c400 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d  .  NN is the num
2c410 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
2c420 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a   on either side.
2c430 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  ** of the page t
2c440 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65 20  hat participate 
2c450 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
2c460 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20   operation.  NB 
2c470 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20  is the.** total 
2c480 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2c490 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65  that participate
2c4a0 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
2c4b0 74 61 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a  target page and.
2c4c0 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20  ** NN neighbors 
2c4d0 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a  on either side..
2c4e0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75  **.** The minimu
2c4f0 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73  m value of NN is
2c500 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20   1 (of course). 
2c510 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61   Increasing NN a
2c520 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20  bove 1.** (to 2 
2c530 6f 72 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f  or 3) gives a mo
2c540 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74  dest improvement
2c550 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44   in SELECT and D
2c560 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63  ELETE performanc
2c570 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65  e.** in exchange
2c580 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65   for a larger de
2c590 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53  gradation in INS
2c5a0 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 70  ERT and UPDATE p
2c5b0 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54  erformance..** T
2c5c0 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61  he value of NN a
2c5d0 70 70 65 61 72 73 20 74 6f 20 67 69 76 65 20 74  ppears to give t
2c5e0 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 73 20  he best results 
2c5f0 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66  overall..*/.#def
2c600 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20  ine NN 1        
2c610 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2c620 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  f neighbors on e
2c630 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50  ither side of pP
2c640 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  age */.#define N
2c650 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20  B (NN*2+1)      
2c660 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69  /* Total pages i
2c670 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62  nvolved in the b
2c680 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e  alance */...#ifn
2c690 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2c6a0 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a  QUICKBALANCE./*.
2c6b0 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20  ** This version 
2c6c0 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e  of balance() han
2c6d0 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  dles the common 
2c6e0 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
2c6f0 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72  re.** a new entr
2c700 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72  y is being inser
2c710 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65  ted on the extre
2c720 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20  me right-end of 
2c730 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20  the.** tree, in 
2c740 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65  other words, whe
2c750 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  n the new entry 
2c760 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
2c770 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79  largest.** entry
2c780 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a   in the tree..**
2c790 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74  .** Instead of t
2c7a0 72 79 69 6e 67 20 74 6f 20 62 61 6c 61 6e 63 65  rying to balance
2c7b0 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73   the 3 right-mos
2c7c0 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75  t leaf pages, ju
2c7d0 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20  st add.** a new 
2c7e0 70 61 67 65 20 74 6f 20 74 68 65 20 72 69 67 68  page to the righ
2c7f0 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20  t-hand side and 
2c800 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20  put the one new 
2c810 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74  entry in.** that
2c820 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61   page.  This lea
2c830 76 65 73 20 74 68 65 20 72 69 67 68 74 20 73 69  ves the right si
2c840 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 20 73  de of the tree s
2c850 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c  omewhat.** unbal
2c860 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73  anced.  But odds
2c870 20 61 72 65 20 74 68 61 74 20 77 65 20 77 69 6c   are that we wil
2c880 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e  l be inserting n
2c890 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74  ew entries.** at
2c8a0 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66   the end soon af
2c8b0 74 65 72 77 61 72 64 73 20 73 6f 20 74 68 65 20  terwards so the 
2c8c0 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67  nearly empty pag
2c8d0 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a  e will quickly.*
2c8e0 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61  * fill up.  On a
2c8f0 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50  verage..**.** pP
2c900 61 67 65 20 69 73 20 74 68 65 20 6c 65 61 66 20  age is the leaf 
2c910 70 61 67 65 20 77 68 69 63 68 20 69 73 20 74 68  page which is th
2c920 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67  e right-most pag
2c930 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a  e in the tree..*
2c940 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69 74 73  * pParent is its
2c950 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20   parent.  pPage 
2c960 6d 75 73 74 20 68 61 76 65 20 61 20 73 69 6e 67  must have a sing
2c970 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72  le overflow entr
2c980 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c  y.** which is al
2c990 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  so the right-mos
2c9a0 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70  t entry on the p
2c9b0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  age..**.** The p
2c9c0 53 70 61 63 65 20 62 75 66 66 65 72 20 69 73 20  Space buffer is 
2c9d0 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20  used to store a 
2c9e0 74 65 6d 70 6f 72 61 72 79 20 63 6f 70 79 20 6f  temporary copy o
2c9f0 66 20 74 68 65 20 64 69 76 69 64 65 72 0a 2a 2a  f the divider.**
2ca00 20 63 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20   cell that will 
2ca10 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  be inserted into
2ca20 20 70 50 61 72 65 6e 74 2e 20 53 75 63 68 20 61   pParent. Such a
2ca30 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
2ca40 66 20 61 20 34 0a 2a 2a 20 62 79 74 65 20 70 61  f a 4.** byte pa
2ca50 67 65 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77  ge number follow
2ca60 65 64 20 62 79 20 61 20 76 61 72 69 61 62 6c 65  ed by a variable
2ca70 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2e   length integer.
2ca80 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72   In other.** wor
2ca90 64 73 2c 20 61 74 20 6d 6f 73 74 20 31 33 20 62  ds, at most 13 b
2caa0 79 74 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20  ytes. Hence the 
2cab0 70 53 70 61 63 65 20 62 75 66 66 65 72 20 6d 75  pSpace buffer mu
2cac0 73 74 20 62 65 20 61 74 0a 2a 2a 20 6c 65 61 73  st be at.** leas
2cad0 74 20 31 33 20 62 79 74 65 73 20 69 6e 20 73 69  t 13 bytes in si
2cae0 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
2caf0 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  t balance_quick(
2cb00 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
2cb10 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  , MemPage *pPage
2cb20 2c 20 75 38 20 2a 70 53 70 61 63 65 29 7b 0a 20  , u8 *pSpace){. 
2cb30 20 42 74 53 68 61 72 65 64 20 2a 63 6f 6e 73 74   BtShared *const
2cb40 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
2cb50 74 3b 20 20 20 20 2f 2a 20 42 2d 54 72 65 65 20  t;    /* B-Tree 
2cb60 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 4d 65  Database */.  Me
2cb70 6d 50 61 67 65 20 2a 70 4e 65 77 3b 20 20 20 20  mPage *pNew;    
2cb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb90 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f     /* Newly allo
2cba0 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20  cated page */.  
2cbb0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
2cbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cbd0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
2cbe0 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ode */.  Pgno pg
2cbf0 6e 6f 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  noNew;          
2cc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cc10 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
2cc20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65 72  pNew */..  asser
2cc30 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2cc40 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
2cc50 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2cc60 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2cc70 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2cc80 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20  arent->pDbPage) 
2cc90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2cca0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31  ge->nOverflow==1
2ccb0 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65   );..  if( pPage
2ccc0 2d 3e 6e 43 65 6c 6c 3c 3d 30 20 29 20 72 65 74  ->nCell<=0 ) ret
2ccd0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2cce0 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41  PT_BKPT;..  /* A
2ccf0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
2cd00 67 65 2e 20 54 68 69 73 20 70 61 67 65 20 77 69  ge. This page wi
2cd10 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 69  ll become the ri
2cd20 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a  ght-sibling of .
2cd30 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65    ** pPage. Make
2cd40 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2cd50 20 77 72 69 74 61 62 6c 65 2c 20 73 6f 20 74 68   writable, so th
2cd60 61 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64  at the new divid
2cd70 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79  er cell.  ** may
2cd80 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 49 66   be inserted. If
2cd90 20 62 6f 74 68 20 74 68 65 73 65 20 6f 70 65 72   both these oper
2cda0 61 74 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65  ations are succe
2cdb0 73 73 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a  ssful, proceed..
2cdc0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f    */.  rc = allo
2cdd0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
2cde0 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e  t, &pNew, &pgnoN
2cdf0 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66  ew, 0, 0);..  if
2ce00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ce10 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75 74  ){..    u8 *pOut
2ce20 20 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20   = &pSpace[4];. 
2ce30 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70     u8 *pCell = p
2ce40 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70  Page->aOvfl[0].p
2ce50 43 65 6c 6c 3b 0a 20 20 20 20 75 31 36 20 73 7a  Cell;.    u16 sz
2ce60 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Cell = cellSizeP
2ce70 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
2ce80 3b 0a 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b  ;.    u8 *pStop;
2ce90 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ..    assert( sq
2cea0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2ceb0 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50  eable(pNew->pDbP
2cec0 61 67 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65  age) );.    asse
2ced0 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
2cee0 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59  [0]==(PTF_INTKEY
2cef0 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54  |PTF_LEAFDATA|PT
2cf00 46 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20 20 7a  F_LEAF) );.    z
2cf10 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 50 54  eroPage(pNew, PT
2cf20 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
2cf30 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b  FDATA|PTF_LEAF);
2cf40 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67  .    assemblePag
2cf50 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c  e(pNew, 1, &pCel
2cf60 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20  l, &szCell);..  
2cf70 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
2cf80 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
2cf90 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20  atabase, update 
2cfa0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a  the pointer map.
2cfb0 20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72      ** with entr
2cfc0 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ies for the new 
2cfd0 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f  page, and any po
2cfe0 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a  inter from the .
2cff0 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74      ** cell on t
2d000 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76  he page to an ov
2d010 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
2d020 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a  either of these.
2d030 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e      ** operation
2d040 73 20 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74  s fails, the ret
2d050 75 72 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c  urn code is set,
2d060 20 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74   but the content
2d070 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  s.    ** of the 
2d080 70 61 72 65 6e 74 20 70 61 67 65 20 61 72 65 20  parent page are 
2d090 73 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65  still manipulate
2d0a0 64 20 62 79 20 74 68 68 20 63 6f 64 65 20 62 65  d by thh code be
2d0b0 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74  low..    ** That
2d0c0 20 69 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20   is Ok, at this 
2d0d0 70 6f 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74  point the parent
2d0e0 20 70 61 67 65 20 69 73 20 67 75 61 72 61 6e 74   page is guarant
2d0f0 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eed to.    ** be
2d100 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
2d110 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
2d120 72 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63  rror code will c
2d130 61 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f  ause a.    ** ro
2d140 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20  llback, undoing 
2d150 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65  any changes made
2d160 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70   to the parent p
2d170 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
2d180 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2d190 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
2d1a0 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77  Put(pBt, pgnoNew
2d1b0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
2d1c0 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26  pParent->pgno, &
2d1d0 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  rc);.      if( s
2d1e0 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c  zCell>pNew->minL
2d1f0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ocal ){.        
2d200 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
2d210 28 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72  (pNew, pCell, &r
2d220 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
2d230 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61  }.  .    /* Crea
2d240 74 65 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  te a divider cel
2d250 6c 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  l to insert into
2d260 20 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69   pParent. The di
2d270 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a  vider cell.    *
2d280 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  * consists of a 
2d290 34 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4-byte page numb
2d2a0 65 72 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d  er (the page num
2d2b0 62 65 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e  ber of pPage) an
2d2c0 64 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61  d.    ** a varia
2d2d0 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76  ble length key v
2d2e0 61 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73 74  alue (which must
2d2f0 20 62 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c   be the same val
2d300 75 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a  ue as the.    **
2d310 20 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20   largest key on 
2d320 70 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20  pPage)..    **. 
2d330 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68     ** To find th
2d340 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61  e largest key va
2d350 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69  lue on pPage, fi
2d360 72 73 74 20 66 69 6e 64 20 74 68 65 20 72 69 67  rst find the rig
2d370 68 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20  ht-most .    ** 
2d380 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54  cell on pPage. T
2d390 68 65 20 66 69 72 73 74 20 74 77 6f 20 66 69 65  he first two fie
2d3a0 6c 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c  lds of this cell
2d3b0 20 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a   are the .    **
2d3c0 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28   record-length (
2d3d0 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
2d3e0 68 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73  h integer at mos
2d3f0 74 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a  t 32-bits in siz
2d400 65 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  e).    ** and th
2d410 65 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76  e key value (a v
2d420 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69  ariable length i
2d430 6e 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65  nteger, may have
2d440 20 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20   any value)..   
2d450 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66   ** The first of
2d460 20 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20   the while(...) 
2d470 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70  loops below skip
2d480 73 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72  s over the recor
2d490 64 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20  d-length.    ** 
2d4a0 66 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e  field. The secon
2d4b0 64 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f  d while(...) loo
2d4c0 70 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79  p copies the key
2d4d0 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a   value from the.
2d4e0 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70      ** cell on p
2d4f0 50 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53  Page into the pS
2d500 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20  pace buffer..   
2d510 20 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20   */.    pCell = 
2d520 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2d530 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b  pPage->nCell-1);
2d540 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43  .    pStop = &pC
2d550 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c  ell[9];.    whil
2d560 65 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30  e( (*(pCell++)&0
2d570 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53  x80) && pCell<pS
2d580 74 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70  top );.    pStop
2d590 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20   = &pCell[9];.  
2d5a0 20 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75    while( ((*(pOu
2d5b0 74 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b  t++) = *(pCell++
2d5c0 29 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c  ))&0x80) && pCel
2d5d0 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20  l<pStop );..    
2d5e0 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
2d5f0 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  w divider cell i
2d600 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a  nto pParent. */.
2d610 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70      insertCell(p
2d620 50 61 72 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d  Parent, pParent-
2d630 3e 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20  >nCell, pSpace, 
2d640 28 69 6e 74 29 28 70 4f 75 74 2d 70 53 70 61 63  (int)(pOut-pSpac
2d650 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e),.            
2d660 20 20 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e     0, pPage->pgn
2d670 6f 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a  o, &rc);..    /*
2d680 20 53 65 74 20 74 68 65 20 72 69 67 68 74 2d 63   Set the right-c
2d690 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20  hild pointer of 
2d6a0 70 50 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74  pParent to point
2d6b0 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
2d6c0 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74  . */.    put4byt
2d6d0 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
2d6e0 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
2d6f0 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77  fset+8], pgnoNew
2d700 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c  );.  .    /* Rel
2d710 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e  ease the referen
2d720 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  ce to the new pa
2d730 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61  ge. */.    relea
2d740 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20  sePage(pNew);.  
2d750 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2d760 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2d770 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
2d780 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f  ANCE */..#if 0./
2d790 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2d7a0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  on does not cont
2d7b0 72 69 62 75 74 65 20 61 6e 79 74 68 69 6e 67 20  ribute anything 
2d7c0 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  to the operation
2d7d0 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69   of SQLite..** i
2d7e0 74 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 61  t is sometimes a
2d7f0 63 74 69 76 61 74 65 64 20 74 65 6d 70 6f 72 61  ctivated tempora
2d800 72 69 6c 79 20 77 68 69 6c 65 20 64 65 62 75 67  rily while debug
2d810 67 69 6e 67 20 63 6f 64 65 20 72 65 73 70 6f 6e  ging code respon
2d820 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65  sible .** for se
2d830 74 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61  tting pointer-ma
2d840 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  p entries..*/.st
2d850 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 43  atic int ptrmapC
2d860 68 65 63 6b 50 61 67 65 73 28 4d 65 6d 50 61 67  heckPages(MemPag
2d870 65 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74 20  e **apPage, int 
2d880 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c  nPage){.  int i,
2d890 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   j;.  for(i=0; i
2d8a0 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  <nPage; i++){.  
2d8b0 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38    Pgno n;.    u8
2d8c0 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   e;.    MemPage 
2d8d0 2a 70 50 61 67 65 20 3d 20 61 70 50 61 67 65 5b  *pPage = apPage[
2d8e0 69 5d 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64  i];.    BtShared
2d8f0 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
2d900 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
2d910 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2d920 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ..    for(j=0; j
2d930 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a  <pPage->nCell; j
2d940 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49  ++){.      CellI
2d950 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
2d960 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20  u8 *z;.     .   
2d970 20 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28     z = findCell(
2d980 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20  pPage, j);.     
2d990 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
2d9a0 74 72 28 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e  tr(pPage, z, &in
2d9b0 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  fo);.      if( i
2d9c0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
2d9d0 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6f 76  .        Pgno ov
2d9e0 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 7a  fl = get4byte(&z
2d9f0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
2da00 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
2da10 70 47 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20  pGet(pBt, ovfl, 
2da20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20  &e, &n);.       
2da30 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67   assert( n==pPag
2da40 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54  e->pgno && e==PT
2da50 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29  RMAP_OVERFLOW1 )
2da60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2da70 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2da80 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
2da90 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74   child = get4byt
2daa0 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 74  e(z);.        pt
2dab0 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69  rmapGet(pBt, chi
2dac0 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20  ld, &e, &n);.   
2dad0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d       assert( n==
2dae0 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65  pPage->pgno && e
2daf0 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29  ==PTRMAP_BTREE )
2db00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2db10 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2db20 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67  leaf ){.      Pg
2db30 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62  no child = get4b
2db40 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2db50 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2db60 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70 74  et+8]);.      pt
2db70 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69  rmapGet(pBt, chi
2db80 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20  ld, &e, &n);.   
2db90 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50     assert( n==pP
2dba0 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d  age->pgno && e==
2dbb0 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a  PTRMAP_BTREE );.
2dbc0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2dbd0 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
2dbe0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2dbf0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
2dc00 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
2dc10 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e   of the b-tree n
2dc20 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f  ode stored .** o
2dc30 6e 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20  n page pFrom to 
2dc40 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 61 67  page pTo. If pag
2dc50 65 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20  e pFrom was not 
2dc60 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  a leaf page, the
2dc70 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72  n.** the pointer
2dc80 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
2dc90 20 65 61 63 68 20 63 68 69 6c 64 20 70 61 67 65   each child page
2dca0 20 61 72 65 20 75 70 64 61 74 65 64 20 73 6f 20   are updated so 
2dcb0 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 72 65  that the.** pare
2dcc0 6e 74 20 70 61 67 65 20 73 74 6f 72 65 64 20 69  nt page stored i
2dcd0 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  n the pointer ma
2dce0 70 20 69 73 20 70 61 67 65 20 70 54 6f 2e 20 49  p is page pTo. I
2dcf0 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65  f pFrom containe
2dd00 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77  d.** any cells w
2dd10 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ith overflow pag
2dd20 65 20 70 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e  e pointers, then
2dd30 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
2dd40 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61  ng pointer.** ma
2dd50 70 20 65 6e 74 72 69 65 73 20 61 72 65 20 61 6c  p entries are al
2dd60 73 6f 20 75 70 64 61 74 65 64 20 73 6f 20 74 68  so updated so th
2dd70 61 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  at the parent pa
2dd80 67 65 20 69 73 20 70 61 67 65 20 70 54 6f 2e 0a  ge is page pTo..
2dd90 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69  **.** If pFrom i
2dda0 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 72  s currently carr
2ddb0 79 69 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f  ying any overflo
2ddc0 77 20 63 65 6c 6c 73 20 28 65 6e 74 72 69 65 73  w cells (entries
2ddd0 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61   in the.** MemPa
2dde0 67 65 2e 61 4f 76 66 6c 5b 5d 20 61 72 72 61 79  ge.aOvfl[] array
2ddf0 29 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  ), they are not 
2de00 63 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a  copied to pTo. .
2de10 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
2de20 75 72 6e 69 6e 67 2c 20 70 61 67 65 20 70 54 6f  urning, page pTo
2de30 20 69 73 20 72 65 69 6e 69 74 69 61 6c 69 7a 65   is reinitialize
2de40 64 20 75 73 69 6e 67 20 62 74 72 65 65 49 6e 69  d using btreeIni
2de50 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  tPage()..**.** T
2de60 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  he performance o
2de70 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
2de80 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e  is not critical.
2de90 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64   It is only used
2dea0 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61   by .** the bala
2deb0 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20  nce_shallower() 
2dec0 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  and balance_deep
2ded0 65 72 28 29 20 70 72 6f 63 65 64 75 72 65 73 2c  er() procedures,
2dee0 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77   neither of.** w
2def0 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64 20  hich are called 
2df00 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d  often under norm
2df10 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  al circumstances
2df20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2df30 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
2df40 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c  (MemPage *pFrom,
2df50 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20 69   MemPage *pTo, i
2df60 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
2df70 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
2df80 4b 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  K ){.    BtShare
2df90 64 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d 20  d * const pBt = 
2dfa0 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20 20  pFrom->pBt;.    
2dfb0 75 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d  u8 * const aFrom
2dfc0 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b   = pFrom->aData;
2dfd0 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  .    u8 * const 
2dfe0 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61  aTo = pTo->aData
2dff0 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20  ;.    int const 
2e000 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d  iFromHdr = pFrom
2e010 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  ->hdrOffset;.   
2e020 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64   int const iToHd
2e030 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d  r = ((pTo->pgno=
2e040 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a  =1) ? 100 : 0);.
2e050 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
2e060 69 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a 20 20  int iData;.  .  
2e070 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
2e080 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  om->isInit );.  
2e090 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
2e0a0 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29  >nFree>=iToHdr )
2e0b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  ;.    assert( ge
2e0c0 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46  t2byte(&aFrom[iF
2e0d0 72 6f 6d 48 64 72 2b 35 5d 29 3c 3d 70 42 74 2d  romHdr+5])<=pBt-
2e0e0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
2e0f0 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68   .    /* Copy th
2e100 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f  e b-tree node co
2e110 6e 74 65 6e 74 20 66 72 6f 6d 20 70 61 67 65 20  ntent from page 
2e120 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54  pFrom to page pT
2e130 6f 2e 20 2a 2f 0a 20 20 20 20 69 44 61 74 61 20  o. */.    iData 
2e140 3d 20 67 65 74 32 62 79 74 65 28 26 61 46 72 6f  = get2byte(&aFro
2e150 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a  m[iFromHdr+5]);.
2e160 20 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b      memcpy(&aTo[
2e170 69 44 61 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69  iData], &aFrom[i
2e180 44 61 74 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62  Data], pBt->usab
2e190 6c 65 53 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20  leSize-iData);. 
2e1a0 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69     memcpy(&aTo[i
2e1b0 54 6f 48 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69  ToHdr], &aFrom[i
2e1c0 46 72 6f 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d  FromHdr], pFrom-
2e1d0 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
2e1e0 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pFrom->nCell);. 
2e1f0 20 0a 20 20 20 20 2f 2a 20 52 65 69 6e 69 74 69   .    /* Reiniti
2e200 61 6c 69 7a 65 20 70 61 67 65 20 70 54 6f 20 73  alize page pTo s
2e210 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  o that the conte
2e220 6e 74 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  nts of the MemPa
2e230 67 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 20  ge structure.   
2e240 20 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 65   ** match the ne
2e250 77 20 64 61 74 61 2e 20 54 68 65 20 69 6e 69 74  w data. The init
2e260 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54  ialization of pT
2e270 6f 20 63 61 6e 20 61 63 74 75 61 6c 6c 79 20 66  o can actually f
2e280 61 69 6c 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a  ail under.    **
2e290 20 66 61 69 72 6c 79 20 6f 62 73 63 75 72 65 20   fairly obscure 
2e2a0 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 65  circumstances, e
2e2b0 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73  ven though it is
2e2c0 20 61 20 63 6f 70 79 20 6f 66 20 69 6e 69 74 69   a copy of initi
2e2d0 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 70  alized .    ** p
2e2e0 61 67 65 20 70 46 72 6f 6d 2e 0a 20 20 20 20 2a  age pFrom..    *
2e2f0 2f 0a 20 20 20 20 70 54 6f 2d 3e 69 73 49 6e 69  /.    pTo->isIni
2e300 74 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  t = 0;.    rc = 
2e310 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 54  btreeInitPage(pT
2e320 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  o);.    if( rc!=
2e330 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e340 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
2e350 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
2e360 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
2e370 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  his is an auto-v
2e380 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20  acuum database, 
2e390 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  update the point
2e3a0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 0a 20  er-map entries. 
2e3b0 20 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d     ** for any b-
2e3c0 74 72 65 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77  tree or overflow
2e3d0 20 70 61 67 65 73 20 74 68 61 74 20 70 54 6f 20   pages that pTo 
2e3e0 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  now contains the
2e3f0 20 70 6f 69 6e 74 65 72 73 20 74 6f 2e 0a 20 20   pointers to..  
2e400 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41    */.    if( ISA
2e410 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
2e420 20 20 20 2a 70 52 43 20 3d 20 73 65 74 43 68 69     *pRC = setChi
2e430 6c 64 50 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a  ldPtrmaps(pTo);.
2e440 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
2e450 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2e460 72 65 64 69 73 74 72 69 62 75 74 65 73 20 63 65  redistributes ce
2e470 6c 6c 73 20 6f 6e 20 74 68 65 20 69 50 61 72 65  lls on the iPare
2e480 6e 74 49 64 78 27 74 68 20 63 68 69 6c 64 20 6f  ntIdx'th child o
2e490 66 20 70 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65  f pParent.** (he
2e4a0 72 65 61 66 74 65 72 20 22 74 68 65 20 70 61 67  reafter "the pag
2e4b0 65 22 29 20 61 6e 64 20 75 70 20 74 6f 20 32 20  e") and up to 2 
2e4c0 73 69 62 6c 69 6e 67 73 20 73 6f 20 74 68 61 74  siblings so that
2e4d0 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20   all pages have 
2e4e0 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d  about the.** sam
2e4f0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65  e amount of free
2e500 20 73 70 61 63 65 2e 20 55 73 75 61 6c 6c 79 20   space. Usually 
2e510 61 20 73 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67  a single sibling
2e520 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
2e530 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 61  of the.** page a
2e540 72 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 62  re used in the b
2e550 61 6c 61 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68  alancing, though
2e560 20 62 6f 74 68 20 73 69 62 6c 69 6e 67 73 20 6d   both siblings m
2e570 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f  ight come from o
2e580 6e 65 0a 2a 2a 20 73 69 64 65 20 69 66 20 74 68  ne.** side if th
2e590 65 20 70 61 67 65 20 69 73 20 74 68 65 20 66 69  e page is the fi
2e5a0 72 73 74 20 6f 72 20 6c 61 73 74 20 63 68 69 6c  rst or last chil
2e5b0 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e  d of its parent.
2e5c0 20 49 66 20 74 68 65 20 70 61 67 65 20 0a 2a 2a   If the page .**
2e5d0 20 68 61 73 20 66 65 77 65 72 20 74 68 61 6e 20   has fewer than 
2e5e0 32 20 73 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65  2 siblings (some
2e5f0 74 68 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20  thing which can 
2e600 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74  only happen if t
2e610 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 20  he page.** is a 
2e620 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20 63  root page or a c
2e630 68 69 6c 64 20 6f 66 20 61 20 72 6f 6f 74 20 70  hild of a root p
2e640 61 67 65 29 20 74 68 65 6e 20 61 6c 6c 20 61 76  age) then all av
2e650 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73  ailable siblings
2e660 0a 2a 2a 20 70 61 72 74 69 63 69 70 61 74 65 20  .** participate 
2e670 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
2e680 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ..**.** The numb
2e690 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f  er of siblings o
2e6a0 66 20 74 68 65 20 70 61 67 65 20 6d 69 67 68 74  f the page might
2e6b0 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72   be increased or
2e6c0 20 64 65 63 72 65 61 73 65 64 20 62 79 20 0a 2a   decreased by .*
2e6d0 2a 20 6f 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20  * one or two in 
2e6e0 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65  an effort to kee
2e6f0 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66  p pages nearly f
2e700 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72  ull but not over
2e710 20 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f   full. .**.** No
2e720 74 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69  te that when thi
2e730 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2e740 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65  led, some of the
2e750 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
2e760 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20  ge.** might not 
2e770 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72  actually be stor
2e780 65 64 20 69 6e 20 4d 65 6d 50 61 67 65 2e 61 44  ed in MemPage.aD
2e790 61 74 61 5b 5d 2e 20 54 68 69 73 20 63 61 6e 20  ata[]. This can 
2e7a0 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65  happen.** if the
2e7b0 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c   page is overful
2e7c0 6c 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  l. This routine 
2e7d0 65 6e 73 75 72 65 73 20 74 68 61 74 20 61 6c 6c  ensures that all
2e7e0 20 63 65 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64   cells allocated
2e7f0 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
2e800 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73  and its siblings
2e810 20 66 69 74 20 69 6e 74 6f 20 4d 65 6d 50 61 67   fit into MemPag
2e820 65 2e 61 44 61 74 61 5b 5d 20 62 65 66 6f 72 65  e.aData[] before
2e830 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
2e840 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73 65 20  * In the course 
2e850 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65  of balancing the
2e860 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 73 69   page and its si
2e870 62 6c 69 6e 67 73 2c 20 63 65 6c 6c 73 20 6d 61  blings, cells ma
2e880 79 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64  y be.** inserted
2e890 20 69 6e 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64   into or removed
2e8a0 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74   from the parent
2e8b0 20 70 61 67 65 20 28 70 50 61 72 65 6e 74 29 2e   page (pParent).
2e8c0 20 44 6f 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79   Doing so.** may
2e8d0 20 63 61 75 73 65 20 74 68 65 20 70 61 72 65 6e   cause the paren
2e8e0 74 20 70 61 67 65 20 74 6f 20 62 65 63 6f 6d 65  t page to become
2e8f0 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64   overfull or und
2e900 65 72 66 75 6c 6c 2e 20 49 66 20 74 68 69 73 0a  erfull. If this.
2e910 2a 2a 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69  ** happens, it i
2e920 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
2e930 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
2e940 65 72 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  er to invoke the
2e950 20 63 6f 72 72 65 63 74 0a 2a 2a 20 62 61 6c 61   correct.** bala
2e960 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f  ncing routine to
2e970 20 66 69 78 20 74 68 69 73 20 70 72 6f 62 6c 65   fix this proble
2e980 6d 20 28 73 65 65 20 74 68 65 20 62 61 6c 61 6e  m (see the balan
2e990 63 65 28 29 20 72 6f 75 74 69 6e 65 29 2e 20 0a  ce() routine). .
2e9a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  **.** If this ro
2e9b0 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20  utine fails for 
2e9c0 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d  any reason, it m
2e9d0 69 67 68 74 20 6c 65 61 76 65 20 74 68 65 20 64  ight leave the d
2e9e0 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20  atabase.** in a 
2e9f0 63 6f 72 72 75 70 74 65 64 20 73 74 61 74 65 2e  corrupted state.
2ea00 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
2ea10 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64  ine fails, the d
2ea20 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a  atabase should.*
2ea30 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  * be rolled back
2ea40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72  ..**.** The thir
2ea50 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
2ea60 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 4f 76  is function, aOv
2ea70 66 6c 53 70 61 63 65 2c 20 69 73 20 61 20 70 6f  flSpace, is a po
2ea80 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a 20 62 75  inter to a.** bu
2ea90 66 66 65 72 20 62 69 67 20 65 6e 6f 75 67 68 20  ffer big enough 
2eaa0 74 6f 20 68 6f 6c 64 20 6f 6e 65 20 70 61 67 65  to hold one page
2eab0 2e 20 49 66 20 77 68 69 6c 65 20 69 6e 73 65 72  . If while inser
2eac0 74 69 6e 67 20 63 65 6c 6c 73 20 69 6e 74 6f 20  ting cells into 
2ead0 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20 70 61  the parent.** pa
2eae0 67 65 20 28 70 50 61 72 65 6e 74 29 20 74 68 65  ge (pParent) the
2eaf0 20 70 61 72 65 6e 74 20 70 61 67 65 20 62 65 63   parent page bec
2eb00 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74  omes overfull, t
2eb10 68 69 73 20 62 75 66 66 65 72 20 69 73 0a 2a 2a  his buffer is.**
2eb20 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
2eb30 68 65 20 70 61 72 65 6e 74 27 73 20 6f 76 65 72  he parent's over
2eb40 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 42 65 63 61  flow cells. Beca
2eb50 75 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  use this functio
2eb60 6e 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61 20 6d  n inserts.** a m
2eb70 61 78 69 6d 75 6d 20 6f 66 20 66 6f 75 72 20 64  aximum of four d
2eb80 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74  ivider cells int
2eb90 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
2eba0 65 2c 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d  e, and the maxim
2ebb0 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 61 20  um.** size of a 
2ebc0 63 65 6c 6c 20 73 74 6f 72 65 64 20 77 69 74 68  cell stored with
2ebd0 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e  in an internal n
2ebe0 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 6c 65  ode is always le
2ebf0 73 73 20 74 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f  ss than 1/4.** o
2ec00 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c  f the page-size,
2ec10 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b   the aOvflSpace[
2ec20 5d 20 62 75 66 66 65 72 20 69 73 20 67 75 61 72  ] buffer is guar
2ec30 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 61 72  anteed to be lar
2ec40 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 66 6f 72  ge.** enough for
2ec50 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 63 65   all overflow ce
2ec60 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f  lls..**.** If aO
2ec70 76 66 6c 53 70 61 63 65 20 69 73 20 73 65 74 20  vflSpace is set 
2ec80 74 6f 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  to a null pointe
2ec90 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  r, this function
2eca0 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c   returns .** SQL
2ecb0 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74  ITE_NOMEM..*/.st
2ecc0 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
2ecd0 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d 50  _nonroot(.  MemP
2ece0 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20  age *pParent,   
2ecf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2ed00 61 72 65 6e 74 20 70 61 67 65 20 6f 66 20 73 69  arent page of si
2ed10 62 6c 69 6e 67 73 20 62 65 69 6e 67 20 62 61 6c  blings being bal
2ed20 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  anced */.  int i
2ed30 50 61 72 65 6e 74 49 64 78 2c 20 20 20 20 20 20  ParentIdx,      
2ed40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2ed50 64 65 78 20 6f 66 20 22 74 68 65 20 70 61 67 65  dex of "the page
2ed60 22 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a  " in pParent */.
2ed70 20 20 75 38 20 2a 61 4f 76 66 6c 53 70 61 63 65    u8 *aOvflSpace
2ed80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ed90 20 20 2f 2a 20 70 61 67 65 2d 73 69 7a 65 20 62    /* page-size b
2eda0 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
2edb0 72 20 70 61 72 65 6e 74 20 6f 76 66 6c 20 2a 2f  r parent ovfl */
2edc0 0a 20 20 69 6e 74 20 69 73 52 6f 6f 74 20 20 20  .  int isRoot   
2edd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ede0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50     /* True if pP
2edf0 61 72 65 6e 74 20 69 73 20 61 20 72 6f 6f 74 2d  arent is a root-
2ee00 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  page */.){.  BtS
2ee10 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
2ee20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2ee30 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20   whole database 
2ee40 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d  */.  int nCell =
2ee50 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2ee60 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
2ee70 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
2ee80 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65   */.  int nMaxCe
2ee90 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  lls = 0;        
2eea0 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
2eeb0 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20  size of apCell, 
2eec0 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a  szCell, aFrom. *
2eed0 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30  /.  int nNew = 0
2eee0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2eef0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2ef00 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a  ges in apNew[] *
2ef10 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20  /.  int nOld;   
2ef20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef30 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2ef40 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a  ges in apOld[] *
2ef50 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b  /.  int i, j, k;
2ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef70 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
2ef80 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76  s */.  int nxDiv
2ef90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2efa0 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69      /* Next divi
2efb0 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72  der slot in pPar
2efc0 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a  ent->aCell[] */.
2efd0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2efe0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f  E_OK;          /
2eff0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64  * The return cod
2f000 65 20 2a 2f 0a 20 20 75 31 36 20 6c 65 61 66 43  e */.  u16 leafC
2f010 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20  orrection;      
2f020 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67      /* 4 if pPag
2f030 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20  e is a leaf.  0 
2f040 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20  if not */.  int 
2f050 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20 20 20  leafData;       
2f060 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2f070 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
2f080 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54  eaf of a LEAFDAT
2f090 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  A tree */.  int 
2f0a0 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20  usableSpace;    
2f0b0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
2f0c0 73 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e  s in pPage beyon
2f0d0 64 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  d the header */.
2f0e0 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b    int pageFlags;
2f0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f100 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65  * Value of pPage
2f110 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20  ->aData[0] */.  
2f120 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20  int subtotal;   
2f130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f140 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65  Subtotal of byte
2f150 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e  s in cells on on
2f160 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  e page */.  int 
2f170 69 53 70 61 63 65 31 20 3d 20 30 3b 20 20 20 20  iSpace1 = 0;    
2f180 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2f190 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66  t unused byte of
2f1a0 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20   aSpace1[] */.  
2f1b0 69 6e 74 20 69 4f 76 66 6c 53 70 61 63 65 20 3d  int iOvflSpace =
2f1c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
2f1d0 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74  First unused byt
2f1e0 65 20 6f 66 20 61 4f 76 66 6c 53 70 61 63 65 5b  e of aOvflSpace[
2f1f0 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72  ] */.  int szScr
2f200 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20  atch;           
2f210 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73      /* Size of s
2f220 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72 65  cratch memory re
2f230 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d  quested */.  Mem
2f240 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b  Page *apOld[NB];
2f250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61            /* pPa
2f260 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f  ge and up to two
2f270 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d   siblings */.  M
2f280 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e  emPage *apCopy[N
2f290 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50  B];         /* P
2f2a0 72 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66  rivate copies of
2f2b0 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a   apOld[] pages *
2f2c0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e  /.  MemPage *apN
2f2d0 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
2f2e0 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70   /* pPage and up
2f2f0 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20   to NB siblings 
2f300 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20  after balancing 
2f310 2a 2f 0a 20 20 75 38 20 2a 70 52 69 67 68 74 3b  */.  u8 *pRight;
2f320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f330 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 69 6e    /* Location in
2f340 20 70 61 72 65 6e 74 20 6f 66 20 72 69 67 68 74   parent of right
2f350 2d 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74 65 72  -sibling pointer
2f360 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b   */.  u8 *apDiv[
2f370 4e 42 2d 31 5d 3b 20 20 20 20 20 20 20 20 20 20  NB-1];          
2f380 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65     /* Divider ce
2f390 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a  lls in pParent *
2f3a0 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e  /.  int cntNew[N
2f3b0 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  B+2];           
2f3c0 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65   /* Index in aCe
2f3d0 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74  ll[] of cell aft
2f3e0 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a  er i-th page */.
2f3f0 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32    int szNew[NB+2
2f400 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
2f410 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20  * Combined size 
2f420 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f  of cells place o
2f430 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20  n i-th page */. 
2f440 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30   u8 **apCell = 0
2f450 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2f460 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e   All cells begin
2f470 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75   balanced */.  u
2f480 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20  16 *szCell;     
2f490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2f4a0 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c  ocal size of all
2f4b0 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
2f4c0 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61  [] */.  u8 *aSpa
2f4d0 63 65 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  ce1;            
2f4e0 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
2f4f0 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76 69  r copies of divi
2f500 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 20 20  ders cells */.  
2f510 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20  Pgno pgno;      
2f520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f530 54 65 6d 70 20 76 61 72 20 74 6f 20 73 74 6f 72  Temp var to stor
2f540 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20  e a page number 
2f550 69 6e 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70  in */..  pBt = p
2f560 50 61 72 65 6e 74 2d 3e 70 42 74 3b 0a 20 20 61  Parent->pBt;.  a
2f570 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2f580 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
2f590 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2f5a0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2f5b0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65  swriteable(pPare
2f5c0 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  nt->pDbPage) );.
2f5d0 0a 23 69 66 20 30 0a 20 20 54 52 41 43 45 28 28  .#if 0.  TRACE((
2f5e0 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20  "BALANCE: begin 
2f5f0 70 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66  page %d child of
2f600 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
2f610 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67  gno, pParent->pg
2f620 6e 6f 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  no));.#endif..  
2f630 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
2f640 20 70 50 61 72 65 6e 74 20 6d 61 79 20 68 61 76   pParent may hav
2f650 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 6f 76  e at most one ov
2f660 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e 64  erflow cell. And
2f670 20 69 66 0a 20 20 2a 2a 20 74 68 69 73 20 6f 76   if.  ** this ov
2f680 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20 70  erflow cell is p
2f690 72 65 73 65 6e 74 2c 20 69 74 20 6d 75 73 74 20  resent, it must 
2f6a0 62 65 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68  be the cell with
2f6b0 20 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 50 61   .  ** index iPa
2f6c0 72 65 6e 74 49 64 78 2e 20 54 68 69 73 20 73 63  rentIdx. This sc
2f6d0 65 6e 61 72 69 6f 20 63 6f 6d 65 73 20 61 62 6f  enario comes abo
2f6e0 75 74 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ut when this fun
2f6f0 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 63 61  ction.  ** is ca
2f700 6c 6c 65 64 20 28 69 6e 64 69 72 65 63 74 6c 79  lled (indirectly
2f710 29 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74  ) from sqlite3Bt
2f720 72 65 65 44 65 6c 65 74 65 28 29 2e 0a 20 20 2a  reeDelete()..  *
2f730 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  /.  assert( pPar
2f740 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  ent->nOverflow==
2f750 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 6e 4f  0 || pParent->nO
2f760 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20  verflow==1 );.  
2f770 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
2f780 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c  >nOverflow==0 ||
2f790 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b   pParent->aOvfl[
2f7a0 30 5d 2e 69 64 78 3d 3d 69 50 61 72 65 6e 74 49  0].idx==iParentI
2f7b0 64 78 20 29 3b 0a 0a 20 20 69 66 28 20 21 61 4f  dx );..  if( !aO
2f7c0 76 66 6c 53 70 61 63 65 20 29 7b 0a 20 20 20 20  vflSpace ){.    
2f7d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2f7e0 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  MEM;.  }..  /* F
2f7f0 69 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 20  ind the sibling 
2f800 70 61 67 65 73 20 74 6f 20 62 61 6c 61 6e 63 65  pages to balance
2f810 2e 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20 74 68  . Also locate th
2f820 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  e cells in pPare
2f830 6e 74 20 0a 20 20 2a 2a 20 74 68 61 74 20 64 69  nt .  ** that di
2f840 76 69 64 65 20 74 68 65 20 73 69 62 6c 69 6e 67  vide the sibling
2f850 73 2e 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73  s. An attempt is
2f860 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e   made to find NN
2f870 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a 20 20   siblings on .  
2f880 2a 2a 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  ** either side o
2f890 66 20 70 50 61 67 65 2e 20 4d 6f 72 65 20 73 69  f pPage. More si
2f8a0 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e  blings are taken
2f8b0 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20   from one side, 
2f8c0 68 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a 20 69  however, .  ** i
2f8d0 66 20 74 68 65 72 65 20 61 72 65 20 66 65 77 65  f there are fewe
2f8e0 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e  r than NN siblin
2f8f0 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20  gs on the other 
2f900 73 69 64 65 2e 20 49 66 20 70 50 61 72 65 6e 74  side. If pParent
2f910 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20  .  ** has NB or 
2f920 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74  fewer children t
2f930 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  hen all children
2f940 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65 20   of pParent are 
2f950 74 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20  taken.  .  **.  
2f960 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73  ** This loop als
2f970 6f 20 64 72 6f 70 73 20 74 68 65 20 64 69 76 69  o drops the divi
2f980 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74  der cells from t
2f990 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20  he parent page. 
2f9a0 54 68 69 73 0a 20 20 2a 2a 20 77 61 79 2c 20 74  This.  ** way, t
2f9b0 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
2f9c0 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  the function doe
2f9d0 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 64 65  s not have to de
2f9e0 61 6c 20 77 69 74 68 20 61 6e 79 0a 20 20 2a 2a  al with any.  **
2f9f0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20   overflow cells 
2fa00 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  in the parent pa
2fa10 67 65 2c 20 73 69 6e 63 65 20 69 66 20 61 6e 79  ge, since if any
2fa20 20 65 78 69 73 74 65 64 20 74 68 65 79 20 77 69   existed they wi
2fa30 6c 6c 0a 20 20 2a 2a 20 68 61 76 65 20 61 6c 72  ll.  ** have alr
2fa40 65 61 64 79 20 62 65 65 6e 20 72 65 6d 6f 76 65  eady been remove
2fa50 64 2e 0a 20 20 2a 2f 0a 20 20 69 20 3d 20 70 50  d..  */.  i = pP
2fa60 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
2fa70 20 2b 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c   + pParent->nCel
2fa80 6c 3b 0a 20 20 69 66 28 20 69 3c 32 20 29 7b 0a  l;.  if( i<2 ){.
2fa90 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20      nxDiv = 0;. 
2faa0 20 20 20 6e 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20     nOld = i+1;. 
2fab0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 6c 64   }else{.    nOld
2fac0 20 3d 20 33 3b 0a 20 20 20 20 69 66 28 20 69 50   = 3;.    if( iP
2fad0 61 72 65 6e 74 49 64 78 3d 3d 30 20 29 7b 20 20  arentIdx==0 ){  
2fae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
2faf0 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b        nxDiv = 0;
2fb00 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69  .    }else if( i
2fb10 50 61 72 65 6e 74 49 64 78 3d 3d 69 20 29 7b 0a  ParentIdx==i ){.
2fb20 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69 2d        nxDiv = i-
2fb30 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  2;.    }else{.  
2fb40 20 20 20 20 6e 78 44 69 76 20 3d 20 69 50 61 72      nxDiv = iPar
2fb50 65 6e 74 49 64 78 2d 31 3b 0a 20 20 20 20 7d 0a  entIdx-1;.    }.
2fb60 20 20 20 20 69 20 3d 20 32 3b 0a 20 20 7d 0a 20      i = 2;.  }. 
2fb70 20 69 66 28 20 28 69 2b 6e 78 44 69 76 2d 70 50   if( (i+nxDiv-pP
2fb80 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
2fb90 29 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  )==pParent->nCel
2fba0 6c 20 29 7b 0a 20 20 20 20 70 52 69 67 68 74 20  l ){.    pRight 
2fbb0 3d 20 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  = &pParent->aDat
2fbc0 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
2fbd0 66 73 65 74 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65  fset+8];.  }else
2fbe0 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 66  {.    pRight = f
2fbf0 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
2fc00 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74   i+nxDiv-pParent
2fc10 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->nOverflow);.  
2fc20 7d 0a 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62  }.  pgno = get4b
2fc30 79 74 65 28 70 52 69 67 68 74 29 3b 0a 20 20 77  yte(pRight);.  w
2fc40 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 72  hile( 1 ){.    r
2fc50 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
2fc60 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 61  ge(pBt, pgno, &a
2fc70 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66  pOld[i]);.    if
2fc80 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 6d 65  ( rc ){.      me
2fc90 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28  mset(apOld, 0, (
2fca0 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50  i+1)*sizeof(MemP
2fcb0 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 67 6f  age*));.      go
2fcc0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2fcd0 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d  up;.    }.    nM
2fce0 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f  axCells += 1+apO
2fcf0 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f  ld[i]->nCell+apO
2fd00 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77  ld[i]->nOverflow
2fd10 3b 0a 20 20 20 20 69 66 28 20 28 69 2d 2d 29 3d  ;.    if( (i--)=
2fd20 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  =0 ) break;..   
2fd30 20 69 66 28 20 69 2b 6e 78 44 69 76 3d 3d 70 50   if( i+nxDiv==pP
2fd40 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e  arent->aOvfl[0].
2fd50 69 64 78 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  idx && pParent->
2fd60 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  nOverflow ){.   
2fd70 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 70 50     apDiv[i] = pP
2fd80 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e  arent->aOvfl[0].
2fd90 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 70 67 6e  pCell;.      pgn
2fda0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44  o = get4byte(apD
2fdb0 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a  iv[i]);.      sz
2fdc0 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a  New[i] = cellSiz
2fdd0 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70  ePtr(pParent, ap
2fde0 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70  Div[i]);.      p
2fdf0 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
2fe00 77 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  w = 0;.    }else
2fe10 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d  {.      apDiv[i]
2fe20 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72   = findCell(pPar
2fe30 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61  ent, i+nxDiv-pPa
2fe40 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29  rent->nOverflow)
2fe50 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67  ;.      pgno = g
2fe60 65 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d  et4byte(apDiv[i]
2fe70 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69  );.      szNew[i
2fe80 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  ] = cellSizePtr(
2fe90 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69  pParent, apDiv[i
2fea0 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 72  ]);..      /* Dr
2feb0 6f 70 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  op the cell from
2fec0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2fed0 2e 20 61 70 44 69 76 5b 69 5d 20 73 74 69 6c 6c  . apDiv[i] still
2fee0 20 70 6f 69 6e 74 73 20 74 6f 0a 20 20 20 20 20   points to.     
2fef0 20 2a 2a 20 74 68 65 20 63 65 6c 6c 20 77 69 74   ** the cell wit
2ff00 68 69 6e 20 74 68 65 20 70 61 72 65 6e 74 2c 20  hin the parent, 
2ff10 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 68  even though it h
2ff20 61 73 20 62 65 65 6e 20 64 72 6f 70 70 65 64 2e  as been dropped.
2ff30 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69  .      ** This i
2ff40 73 20 73 61 66 65 20 62 65 63 61 75 73 65 20 64  s safe because d
2ff50 72 6f 70 70 69 6e 67 20 61 20 63 65 6c 6c 20 6f  ropping a cell o
2ff60 6e 6c 79 20 6f 76 65 72 77 72 69 74 65 73 20 74  nly overwrites t
2ff70 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a  he first.      *
2ff80 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20  * four bytes of 
2ff90 69 74 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e  it, and this fun
2ffa0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e  ction does not n
2ffb0 65 65 64 20 74 68 65 20 66 69 72 73 74 0a 20 20  eed the first.  
2ffc0 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65      ** four byte
2ffd0 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  s of the divider
2ffe0 20 63 65 6c 6c 2e 20 53 6f 20 74 68 65 20 70 6f   cell. So the po
2fff0 69 6e 74 65 72 20 69 73 20 73 61 66 65 20 74 6f  inter is safe to
30000 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61   use.      ** la
30010 74 65 72 20 6f 6e 2e 20 20 0a 20 20 20 20 20 20  ter on.  .      
30020 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65  **.      ** Unle
30030 73 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d  ss SQLite is com
30040 70 69 6c 65 64 20 69 6e 20 73 65 63 75 72 65 2d  piled in secure-
30050 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49 6e 20  delete mode. In 
30060 74 68 69 73 20 63 61 73 65 2c 0a 20 20 20 20 20  this case,.     
30070 20 2a 2a 20 74 68 65 20 64 72 6f 70 43 65 6c 6c   ** the dropCell
30080 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  () routine will 
30090 6f 76 65 72 77 72 69 74 65 20 74 68 65 20 65 6e  overwrite the en
300a0 74 69 72 65 20 63 65 6c 6c 20 77 69 74 68 20 7a  tire cell with z
300b0 65 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20  eroes..      ** 
300c0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 65  In this case, te
300d0 6d 70 6f 72 61 72 69 6c 79 20 63 6f 70 79 20 74  mporarily copy t
300e0 68 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65  he cell into the
300f0 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a 20 20   aOvflSpace[].  
30100 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 49      ** buffer. I
30110 74 20 77 69 6c 6c 20 62 65 20 63 6f 70 69 65 64  t will be copied
30120 20 6f 75 74 20 61 67 61 69 6e 20 61 73 20 73 6f   out again as so
30130 6f 6e 20 61 73 20 74 68 65 20 61 53 70 61 63 65  on as the aSpace
30140 5b 5d 20 62 75 66 66 65 72 0a 20 20 20 20 20 20  [] buffer.      
30150 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e  ** is allocated.
30160 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
30170 42 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65  Bt->secureDelete
30180 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
30190 69 4f 66 66 20 3d 20 53 51 4c 49 54 45 5f 50 54  iOff = SQLITE_PT
301a0 52 5f 54 4f 5f 49 4e 54 28 61 70 44 69 76 5b 69  R_TO_INT(apDiv[i
301b0 5d 29 20 2d 20 53 51 4c 49 54 45 5f 50 54 52 5f  ]) - SQLITE_PTR_
301c0 54 4f 5f 49 4e 54 28 70 50 61 72 65 6e 74 2d 3e  TO_INT(pParent->
301d0 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  aData);.        
301e0 69 66 28 20 28 69 4f 66 66 2b 73 7a 4e 65 77 5b  if( (iOff+szNew[
301f0 69 5d 29 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  i])>pBt->usableS
30200 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
30210 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
30220 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
30230 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c       memset(apOl
30240 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65  d, 0, (i+1)*size
30250 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20  of(MemPage*));. 
30260 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
30270 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
30280 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
30290 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
302a0 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 66 66 5d  aOvflSpace[iOff]
302b0 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 4e 65  , apDiv[i], szNe
302c0 77 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  w[i]);.         
302d0 20 61 70 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76   apDiv[i] = &aOv
302e0 66 6c 53 70 61 63 65 5b 61 70 44 69 76 5b 69 5d  flSpace[apDiv[i]
302f0 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d  -pParent->aData]
30300 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30310 20 20 7d 0a 20 20 20 20 20 20 64 72 6f 70 43 65    }.      dropCe
30320 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78  ll(pParent, i+nx
30330 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  Div-pParent->nOv
30340 65 72 66 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d  erflow, szNew[i]
30350 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
30360 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61  }..  /* Make nMa
30370 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c  xCells a multipl
30380 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20  e of 4 in order 
30390 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62 79  to preserve 8-by
303a0 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e  te.  ** alignmen
303b0 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73  t */.  nMaxCells
303c0 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20   = (nMaxCells + 
303d0 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  3)&~3;..  /*.  *
303e0 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
303f0 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75   for memory stru
30400 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20  ctures.  */.  k 
30410 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
30420 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  + ROUND8(sizeof(
30430 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 73 7a 53  MemPage));.  szS
30440 63 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20 20  cratch =.       
30450 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66  nMaxCells*sizeof
30460 28 75 38 2a 29 20 20 20 20 20 20 20 20 20 20 20  (u8*)           
30470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
30480 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20  pCell */.     + 
30490 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66  nMaxCells*sizeof
304a0 28 75 31 36 29 20 20 20 20 20 20 20 20 20 20 20  (u16)           
304b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
304c0 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20  zCell */.     + 
304d0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 20 20  pBt->pageSize   
304e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
304f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
30500 53 70 61 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b  Space1 */.     +
30510 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20   k*nOld;        
30520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30540 50 61 67 65 20 63 6f 70 69 65 73 20 28 61 70 43  Page copies (apC
30550 6f 70 79 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c  opy) */.  apCell
30560 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74 63   = sqlite3Scratc
30570 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74  hMalloc( szScrat
30580 63 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70 43  ch ); .  if( apC
30590 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ell==0 ){.    rc
305a0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
305b0 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63  .    goto balanc
305c0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  e_cleanup;.  }. 
305d0 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29   szCell = (u16*)
305e0 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c  &apCell[nMaxCell
305f0 73 5d 3b 0a 20 20 61 53 70 61 63 65 31 20 3d 20  s];.  aSpace1 = 
30600 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61  (u8*)&szCell[nMa
30610 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72  xCells];.  asser
30620 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
30630 49 47 4e 4d 45 4e 54 28 61 53 70 61 63 65 31 29  IGNMENT(aSpace1)
30640 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c   );..  /*.  ** L
30650 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  oad pointers to 
30660 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62  all cells on sib
30670 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74  ling pages and t
30680 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
30690 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c  .  ** into the l
306a0 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72  ocal apCell[] ar
306b0 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65  ray.  Make copie
306c0 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  s of the divider
306d0 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f   cells.  ** into
306e0 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
306f0 66 72 6f 6d 20 61 53 70 61 63 65 31 5b 5d 20 61  from aSpace1[] a
30700 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68  nd remove the th
30710 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a  e divider Cells.
30720 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e    ** from pParen
30730 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  t..  **.  ** If 
30740 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
30750 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20   on leaf pages, 
30760 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70  then the child p
30770 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20  ointers of the. 
30780 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c   ** divider cell
30790 73 20 61 72 65 20 73 74 72 69 70 70 65 64 20 66  s are stripped f
307a0 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65  rom the cells be
307b0 66 6f 72 65 20 74 68 65 79 20 61 72 65 20 63 6f  fore they are co
307c0 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61  pied.  ** into a
307d0 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68  Space1[].  In th
307e0 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c  is way, all cell
307f0 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72  s in apCell[] ar
30800 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63  e without.  ** c
30810 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20  hild pointers.  
30820 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  If siblings are 
30830 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e  not leaves, then
30840 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a   all cell in.  *
30850 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75  * apCell[] inclu
30860 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  de child pointer
30870 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20  s.  Either way, 
30880 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  all cells in apC
30890 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61  ell[].  ** are a
308a0 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  like..  **.  ** 
308b0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20  leafCorrection: 
308c0 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61   4 if pPage is a
308d0 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50 61   leaf.  0 if pPa
308e0 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66  ge is not a leaf
308f0 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61  ..  **       lea
30900 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50 61  fData:  1 if pPa
30910 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74  ge holds key+dat
30920 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f  a and pParent ho
30930 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20  lds only keys.. 
30940 20 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72 65 63   */.  leafCorrec
30950 74 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d  tion = apOld[0]-
30960 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44  >leaf*4;.  leafD
30970 61 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e  ata = apOld[0]->
30980 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28 69  hasData;.  for(i
30990 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
309a0 7b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 3b  {.    int limit;
309b0 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 42 65 66  .    .    /* Bef
309c0 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  ore doing anythi
309d0 6e 67 20 65 6c 73 65 2c 20 74 61 6b 65 20 61 20  ng else, take a 
309e0 63 6f 70 79 20 6f 66 20 74 68 65 20 69 27 74 68  copy of the i'th
309f0 20 6f 72 69 67 69 6e 61 6c 20 73 69 62 6c 69 6e   original siblin
30a00 67 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73  g.    ** The res
30a10 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  t of this functi
30a20 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61  on will use data
30a30 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73   from the copies
30a40 20 72 61 74 68 65 72 0a 20 20 20 20 2a 2a 20 74   rather.    ** t
30a50 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
30a60 20 70 61 67 65 73 20 73 69 6e 63 65 20 74 68 65   pages since the
30a70 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
30a80 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20  will be in the. 
30a90 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66     ** process of
30aa0 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
30ab0 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  en.  */.    MemP
30ac0 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f  age *pOld = apCo
30ad0 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65  py[i] = (MemPage
30ae0 2a 29 26 61 53 70 61 63 65 31 5b 70 42 74 2d 3e  *)&aSpace1[pBt->
30af0 70 61 67 65 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b  pageSize + k*i];
30b00 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64  .    memcpy(pOld
30b10 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65  , apOld[i], size
30b20 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20  of(MemPage));.  
30b30 20 20 70 4f 6c 64 2d 3e 61 44 61 74 61 20 3d 20    pOld->aData = 
30b40 28 76 6f 69 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b  (void*)&pOld[1];
30b50 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64  .    memcpy(pOld
30b60 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69  ->aData, apOld[i
30b70 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70  ]->aData, pBt->p
30b80 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 6c  ageSize);..    l
30b90 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65  imit = pOld->nCe
30ba0 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c  ll+pOld->nOverfl
30bb0 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ow;.    for(j=0;
30bc0 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a   j<limit; j++){.
30bd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
30be0 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
30bf0 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43  .      apCell[nC
30c00 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66  ell] = findOverf
30c10 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29  lowCell(pOld, j)
30c20 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e  ;.      szCell[n
30c30 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  Cell] = cellSize
30c40 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c  Ptr(pOld, apCell
30c50 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20  [nCell]);.      
30c60 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nCell++;.    }. 
30c70 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20     if( i<nOld-1 
30c80 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b 0a 20  && !leafData){. 
30c90 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20 28 75       u16 sz = (u
30ca0 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20 20  16)szNew[i];.   
30cb0 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20     u8 *pTemp;.  
30cc0 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
30cd0 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
30ce0 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
30cf0 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 70  l] = sz;.      p
30d00 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31 5b  Temp = &aSpace1[
30d10 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20 20  iSpace1];.      
30d20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20  iSpace1 += sz;. 
30d30 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c       assert( sz<
30d40 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34  =pBt->pageSize/4
30d50 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
30d60 28 20 69 53 70 61 63 65 31 3c 3d 70 42 74 2d 3e  ( iSpace1<=pBt->
30d70 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
30d80 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20    memcpy(pTemp, 
30d90 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20  apDiv[i], sz);. 
30da0 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
30db0 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43  l] = pTemp+leafC
30dc0 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
30dd0 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
30de0 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65  rection==0 || le
30df0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20  afCorrection==4 
30e00 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  );.      szCell[
30e10 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b  nCell] = szCell[
30e20 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f 72  nCell] - leafCor
30e30 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69  rection;.      i
30e40 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29  f( !pOld->leaf )
30e50 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
30e60 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
30e70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
30e80 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68 64 72  ssert( pOld->hdr
30e90 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20  Offset==0 );.   
30ea0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
30eb0 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  t pointer of the
30ec0 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64   child page pOld
30ed0 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66   becomes the lef
30ee0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69  t.        ** poi
30ef0 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76 69  nter of the divi
30f00 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20  der cell */.    
30f10 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c      memcpy(apCel
30f20 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d  l[nCell], &pOld-
30f30 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20  >aData[8], 4);. 
30f40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
30f50 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
30f60 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b  Correction==4 );
30f70 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43  .        if( szC
30f80 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a  ell[nCell]<4 ){.
30f90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
30fa0 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65  not allow any ce
30fb0 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  lls smaller than
30fc0 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20   4 bytes. */.   
30fd0 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
30fe0 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20  ell] = 4;.      
30ff0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
31000 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d    nCell++;.    }
31010 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
31020 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e  Figure out the n
31030 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e  umber of pages n
31040 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c  eeded to hold al
31050 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20  l nCell cells.. 
31060 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e   ** Store this n
31070 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41  umber in "k".  A
31080 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65  lso compute szNe
31090 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65  w[] which is the
310a0 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65   total.  ** size
310b0 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e   of all cells on
310c0 20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20 61   the i-th page a
310d0 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63  nd cntNew[] whic
310e0 68 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20  h is the index. 
310f0 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20   ** in apCell[] 
31100 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74  of the cell that
31110 20 64 69 76 69 64 65 73 20 70 61 67 65 20 69 20   divides page i 
31120 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20  from page i+1.  
31130 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20  .  ** cntNew[k] 
31140 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65  should equal nCe
31150 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61  ll..  **.  ** Va
31160 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79  lues computed by
31170 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a   this block:.  *
31180 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  *.  **          
31190 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75   k: The total nu
311a0 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20  mber of sibling 
311b0 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a  pages.  **    sz
311c0 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75  New[i]: Spaced u
311d0 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20  sed on the i-th 
311e0 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20  sibling page..  
311f0 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20  **   cntNew[i]: 
31200 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b  Index in apCell[
31210 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66  ] and szCell[] f
31220 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  or the first cel
31230 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20  l to.  **       
31240 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74         the right
31250 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69 62   of the i-th sib
31260 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
31270 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d  usableSpace: Num
31280 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
31290 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  space available 
312a0 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e  on each sibling.
312b0 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73  .  ** .  */.  us
312c0 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d  ableSpace = pBt-
312d0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32  >usableSize - 12
312e0 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   + leafCorrectio
312f0 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61  n;.  for(subtota
31300 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  l=k=i=0; i<nCell
31310 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
31320 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( i<nMaxCells 
31330 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20  );.    subtotal 
31340 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32  += szCell[i] + 2
31350 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f 74  ;.    if( subtot
31360 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65  al > usableSpace
31370 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b   ){.      szNew[
31380 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20  k] = subtotal - 
31390 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  szCell[i];.     
313a0 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a   cntNew[k] = i;.
313b0 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61        if( leafDa
313c0 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20  ta ){ i--; }.   
313d0 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b     subtotal = 0;
313e0 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20  .      k++;.    
313f0 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29 7b 20    if( k>NB+1 ){ 
31400 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
31410 55 50 54 5f 42 4b 50 54 3b 20 67 6f 74 6f 20 62  UPT_BKPT; goto b
31420 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 20  alance_cleanup; 
31430 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a  }.    }.  }.  sz
31440 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61  New[k] = subtota
31450 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d  l;.  cntNew[k] =
31460 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a   nCell;.  k++;..
31470 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61    /*.  ** The pa
31480 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62  cking computed b
31490 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62  y the previous b
314a0 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20 74  lock is biased t
314b0 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e  oward the siblin
314c0 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  gs.  ** on the l
314d0 65 66 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c  eft side.  The l
314e0 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65  eft siblings are
314f0 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66   always nearly f
31500 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20  ull, while the. 
31510 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73   ** right-most s
31520 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20  ibling might be 
31530 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54  nearly empty.  T
31540 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  his block of cod
31550 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20  e attempts.  ** 
31560 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70 61  to adjust the pa
31570 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67  cking of sibling
31580 73 20 74 6f 20 67 65 74 20 61 20 62 65 74 74 65  s to get a bette
31590 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a  r balance..  **.
315a0 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74    ** This adjust
315b0 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61  ment is more tha
315c0 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  n an optimizatio
315d0 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20  n.  The packing 
315e0 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a  above might.  **
315f0 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61   be so out of ba
31600 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69  lance as to be i
31610 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61  llegal.  For exa
31620 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d  mple, the right-
31630 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e  most.  ** siblin
31640 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c  g might be compl
31650 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68  etely empty.  Th
31660 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73  is adjustment is
31670 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20   not optional.. 
31680 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b   */.  for(i=k-1;
31690 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   i>0; i--){.    
316a0 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a  int szRight = sz
316b0 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65  New[i];  /* Size
316c0 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74   of sibling on t
316d0 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20  he right */.    
316e0 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e  int szLeft = szN
316f0 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65  ew[i-1]; /* Size
31700 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74   of sibling on t
31710 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69  he left */.    i
31720 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20 20 20  nt r;           
31730 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72     /* Index of r
31740 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69  ight-most cell i
31750 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a  n left sibling *
31760 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20  /.    int d;    
31770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
31780 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ex of first cell
31790 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
317a0 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f  right sibling */
317b0 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77  ..    r = cntNew
317c0 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64  [i-1] - 1;.    d
317d0 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44   = r + 1 - leafD
317e0 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ata;.    assert(
317f0 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   d<nMaxCells );.
31800 20 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d      assert( r<nM
31810 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77  axCells );.    w
31820 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30  hile( szRight==0
31830 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43 65   || szRight+szCe
31840 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d  ll[d]+2<=szLeft-
31850 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b  (szCell[r]+2) ){
31860 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b  .      szRight +
31870 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b  = szCell[d] + 2;
31880 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d  .      szLeft -=
31890 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a   szCell[r] + 2;.
318a0 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31        cntNew[i-1
318b0 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63  ]--;.      r = c
318c0 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a  ntNew[i-1] - 1;.
318d0 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20        d = r + 1 
318e0 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20  - leafData;.    
318f0 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d  }.    szNew[i] =
31900 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a   szRight;.    sz
31910 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66  New[i-1] = szLef
31920 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74  t;.  }..  /* Eit
31930 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65  her we found one
31940 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28   or more cells (
31950 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72  cntnew[0])>0) or
31960 20 70 50 61 67 65 20 69 73 0a 20 20 2a 2a 20 61   pPage is.  ** a
31970 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
31980 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20 72  ge.  A virtual r
31990 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68 65 6e  oot page is when
319a0 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20   the real root. 
319b0 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67 65   ** page is page
319c0 20 31 20 61 6e 64 20 77 65 20 61 72 65 20 74 68   1 and we are th
319d0 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20  e only child of 
319e0 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  that page..  */.
319f0 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77    assert( cntNew
31a00 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e  [0]>0 || (pParen
31a10 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50  t->pgno==1 && pP
31a20 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29  arent->nCell==0)
31a30 20 29 3b 0a 0a 20 20 54 52 41 43 45 28 28 22 42   );..  TRACE(("B
31a40 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20  ALANCE: old: %d 
31a50 25 64 20 25 64 20 20 22 2c 0a 20 20 20 20 61 70  %d %d  ",.    ap
31a60 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20  Old[0]->pgno, . 
31a70 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f     nOld>=2 ? apO
31a80 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ld[1]->pgno : 0,
31a90 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61  .    nOld>=3 ? a
31aa0 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20  pOld[2]->pgno : 
31ab0 30 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20  0.  ));..  /*.  
31ac0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65  ** Allocate k ne
31ad0 77 20 70 61 67 65 73 2e 20 20 52 65 75 73 65 20  w pages.  Reuse 
31ae0 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72 65 20  old pages where 
31af0 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20  possible..  */. 
31b00 20 69 66 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70   if( apOld[0]->p
31b10 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63  gno<=1 ){.    rc
31b20 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
31b30 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
31b40 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
31b50 3b 0a 20 20 7d 0a 20 20 70 61 67 65 46 6c 61 67  ;.  }.  pageFlag
31b60 73 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44  s = apOld[0]->aD
31b70 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d  ata[0];.  for(i=
31b80 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<k; i++){.  
31b90 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b    MemPage *pNew;
31ba0 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20  .    if( i<nOld 
31bb0 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  ){.      pNew = 
31bc0 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64  apNew[i] = apOld
31bd0 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64  [i];.      apOld
31be0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  [i] = 0;.      r
31bf0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
31c00 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50  Write(pNew->pDbP
31c10 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77  age);.      nNew
31c20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ++;.      if( rc
31c30 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
31c40 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c  cleanup;.    }el
31c50 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
31c60 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72  ( i>0 );.      r
31c70 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
31c80 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77  ePage(pBt, &pNew
31c90 2c 20 26 70 67 6e 6f 2c 20 70 67 6e 6f 2c 20 30  , &pgno, pgno, 0
31ca0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
31cb0 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
31cc0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70  leanup;.      ap
31cd0 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20  New[i] = pNew;. 
31ce0 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20 20       nNew++;..  
31cf0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 70      /* Set the p
31d00 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
31d10 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 69 62   for the new sib
31d20 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20  ling page. */.  
31d30 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
31d40 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  CUUM ){.        
31d50 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
31d60 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41  New->pgno, PTRMA
31d70 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74  P_BTREE, pParent
31d80 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  ->pgno, &rc);.  
31d90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
31da0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31db0 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63       goto balanc
31dc0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
31dd0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
31de0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65   }.  }..  /* Fre
31df0 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20  e any old pages 
31e00 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65  that were not re
31e10 75 73 65 64 20 61 73 20 6e 65 77 20 70 61 67 65  used as new page
31e20 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  s..  */.  while(
31e30 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 66   i<nOld ){.    f
31e40 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d  reePage(apOld[i]
31e50 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20  , &rc);.    if( 
31e60 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
31e70 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72  e_cleanup;.    r
31e80 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64  eleasePage(apOld
31e90 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b  [i]);.    apOld[
31ea0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b  i] = 0;.    i++;
31eb0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
31ec0 50 75 74 20 74 68 65 20 6e 65 77 20 70 61 67 65  Put the new page
31ed0 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  s in accending o
31ee0 72 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70  rder.  This help
31ef0 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65  s to.  ** keep e
31f00 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 64 69  ntries in the di
31f10 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  sk file in order
31f20 20 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a   so that a scan.
31f30 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c    ** of the tabl
31f40 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63  e is a linear sc
31f50 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 66  an through the f
31f60 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20  ile.  That.  ** 
31f70 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68  in turn helps th
31f80 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
31f90 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61  em to deliver pa
31fa0 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68  ges.  ** from th
31fb0 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69  e disk more rapi
31fc0 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  dly..  **.  ** A
31fd0 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69  n O(n^2) inserti
31fe0 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68  on sort algorith
31ff0 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74 20 73  m is used, but s
32000 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e  ince.  ** n is n
32010 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e  ever more than N
32020 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74  B (a small const
32030 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c  ant), that shoul
32040 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20  d.  ** not be a 
32050 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20  problem..  **.  
32060 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74  ** When NB==3, t
32070 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61  his one optimiza
32080 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64  tion makes the d
32090 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f  atabase.  ** abo
320a0 75 74 20 32 35 25 20 66 61 73 74 65 72 20 66 6f  ut 25% faster fo
320b0 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f  r large insertio
320c0 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73  ns and deletions
320d0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
320e0 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20  ; i<k-1; i++){. 
320f0 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 61 70     int minV = ap
32100 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20  New[i]->pgno;.  
32110 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a    int minI = i;.
32120 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a      for(j=i+1; j
32130 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; j++){.      
32140 69 66 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67  if( apNew[j]->pg
32150 6e 6f 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e  no<(unsigned)min
32160 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e  V ){.        min
32170 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d  I = j;.        m
32180 69 6e 56 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d 3e  inV = apNew[j]->
32190 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pgno;.      }.  
321a0 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49    }.    if( minI
321b0 3e 69 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >i ){.      int 
321c0 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  t;.      MemPage
321d0 20 2a 70 54 3b 0a 20 20 20 20 20 20 74 20 3d 20   *pT;.      t = 
321e0 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a  apNew[i]->pgno;.
321f0 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77        pT = apNew
32200 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  [i];.      apNew
32210 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49  [i] = apNew[minI
32220 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d  ];.      apNew[m
32230 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d  inI] = pT;.    }
32240 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 6e  .  }.  TRACE(("n
32250 65 77 3a 20 25 64 28 25 64 29 20 25 64 28 25 64  ew: %d(%d) %d(%d
32260 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  ) %d(%d) %d(%d) 
32270 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 61  %d(%d)\n",.    a
32280 70 4e 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 73  pNew[0]->pgno, s
32290 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65  zNew[0],.    nNe
322a0 77 3e 3d 32 20 3f 20 61 70 4e 65 77 5b 31 5d 2d  w>=2 ? apNew[1]-
322b0 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e  >pgno : 0, nNew>
322c0 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20  =2 ? szNew[1] : 
322d0 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f  0,.    nNew>=3 ?
322e0 20 61 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f 20   apNew[2]->pgno 
322f0 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73  : 0, nNew>=3 ? s
32300 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20  zNew[2] : 0,.   
32310 20 6e 4e 65 77 3e 3d 34 20 3f 20 61 70 4e 65 77   nNew>=4 ? apNew
32320 5b 33 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e  [3]->pgno : 0, n
32330 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33  New>=4 ? szNew[3
32340 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
32350 3d 35 20 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e 70  =5 ? apNew[4]->p
32360 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35  gno : 0, nNew>=5
32370 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29   ? szNew[4] : 0)
32380 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  );..  assert( sq
32390 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
323a0 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70  eable(pParent->p
323b0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 70 75 74  DbPage) );.  put
323c0 34 62 79 74 65 28 70 52 69 67 68 74 2c 20 61 70  4byte(pRight, ap
323d0 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e  New[nNew-1]->pgn
323e0 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45  o);..  /*.  ** E
323f0 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65  venly distribute
32400 20 74 68 65 20 64 61 74 61 20 69 6e 20 61 70 43   the data in apC
32410 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65  ell[] across the
32420 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a   new pages..  **
32430 20 49 6e 73 65 72 74 20 64 69 76 69 64 65 72 20   Insert divider 
32440 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65  cells into pPare
32450 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  nt as necessary.
32460 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20  .  */.  j = 0;. 
32470 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
32480 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41  ; i++){.    /* A
32490 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20  ssemble the new 
324a0 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f  sibling page. */
324b0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
324c0 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20  ew = apNew[i];. 
324d0 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61     assert( j<nMa
324e0 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 7a 65  xCells );.    ze
324f0 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67  roPage(pNew, pag
32500 65 46 6c 61 67 73 29 3b 0a 20 20 20 20 61 73 73  eFlags);.    ass
32510 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20  emblePage(pNew, 
32520 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70  cntNew[i]-j, &ap
32530 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c  Cell[j], &szCell
32540 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [j]);.    assert
32550 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20  ( pNew->nCell>0 
32560 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63  || (nNew==1 && c
32570 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a  ntNew[0]==0) );.
32580 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
32590 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
325a0 3b 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65  ;..    j = cntNe
325b0 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  w[i];..    /* If
325c0 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
325d0 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76  e assembled abov
325e0 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72 69  e was not the ri
325f0 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
32600 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20  ,.    ** insert 
32610 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  a divider cell i
32620 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70  nto the parent p
32630 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
32640 61 73 73 65 72 74 28 20 69 3c 6e 4e 65 77 2d 31  assert( i<nNew-1
32650 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a   || j==nCell );.
32660 20 20 20 20 69 66 28 20 6a 3c 6e 43 65 6c 6c 20      if( j<nCell 
32670 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
32680 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54  ll;.      u8 *pT
32690 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  emp;.      int s
326a0 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  z;..      assert
326b0 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( j<nMaxCells );
326c0 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61  .      pCell = a
326d0 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  pCell[j];.      
326e0 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b  sz = szCell[j] +
326f0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
32700 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26  .      pTemp = &
32710 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 76 66 6c  aOvflSpace[iOvfl
32720 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 69 66  Space];.      if
32730 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b  ( !pNew->leaf ){
32740 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
32750 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c  &pNew->aData[8],
32760 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20   pCell, 4);.    
32770 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66    }else if( leaf
32780 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
32790 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65 20 69  /* If the tree i
327a0 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72  s a leaf-data tr
327b0 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c  ee, and the sibl
327c0 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c  ings are leaves,
327d0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
327e0 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69  n there is no di
327f0 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70  vider cell in ap
32800 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c  Cell[]. Instead,
32810 20 74 68 65 20 64 69 76 69 64 65 72 20 0a 20 20   the divider .  
32820 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f        ** cell co
32830 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e  nsists of the in
32840 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68  teger key for th
32850 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c  e right-most cel
32860 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a  l of .        **
32870 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67   the sibling-pag
32880 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76  e assembled abov
32890 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20  e only..        
328a0 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49  */.        CellI
328b0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
328c0 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 62    j--;.        b
328d0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
328e0 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d  (pNew, apCell[j]
328f0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
32900 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
32910 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 34 20  .        sz = 4 
32920 2b 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  + putVarint(&pCe
32930 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79  ll[4], info.nKey
32940 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70  );.        pTemp
32950 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
32960 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  e{.        pCell
32970 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 2f   -= 4;.        /
32980 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65 20 66  * Obscure case f
32990 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61  or non-leaf-data
329a0 20 74 72 65 65 73 3a 20 49 66 20 74 68 65 20 63   trees: If the c
329b0 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73  ell at pCell was
329c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76  .        ** prev
329d0 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e  iously stored on
329e0 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e   a leaf node, an
329f0 64 20 69 74 73 20 72 65 70 6f 72 74 65 64 20 73  d its reported s
32a00 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20 20  ize was 4.      
32a10 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e    ** bytes, then
32a20 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79   it may actually
32a30 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   be smaller than
32a40 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a   this .        *
32a50 2a 20 28 73 65 65 20 62 74 72 65 65 50 61 72 73  * (see btreePars
32a60 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20 62 79  eCellPtr(), 4 by
32a70 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e 69 6d  tes is the minim
32a80 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 20  um size of.     
32a90 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e     ** any cell).
32aa0 20 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f 72   But it is impor
32ab0 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74 68 65  tant to pass the
32ac0 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20 74 6f   correct size to
32ad0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73   .        ** ins
32ae0 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65  ertCell(), so re
32af0 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c 20 6e  parse the cell n
32b00 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ow..        **. 
32b10 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74         ** Note t
32b20 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e 65 76  hat this can nev
32b30 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61 6e 20  er happen in an 
32b40 53 51 4c 69 74 65 20 64 61 74 61 20 66 69 6c 65  SQLite data file
32b50 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20 20 20  , as all.       
32b60 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 61 74   ** cells are at
32b70 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 2e 20   least 4 bytes. 
32b80 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  It only happens 
32b90 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65 64 0a  in b-trees used.
32ba0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 76          ** to ev
32bb0 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45 4c 45  aluate "IN (SELE
32bc0 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d  CT ...)" and sim
32bd0 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a 20 20  ilar clauses..  
32be0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
32bf0 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d   if( szCell[j]==
32c00 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  4 ){.          a
32c10 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72 65 63  ssert(leafCorrec
32c20 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20  tion==4);.      
32c30 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a      sz = cellSiz
32c40 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 70 43  ePtr(pParent, pC
32c50 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ell);.        }.
32c60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4f        }.      iO
32c70 76 66 6c 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a  vflSpace += sz;.
32c80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a        assert( sz
32c90 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f  <=pBt->pageSize/
32ca0 34 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  4 );.      asser
32cb0 74 28 20 69 4f 76 66 6c 53 70 61 63 65 3c 3d 70  t( iOvflSpace<=p
32cc0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  Bt->pageSize );.
32cd0 20 20 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c        insertCell
32ce0 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c  (pParent, nxDiv,
32cf0 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d   pCell, sz, pTem
32d00 70 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26  p, pNew->pgno, &
32d10 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rc);.      if( r
32d20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
32d30 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
32d40 6e 75 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nup;.      asser
32d50 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
32d60 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65  swriteable(pPare
32d70 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  nt->pDbPage) );.
32d80 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20  .      j++;.    
32d90 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d    nxDiv++;.    }
32da0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a  .  }.  assert( j
32db0 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ==nCell );.  ass
32dc0 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20  ert( nOld>0 );. 
32dd0 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20   assert( nNew>0 
32de0 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65 46 6c  );.  if( (pageFl
32df0 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46 29 3d  ags & PTF_LEAF)=
32e00 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43  =0 ){.    u8 *zC
32e10 68 69 6c 64 20 3d 20 26 61 70 43 6f 70 79 5b 6e  hild = &apCopy[n
32e20 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d  Old-1]->aData[8]
32e30 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 70  ;.    memcpy(&ap
32e40 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61  New[nNew-1]->aDa
32e50 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c 20 34  ta[8], zChild, 4
32e60 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73  );.  }..  if( is
32e70 52 6f 6f 74 20 26 26 20 70 50 61 72 65 6e 74 2d  Root && pParent-
32e80 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61  >nCell==0 && pPa
32e90 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 3c  rent->hdrOffset<
32ea0 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65  =apNew[0]->nFree
32eb0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72   ){.    /* The r
32ec0 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
32ed0 62 2d 74 72 65 65 20 6e 6f 77 20 63 6f 6e 74 61  b-tree now conta
32ee0 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 54 68  ins no cells. Th
32ef0 65 20 6f 6e 6c 79 20 73 69 62 6c 69 6e 67 0a 20  e only sibling. 
32f00 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 74 68     ** page is th
32f10 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
32f20 20 74 68 65 20 70 61 72 65 6e 74 2e 20 43 6f 70   the parent. Cop
32f30 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  y the contents o
32f40 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 68 69  f the.    ** chi
32f50 6c 64 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ld page into the
32f60 20 70 61 72 65 6e 74 2c 20 64 65 63 72 65 61 73   parent, decreas
32f70 69 6e 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20  ing the overall 
32f80 68 65 69 67 68 74 20 6f 66 20 74 68 65 0a 20 20  height of the.  
32f90 20 20 2a 2a 20 62 2d 74 72 65 65 20 73 74 72 75    ** b-tree stru
32fa0 63 74 75 72 65 20 62 79 20 6f 6e 65 2e 20 54 68  cture by one. Th
32fb0 69 73 20 69 73 20 64 65 73 63 72 69 62 65 64 20  is is described 
32fc0 61 73 20 74 68 65 20 22 62 61 6c 61 6e 63 65 2d  as the "balance-
32fd0 73 68 61 6c 6c 6f 77 65 72 22 0a 20 20 20 20 2a  shallower".    *
32fe0 2a 20 73 75 62 2d 61 6c 67 6f 72 69 74 68 6d 20  * sub-algorithm 
32ff0 69 6e 20 73 6f 6d 65 20 64 6f 63 75 6d 65 6e 74  in some document
33000 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20  ation..    **.  
33010 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
33020 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
33030 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 61 6c  atabase, the cal
33040 6c 20 74 6f 20 63 6f 70 79 4e 6f 64 65 43 6f 6e  l to copyNodeCon
33050 74 65 6e 74 28 29 20 0a 20 20 20 20 2a 2a 20 73  tent() .    ** s
33060 65 74 73 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d  ets all pointer-
33070 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f 72 72  map entries corr
33080 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 64 61 74  esponding to dat
33090 61 62 61 73 65 20 69 6d 61 67 65 20 70 61 67 65  abase image page
330a0 73 20 0a 20 20 20 20 2a 2a 20 66 6f 72 20 77 68  s .    ** for wh
330b0 69 63 68 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ich the pointer 
330c0 69 73 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e  is stored within
330d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69   the content bei
330e0 6e 67 20 63 6f 70 69 65 64 2e 0a 20 20 20 20 2a  ng copied..    *
330f0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63  *.    ** The sec
33100 6f 6e 64 20 61 73 73 65 72 74 20 62 65 6c 6f 77  ond assert below
33110 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74   verifies that t
33120 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 69 73  he child page is
33130 20 64 65 66 72 61 67 6d 65 6e 74 65 64 0a 20 20   defragmented.  
33140 20 20 2a 2a 20 28 69 74 20 6d 75 73 74 20 62 65    ** (it must be
33150 2c 20 61 73 20 69 74 20 77 61 73 20 6a 75 73 74  , as it was just
33160 20 72 65 63 6f 6e 73 74 72 75 63 74 65 64 20 75   reconstructed u
33170 73 69 6e 67 20 61 73 73 65 6d 62 6c 65 50 61 67  sing assemblePag
33180 65 28 29 29 2e 20 54 68 69 73 0a 20 20 20 20 2a  e()). This.    *
33190 2a 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69  * is important i
331a0 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  f the parent pag
331b0 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
331c0 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61  page 1 of the da
331d0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 69 6d  tabase.    ** im
331e0 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  age.  */.    ass
331f0 65 72 74 28 20 6e 4e 65 77 3d 3d 31 20 29 3b 0a  ert( nNew==1 );.
33200 20 20 20 20 61 73 73 65 72 74 28 20 61 70 4e 65      assert( apNe
33210 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d 20 0a  w[0]->nFree == .
33220 20 20 20 20 20 20 20 20 28 67 65 74 32 62 79 74          (get2byt
33230 65 28 26 61 70 4e 65 77 5b 30 5d 2d 3e 61 44 61  e(&apNew[0]->aDa
33240 74 61 5b 35 5d 29 2d 61 70 4e 65 77 5b 30 5d 2d  ta[5])-apNew[0]-
33250 3e 63 65 6c 6c 4f 66 66 73 65 74 2d 61 70 4e 65  >cellOffset-apNe
33260 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29 20 0a  w[0]->nCell*2) .
33270 20 20 20 20 29 3b 0a 20 20 20 20 63 6f 70 79 4e      );.    copyN
33280 6f 64 65 43 6f 6e 74 65 6e 74 28 61 70 4e 65 77  odeContent(apNew
33290 5b 30 5d 2c 20 70 50 61 72 65 6e 74 2c 20 26 72  [0], pParent, &r
332a0 63 29 3b 0a 20 20 20 20 66 72 65 65 50 61 67 65  c);.    freePage
332b0 28 61 70 4e 65 77 5b 30 5d 2c 20 26 72 63 29 3b  (apNew[0], &rc);
332c0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41  .  }else if( ISA
332d0 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
332e0 20 2f 2a 20 46 69 78 20 74 68 65 20 70 6f 69 6e   /* Fix the poin
332f0 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
33300 66 6f 72 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c  for all the cell
33310 73 20 74 68 61 74 20 77 65 72 65 20 73 68 69 66  s that were shif
33320 74 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20 20 20  ted around. .   
33330 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73 65   ** There are se
33340 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74 20  veral different 
33350 74 79 70 65 73 20 6f 66 20 70 6f 69 6e 74 65 72  types of pointer
33360 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 74 68 61  -map entries tha
33370 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a  t need to.    **
33380 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62   be dealt with b
33390 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  y this routine. 
333a0 53 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 68 61  Some of these ha
333b0 76 65 20 62 65 65 6e 20 73 65 74 20 61 6c 72 65  ve been set alre
333c0 61 64 79 2c 20 62 75 74 0a 20 20 20 20 2a 2a 20  ady, but.    ** 
333d0 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20 54  many have not. T
333e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
333f0 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20 20 2a  a summary:.    *
33400 2a 0a 20 20 20 20 2a 2a 20 20 20 31 29 20 54 68  *.    **   1) Th
33410 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69  e entries associ
33420 61 74 65 64 20 77 69 74 68 20 6e 65 77 20 73 69  ated with new si
33430 62 6c 69 6e 67 20 70 61 67 65 73 20 74 68 61 74  bling pages that
33440 20 77 65 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a   were not.    **
33450 20 20 20 20 20 20 73 69 62 6c 69 6e 67 73 20 77        siblings w
33460 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
33470 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 54 68  n was called. Th
33480 65 73 65 20 68 61 76 65 20 61 6c 72 65 61 64 79  ese have already
33490 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62 65 65  .    **      bee
334a0 6e 20 73 65 74 2e 20 57 65 20 64 6f 6e 27 74 20  n set. We don't 
334b0 6e 65 65 64 20 74 6f 20 77 6f 72 72 79 20 61 62  need to worry ab
334c0 6f 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e 67 73  out old siblings
334d0 20 74 68 61 74 20 77 65 72 65 0a 20 20 20 20 2a   that were.    *
334e0 2a 20 20 20 20 20 20 6d 6f 76 65 64 20 74 6f 20  *      moved to 
334f0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2d 20  the free-list - 
33500 74 68 65 20 66 72 65 65 50 61 67 65 28 29 20 63  the freePage() c
33510 6f 64 65 20 68 61 73 20 74 61 6b 65 6e 20 63 61  ode has taken ca
33520 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f  re.    **      o
33530 66 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a 2a 0a  f those..    **.
33540 20 20 20 20 2a 2a 20 20 20 32 29 20 54 68 65 20      **   2) The 
33550 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
33560 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ies associated w
33570 69 74 68 20 74 68 65 20 66 69 72 73 74 20 6f 76  ith the first ov
33580 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 20 20  erflow.    **   
33590 20 20 20 70 61 67 65 20 69 6e 20 61 6e 79 20 6f     page in any o
335a0 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 73 20 75  verflow chains u
335b0 73 65 64 20 62 79 20 6e 65 77 20 64 69 76 69 64  sed by new divid
335c0 65 72 20 63 65 6c 6c 73 2e 20 54 68 65 73 65 20  er cells. These 
335d0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 68 61 76  .    **      hav
335e0 65 20 61 6c 73 6f 20 61 6c 72 65 61 64 79 20 62  e also already b
335f0 65 65 6e 20 74 61 6b 65 6e 20 63 61 72 65 20 6f  een taken care o
33600 66 20 62 79 20 74 68 65 20 69 6e 73 65 72 74 43  f by the insertC
33610 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20 20 20  ell() code..    
33620 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29 20 49  **.    **   3) I
33630 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
33640 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76  ges are not leav
33650 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69  es, then the chi
33660 6c 64 20 70 61 67 65 73 20 6f 66 0a 20 20 20 20  ld pages of.    
33670 2a 2a 20 20 20 20 20 20 63 65 6c 6c 73 20 73 74  **      cells st
33680 6f 72 65 64 20 6f 6e 20 74 68 65 20 73 69 62 6c  ored on the sibl
33690 69 6e 67 20 70 61 67 65 73 20 6d 61 79 20 6e 65  ing pages may ne
336a0 65 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ed to be updated
336b0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
336c0 20 20 34 29 20 49 66 20 74 68 65 20 73 69 62 6c    4) If the sibl
336d0 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f  ing pages are no
336e0 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65  t internal intke
336f0 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20 61 6e  y nodes, then an
33700 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 76  y.    **      ov
33710 65 72 66 6c 6f 77 20 70 61 67 65 73 20 75 73 65  erflow pages use
33720 64 20 62 79 20 74 68 65 73 65 20 63 65 6c 6c 73  d by these cells
33730 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20   may need to be 
33740 75 70 64 61 74 65 64 0a 20 20 20 20 2a 2a 20 20  updated.    **  
33750 20 20 20 20 28 69 6e 74 65 72 6e 61 6c 20 69 6e      (internal in
33760 74 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76 65 72  tkey nodes never
33770 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72   contain pointer
33780 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  s to overflow pa
33790 67 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ges)..    **.   
337a0 20 2a 2a 20 20 20 35 29 20 49 66 20 74 68 65 20   **   5) If the 
337b0 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72  sibling pages ar
337c0 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68  e not leaves, th
337d0 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  en the pointer-m
337e0 61 70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 65  ap.    **      e
337f0 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 72  ntries for the r
33800 69 67 68 74 2d 63 68 69 6c 64 20 70 61 67 65 73  ight-child pages
33810 20 6f 66 20 65 61 63 68 20 73 69 62 6c 69 6e 67   of each sibling
33820 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a   may need.    **
33830 20 20 20 20 20 20 74 6f 20 62 65 20 75 70 64 61        to be upda
33840 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ted..    **.    
33850 2a 2a 20 43 61 73 65 73 20 31 20 61 6e 64 20 32  ** Cases 1 and 2
33860 20 61 72 65 20 64 65 61 6c 74 20 77 69 74 68 20   are dealt with 
33870 61 62 6f 76 65 20 62 79 20 6f 74 68 65 72 20 63  above by other c
33880 6f 64 65 2e 20 54 68 65 20 6e 65 78 74 0a 20 20  ode. The next.  
33890 20 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61 6c 73    ** block deals
338a0 20 77 69 74 68 20 63 61 73 65 73 20 33 20 61 6e   with cases 3 an
338b0 64 20 34 20 61 6e 64 20 74 68 65 20 6f 6e 65 20  d 4 and the one 
338c0 61 66 74 65 72 20 74 68 61 74 2c 20 63 61 73 65  after that, case
338d0 20 35 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a   5. Since.    **
338e0 20 73 65 74 74 69 6e 67 20 61 20 70 6f 69 6e 74   setting a point
338f0 65 72 20 6d 61 70 20 65 6e 74 72 79 20 69 73 20  er map entry is 
33900 61 20 72 65 6c 61 74 69 76 65 6c 79 20 65 78 70  a relatively exp
33910 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e  ensive operation
33920 2c 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 63 6f  , this.    ** co
33930 64 65 20 6f 6e 6c 79 20 73 65 74 73 20 70 6f 69  de only sets poi
33940 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
33950 20 66 6f 72 20 63 68 69 6c 64 20 6f 72 20 6f 76   for child or ov
33960 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61  erflow pages tha
33970 74 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 61 63  t have.    ** ac
33980 74 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62 65 74  tually moved bet
33990 77 65 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f 0a  ween pages.  */.
339a0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
339b0 77 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a 20 20  w = apNew[0];.  
339c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20    MemPage *pOld 
339d0 3d 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20 20 20  = apCopy[0];.   
339e0 20 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77 20 3d   int nOverflow =
339f0 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pOld->nOverflow
33a00 3b 0a 20 20 20 20 69 6e 74 20 69 4e 65 78 74 4f  ;.    int iNextO
33a10 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c  ld = pOld->nCell
33a20 20 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20   + nOverflow;.  
33a30 20 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f 77 20    int iOverflow 
33a40 3d 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f 20 70  = (nOverflow ? p
33a50 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64  Old->aOvfl[0].id
33a60 78 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a 20 3d  x : -1);.    j =
33a70 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
33a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a90 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c 64 27  /* Current 'old'
33aa0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f   sibling page */
33ab0 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20 20 20 20  .    k = 0;     
33ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33ad0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
33ae0 6e 74 20 27 6e 65 77 27 20 73 69 62 6c 69 6e 67  nt 'new' sibling
33af0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 66 6f 72   page */.    for
33b00 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
33b10 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
33b20 73 44 69 76 69 64 65 72 20 3d 20 30 3b 0a 20 20  sDivider = 0;.  
33b30 20 20 20 20 77 68 69 6c 65 28 20 69 3d 3d 69 4e      while( i==iN
33b40 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  extOld ){.      
33b50 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74    /* Cell i is t
33b60 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74  he cell immediat
33b70 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ely following th
33b80 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6f  e last cell on o
33b90 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69  ld.        ** si
33ba0 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e 20 49 66  bling page j. If
33bb0 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
33bc0 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73  e not leaf pages
33bd0 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a   of an.        *
33be0 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c  * intkey b-tree,
33bf0 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 77 61 73   then cell i was
33c00 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e   a divider cell.
33c10 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 6c 64   */.        pOld
33c20 20 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a   = apCopy[++j];.
33c30 20 20 20 20 20 20 20 20 69 4e 65 78 74 4f 6c 64          iNextOld
33c40 20 3d 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61   = i + !leafData
33c50 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b   + pOld->nCell +
33c60 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pOld->nOverflow
33c70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
33c80 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b  ld->nOverflow ){
33c90 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 76 65 72  .          nOver
33ca0 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76  flow = pOld->nOv
33cb0 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20  erflow;.        
33cc0 20 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20 69 20    iOverflow = i 
33cd0 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20 70 4f  + !leafData + pO
33ce0 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  ld->aOvfl[0].idx
33cf0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33d00 20 20 20 20 69 73 44 69 76 69 64 65 72 20 3d 20      isDivider = 
33d10 21 6c 65 61 66 44 61 74 61 3b 20 20 0a 20 20 20  !leafData;  .   
33d20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
33d30 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c  rt(nOverflow>0 |
33d40 7c 20 69 4f 76 65 72 66 6c 6f 77 3c 69 20 29 3b  | iOverflow<i );
33d50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f  .      assert(nO
33d60 76 65 72 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f 6c  verflow<2 || pOl
33d70 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d  d->aOvfl[0].idx=
33d80 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e  =pOld->aOvfl[1].
33d90 69 64 78 2d 31 29 3b 0a 20 20 20 20 20 20 61 73  idx-1);.      as
33da0 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 33  sert(nOverflow<3
33db0 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b   || pOld->aOvfl[
33dc0 31 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f  1].idx==pOld->aO
33dd0 76 66 6c 5b 32 5d 2e 69 64 78 2d 31 29 3b 0a 20  vfl[2].idx-1);. 
33de0 20 20 20 20 20 69 66 28 20 69 3d 3d 69 4f 76 65       if( i==iOve
33df0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
33e00 20 69 73 44 69 76 69 64 65 72 20 3d 20 31 3b 0a   isDivider = 1;.
33e10 20 20 20 20 20 20 20 20 69 66 28 20 28 2d 2d 6e          if( (--n
33e20 4f 76 65 72 66 6c 6f 77 29 3e 30 20 29 7b 0a 20  Overflow)>0 ){. 
33e30 20 20 20 20 20 20 20 20 20 69 4f 76 65 72 66 6c           iOverfl
33e40 6f 77 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ow++;.        }.
33e50 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
33e60 66 28 20 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d 20  f( i==cntNew[k] 
33e70 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 65  ){.        /* Ce
33e80 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65 6c 6c  ll i is the cell
33e90 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
33ea0 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
33eb0 63 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20 20 20 20  cell on new.    
33ec0 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70      ** sibling p
33ed0 61 67 65 20 6b 2e 20 49 66 20 74 68 65 20 73 69  age k. If the si
33ee0 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c  blings are not l
33ef0 65 61 66 20 70 61 67 65 73 20 6f 66 20 61 6e 0a  eaf pages of an.
33f00 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65          ** intke
33f10 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 63  y b-tree, then c
33f20 65 6c 6c 20 69 20 69 73 20 61 20 64 69 76 69 64  ell i is a divid
33f30 65 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20  er cell.  */.   
33f40 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65       pNew = apNe
33f50 77 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  w[++k];.        
33f60 69 66 28 20 21 6c 65 61 66 44 61 74 61 20 29 20  if( !leafData ) 
33f70 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
33f80 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
33f90 6a 3c 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20  j<nOld );.      
33fa0 61 73 73 65 72 74 28 20 6b 3c 6e 4e 65 77 20 29  assert( k<nNew )
33fb0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ;..      /* If t
33fc0 68 65 20 63 65 6c 6c 20 77 61 73 20 6f 72 69 67  he cell was orig
33fd0 69 6e 61 6c 6c 79 20 64 69 76 69 64 65 72 20 63  inally divider c
33fe0 65 6c 6c 20 28 61 6e 64 20 69 73 20 6e 6f 74 20  ell (and is not 
33ff0 6e 6f 77 29 20 6f 72 0a 20 20 20 20 20 20 2a 2a  now) or.      **
34000 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c   an overflow cel
34010 6c 2c 20 6f 72 20 69 66 20 74 68 65 20 63 65 6c  l, or if the cel
34020 6c 20 77 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e  l was located on
34030 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 69 62   a different sib
34040 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 61  ling.      ** pa
34050 67 65 20 62 65 66 6f 72 65 20 74 68 65 20 62 61  ge before the ba
34060 6c 61 6e 63 69 6e 67 2c 20 74 68 65 6e 20 74 68  lancing, then th
34070 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
34080 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64  tries associated
34090 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 61  .      ** with a
340a0 6e 79 20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72  ny child or over
340b0 66 6c 6f 77 20 70 61 67 65 73 20 6e 65 65 64 20  flow pages need 
340c0 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 20 20  to be updated.  
340d0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 44  */.      if( isD
340e0 69 76 69 64 65 72 20 7c 7c 20 70 4f 6c 64 2d 3e  ivider || pOld->
340f0 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f  pgno!=pNew->pgno
34100 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
34110 21 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20  !leafCorrection 
34120 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 74 72  ){.          ptr
34130 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65 74 34  mapPut(pBt, get4
34140 62 79 74 65 28 61 70 43 65 6c 6c 5b 69 5d 29 2c  byte(apCell[i]),
34150 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
34160 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b  New->pgno, &rc);
34170 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34180 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 69 5d     if( szCell[i]
34190 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  >pNew->minLocal 
341a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 74 72  ){.          ptr
341b0 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 4e  mapPutOvflPtr(pN
341c0 65 77 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 26  ew, apCell[i], &
341d0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rc);.        }. 
341e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
341f0 20 20 69 66 28 20 21 6c 65 61 66 43 6f 72 72 65    if( !leafCorre
34200 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 66  ction ){.      f
34210 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
34220 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 33  i++){.        u3
34230 32 20 6b 65 79 20 3d 20 67 65 74 34 62 79 74 65  2 key = get4byte
34240 28 26 61 70 4e 65 77 5b 69 5d 2d 3e 61 44 61 74  (&apNew[i]->aDat
34250 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 70  a[8]);.        p
34260 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6b 65  trmapPut(pBt, ke
34270 79 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  y, PTRMAP_BTREE,
34280 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 2c   apNew[i]->pgno,
34290 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20   &rc);.      }. 
342a0 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20     }..#if 0.    
342b0 2f 2a 20 54 68 65 20 70 74 72 6d 61 70 43 68 65  /* The ptrmapChe
342c0 63 6b 50 61 67 65 73 28 29 20 63 6f 6e 74 61 69  ckPages() contai
342d0 6e 73 20 61 73 73 65 72 74 28 29 20 73 74 61 74  ns assert() stat
342e0 65 6d 65 6e 74 73 20 74 68 61 74 20 76 65 72 69  ements that veri
342f0 66 79 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61  fy that.    ** a
34300 6c 6c 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  ll pointer map p
34310 61 67 65 73 20 61 72 65 20 73 65 74 20 63 6f 72  ages are set cor
34320 72 65 63 74 6c 79 2e 20 54 68 69 73 20 69 73 20  rectly. This is 
34330 68 65 6c 70 66 75 6c 20 77 68 69 6c 65 20 0a 20  helpful while . 
34340 20 20 20 2a 2a 20 64 65 62 75 67 67 69 6e 67 2e     ** debugging.
34350 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79   This is usually
34360 20 64 69 73 61 62 6c 65 64 20 62 65 63 61 75 73   disabled becaus
34370 65 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  e a corrupt data
34380 62 61 73 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20  base may.    ** 
34390 63 61 75 73 65 20 61 6e 20 61 73 73 65 72 74 28  cause an assert(
343a0 29 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 66  ) statement to f
343b0 61 69 6c 2e 20 20 2a 2f 0a 20 20 20 20 70 74 72  ail.  */.    ptr
343c0 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 61 70  mapCheckPages(ap
343d0 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20  New, nNew);.    
343e0 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73  ptrmapCheckPages
343f0 28 26 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a 23  (&pParent, 1);.#
34400 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 61 73 73  endif.  }..  ass
34410 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73  ert( pParent->is
34420 49 6e 69 74 20 29 3b 0a 20 20 54 52 41 43 45 28  Init );.  TRACE(
34430 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73  ("BALANCE: finis
34440 68 65 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d  hed: old=%d new=
34450 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a  %d cells=%d\n",.
34460 20 20 20 20 20 20 20 20 20 20 6e 4f 6c 64 2c 20            nOld, 
34470 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 0a  nNew, nCell));..
34480 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75    /*.  ** Cleanu
34490 70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  p before returni
344a0 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65  ng..  */.balance
344b0 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69  _cleanup:.  sqli
344c0 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28 61  te3ScratchFree(a
344d0 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d  pCell);.  for(i=
344e0 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  0; i<nOld; i++){
344f0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
34500 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a  (apOld[i]);.  }.
34510 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
34520 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c  w; i++){.    rel
34530 65 61 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69  easePage(apNew[i
34540 5d 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ]);.  }..  retur
34550 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
34560 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
34570 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
34580 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
34590 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
345a0 20 69 73 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20   is.** overfull 
345b0 28 68 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  (has one or more
345c0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29   overflow pages)
345d0 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 63 68  ..**.** A new ch
345e0 69 6c 64 20 70 61 67 65 20 69 73 20 61 6c 6c 6f  ild page is allo
345f0 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 63 6f  cated and the co
34600 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 75  ntents of the cu
34610 72 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a 20 70 61  rrent root.** pa
34620 67 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 76  ge, including ov
34630 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2c 20 61 72  erflow cells, ar
34640 65 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68  e copied into th
34650 65 20 63 68 69 6c 64 2e 20 54 68 65 20 72 6f 6f  e child. The roo
34660 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 74 68 65  t.** page is the
34670 6e 20 6f 76 65 72 77 72 69 74 74 65 6e 20 74 6f  n overwritten to
34680 20 6d 61 6b 65 20 69 74 20 61 6e 20 65 6d 70 74   make it an empt
34690 79 20 70 61 67 65 20 77 69 74 68 20 74 68 65 20  y page with the 
346a0 72 69 67 68 74 2d 63 68 69 6c 64 20 0a 2a 2a 20  right-child .** 
346b0 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67  pointer pointing
346c0 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
346d0 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72  ..**.** Before r
346e0 65 74 75 72 6e 69 6e 67 2c 20 61 6c 6c 20 70 6f  eturning, all po
346f0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
34700 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  s corresponding 
34710 74 6f 20 70 61 67 65 73 20 0a 2a 2a 20 74 68 61  to pages .** tha
34720 74 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 2d  t the new child-
34730 70 61 67 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e  page now contain
34740 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 72  s pointers to ar
34750 65 20 75 70 64 61 74 65 64 2e 20 54 68 65 0a 2a  e updated. The.*
34760 2a 20 65 6e 74 72 79 20 63 6f 72 72 65 73 70 6f  * entry correspo
34770 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77  nding to the new
34780 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69   right-child poi
34790 6e 74 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74  nter of the root
347a0 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 6c 73 6f  .** page is also
347b0 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
347c0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a  If successful, *
347d0 70 70 43 68 69 6c 64 20 69 73 20 73 65 74 20 74  ppChild is set t
347e0 6f 20 63 6f 6e 74 61 69 6e 20 61 20 72 65 66 65  o contain a refe
347f0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 68 69  rence to the chi
34800 6c 64 20 0a 2a 2a 20 70 61 67 65 20 61 6e 64 20  ld .** page and 
34810 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
34820 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63  urned. In this c
34830 61 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 69  ase the caller i
34840 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f  s required.** to
34850 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67   call releasePag
34860 65 28 29 20 6f 6e 20 2a 70 70 43 68 69 6c 64 20  e() on *ppChild 
34870 65 78 61 63 74 6c 79 20 6f 6e 63 65 2e 20 49 66  exactly once. If
34880 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
34890 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f  ,.** an error co
348a0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
348b0 6e 64 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73  nd *ppChild is s
348c0 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74  et to 0..*/.stat
348d0 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64  ic int balance_d
348e0 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20 2a 70  eeper(MemPage *p
348f0 52 6f 6f 74 2c 20 4d 65 6d 50 61 67 65 20 2a 2a  Root, MemPage **
34900 70 70 43 68 69 6c 64 29 7b 0a 20 20 69 6e 74 20  ppChild){.  int 
34910 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
34920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
34930 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20  turn value from 
34940 73 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f  subprocedures */
34950 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69  .  MemPage *pChi
34960 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ld = 0;         
34970 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
34980 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
34990 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43   */.  Pgno pgnoC
349a0 68 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20  hild = 0;       
349b0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
349c0 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ber of the new c
349d0 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42  hild page */.  B
349e0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
349f0 52 6f 6f 74 2d 3e 70 42 74 3b 20 20 20 20 2f 2a  Root->pBt;    /*
34a00 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 0a 20   The BTree */.. 
34a10 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
34a20 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20  nOverflow>0 );. 
34a30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
34a40 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
34a50 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
34a60 20 4d 61 6b 65 20 70 52 6f 6f 74 2c 20 74 68 65   Make pRoot, the
34a70 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
34a80 65 20 62 2d 74 72 65 65 2c 20 77 72 69 74 61 62  e b-tree, writab
34a90 6c 65 2e 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  le. Allocate a n
34aa0 65 77 20 0a 20 20 2a 2a 20 70 61 67 65 20 74 68  ew .  ** page th
34ab0 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
34ac0 68 65 20 6e 65 77 20 72 69 67 68 74 2d 63 68 69  he new right-chi
34ad0 6c 64 20 6f 66 20 70 50 61 67 65 2e 20 43 6f 70  ld of pPage. Cop
34ae0 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20  y the contents. 
34af0 20 2a 2a 20 6f 66 20 74 68 65 20 6e 6f 64 65 20   ** of the node 
34b00 73 74 6f 72 65 64 20 6f 6e 20 70 52 6f 6f 74 20  stored on pRoot 
34b10 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 63 68 69  into the new chi
34b20 6c 64 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ld page..  */.  
34b30 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
34b40 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44  rWrite(pRoot->pD
34b50 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
34b60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
34b70 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
34b80 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 26 70  BtreePage(pBt,&p
34b90 43 68 69 6c 64 2c 26 70 67 6e 6f 43 68 69 6c 64  Child,&pgnoChild
34ba0 2c 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 30 29 3b  ,pRoot->pgno,0);
34bb0 0a 20 20 20 20 63 6f 70 79 4e 6f 64 65 43 6f 6e  .    copyNodeCon
34bc0 74 65 6e 74 28 70 52 6f 6f 74 2c 20 70 43 68 69  tent(pRoot, pChi
34bd0 6c 64 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66  ld, &rc);.    if
34be0 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
34bf0 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  {.      ptrmapPu
34c00 74 28 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64  t(pBt, pgnoChild
34c10 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
34c20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 26 72 63  pRoot->pgno, &rc
34c30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
34c40 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 70  f( rc ){.    *pp
34c50 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20 20 20 72  Child = 0;.    r
34c60 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c  eleasePage(pChil
34c70 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  d);.    return r
34c80 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
34c90 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
34ca0 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d  riteable(pChild-
34cb0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
34cc0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
34cd0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
34ce0 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20 29  Root->pDbPage) )
34cf0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 68 69  ;.  assert( pChi
34d00 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 52 6f 6f 74  ld->nCell==pRoot
34d10 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 54 52  ->nCell );..  TR
34d20 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63  ACE(("BALANCE: c
34d30 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f  opy root %d into
34d40 20 25 64 5c 6e 22 2c 20 70 52 6f 6f 74 2d 3e 70   %d\n", pRoot->p
34d50 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  gno, pChild->pgn
34d60 6f 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20  o));..  /* Copy 
34d70 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
34d80 6c 73 20 66 72 6f 6d 20 70 52 6f 6f 74 20 74 6f  ls from pRoot to
34d90 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 6d 65 6d   pChild */.  mem
34da0 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66  cpy(pChild->aOvf
34db0 6c 2c 20 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c 2c  l, pRoot->aOvfl,
34dc0 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f   pRoot->nOverflo
34dd0 77 2a 73 69 7a 65 6f 66 28 70 52 6f 6f 74 2d 3e  w*sizeof(pRoot->
34de0 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43  aOvfl[0]));.  pC
34df0 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  hild->nOverflow 
34e00 3d 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c  = pRoot->nOverfl
34e10 6f 77 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74  ow;..  /* Zero t
34e20 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70  he contents of p
34e30 52 6f 6f 74 2e 20 54 68 65 6e 20 69 6e 73 74 61  Root. Then insta
34e40 6c 6c 20 70 43 68 69 6c 64 20 61 73 20 74 68 65  ll pChild as the
34e50 20 72 69 67 68 74 2d 63 68 69 6c 64 2e 20 2a 2f   right-child. */
34e60 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f  .  zeroPage(pRoo
34e70 74 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61  t, pChild->aData
34e80 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46 29  [0] & ~PTF_LEAF)
34e90 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 52  ;.  put4byte(&pR
34ea0 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74  oot->aData[pRoot
34eb0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
34ec0 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 0a 20 20 2a  pgnoChild);..  *
34ed0 70 70 43 68 69 6c 64 20 3d 20 70 43 68 69 6c 64  ppChild = pChild
34ee0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
34ef0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
34f00 68 65 20 70 61 67 65 20 74 68 61 74 20 70 43 75  he page that pCu
34f10 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
34f20 74 73 20 74 6f 20 68 61 73 20 6a 75 73 74 20 62  ts to has just b
34f30 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 69 6e 0a  een modified in.
34f40 2a 2a 20 73 6f 6d 65 20 77 61 79 2e 20 54 68 69  ** some way. Thi
34f50 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 67 75 72  s function figur
34f60 65 73 20 6f 75 74 20 69 66 20 74 68 69 73 20 6d  es out if this m
34f70 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 65 61 6e  odification mean
34f80 73 20 74 68 65 0a 2a 2a 20 74 72 65 65 20 6e 65  s the.** tree ne
34f90 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e 63  eds to be balanc
34fa0 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 63 61  ed, and if so ca
34fb0 6c 6c 73 20 74 68 65 20 61 70 70 72 6f 70 72 69  lls the appropri
34fc0 61 74 65 20 62 61 6c 61 6e 63 69 6e 67 20 0a 2a  ate balancing .*
34fd0 2a 20 72 6f 75 74 69 6e 65 2e 20 42 61 6c 61 6e  * routine. Balan
34fe0 63 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72  cing routines ar
34ff0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 62 61 6c 61 6e  e:.**.**   balan
35000 63 65 5f 71 75 69 63 6b 28 29 0a 2a 2a 20 20 20  ce_quick().**   
35010 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29  balance_deeper()
35020 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 6e 6f  .**   balance_no
35030 6e 72 6f 6f 74 28 29 0a 2a 2f 0a 73 74 61 74 69  nroot().*/.stati
35040 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 42 74  c int balance(Bt
35050 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
35060 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
35070 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  _OK;.  const int
35080 20 6e 4d 69 6e 20 3d 20 70 43 75 72 2d 3e 70 42   nMin = pCur->pB
35090 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2a 20  t->usableSize * 
350a0 32 20 2f 20 33 3b 0a 20 20 75 38 20 61 42 61 6c  2 / 3;.  u8 aBal
350b0 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b 31  anceQuickSpace[1
350c0 33 5d 3b 0a 20 20 75 38 20 2a 70 46 72 65 65 20  3];.  u8 *pFree 
350d0 3d 20 30 3b 0a 0a 20 20 54 45 53 54 4f 4e 4c 59  = 0;..  TESTONLY
350e0 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75  ( int balance_qu
350f0 69 63 6b 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29  ick_called = 0 )
35100 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e  ;.  TESTONLY( in
35110 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  t balance_deeper
35120 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 0a  _called = 0 );..
35130 20 20 64 6f 20 7b 0a 20 20 20 20 69 6e 74 20 69    do {.    int i
35140 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
35150 67 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  ge;.    MemPage 
35160 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
35170 70 50 61 67 65 5b 69 50 61 67 65 5d 3b 0a 0a 20  pPage[iPage];.. 
35180 20 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20     if( iPage==0 
35190 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
351a0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b  ge->nOverflow ){
351b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
351c0 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
351d0 20 62 2d 74 72 65 65 20 69 73 20 6f 76 65 72 66   b-tree is overf
351e0 75 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ull. In this cas
351f0 65 20 63 61 6c 6c 20 74 68 65 0a 20 20 20 20 20  e call the.     
35200 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 64 65     ** balance_de
35210 65 70 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20  eper() function 
35220 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
35230 63 68 69 6c 64 20 66 6f 72 20 74 68 65 20 72 6f  child for the ro
35240 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20  ot-page.        
35250 2a 2a 20 61 6e 64 20 63 6f 70 79 20 74 68 65 20  ** and copy the 
35260 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73  current contents
35270 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   of the root-pag
35280 65 20 74 6f 20 69 74 2e 20 54 68 65 0a 20 20 20  e to it. The.   
35290 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 69 74 65       ** next ite
352a0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f  ration of the do
352b0 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e  -loop will balan
352c0 63 65 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  ce the child pag
352d0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 20 0a 20  e..        */ . 
352e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
352f0 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 5f 63  balance_deeper_c
35300 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20  alled++)==0 );. 
35310 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61         rc = bala
35320 6e 63 65 5f 64 65 65 70 65 72 28 70 50 61 67 65  nce_deeper(pPage
35330 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  , &pCur->apPage[
35340 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1]);.        if(
35350 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
35360 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  {.          pCur
35370 2d 3e 69 50 61 67 65 20 3d 20 31 3b 0a 20 20 20  ->iPage = 1;.   
35380 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
35390 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  dx[0] = 0;.     
353a0 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
353b0 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  [1] = 0;.       
353c0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
353d0 3e 61 70 50 61 67 65 5b 31 5d 2d 3e 6e 4f 76 65  >apPage[1]->nOve
353e0 72 66 6c 6f 77 20 29 3b 0a 20 20 20 20 20 20 20  rflow );.       
353f0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
35400 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
35410 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35420 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65   if( pPage->nOve
35430 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61 67  rflow==0 && pPag
35440 65 2d 3e 6e 46 72 65 65 3c 3d 6e 4d 69 6e 20 29  e->nFree<=nMin )
35450 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
35460 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35470 4d 65 6d 50 61 67 65 20 2a 20 63 6f 6e 73 74 20  MemPage * const 
35480 70 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e  pParent = pCur->
35490 61 70 50 61 67 65 5b 69 50 61 67 65 2d 31 5d 3b  apPage[iPage-1];
354a0 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e 73 74  .      int const
354b0 20 69 49 64 78 20 3d 20 70 43 75 72 2d 3e 61 69   iIdx = pCur->ai
354c0 49 64 78 5b 69 50 61 67 65 2d 31 5d 3b 0a 0a 20  Idx[iPage-1];.. 
354d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
354e0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 72  3PagerWrite(pPar
354f0 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ent->pDbPage);. 
35500 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
35510 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 6e 64 65  ITE_OK ){.#ifnde
35520 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  f SQLITE_OMIT_QU
35530 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 20 20 20  ICKBALANCE.     
35540 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61     if( pPage->ha
35550 73 44 61 74 61 0a 20 20 20 20 20 20 20 20 20 26  sData.         &
35560 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  & pPage->nOverfl
35570 6f 77 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 26  ow==1.         &
35580 26 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30  & pPage->aOvfl[0
35590 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43  ].idx==pPage->nC
355a0 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20  ell.         && 
355b0 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31  pParent->pgno!=1
355c0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61  .         && pPa
355d0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 69 49 64  rent->nCell==iId
355e0 78 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  x.        ){.   
355f0 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 62         /* Call b
35600 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 74  alance_quick() t
35610 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 73  o create a new s
35620 69 62 6c 69 6e 67 20 6f 66 20 70 50 61 67 65 20  ibling of pPage 
35630 6f 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20  on which.       
35640 20 20 20 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74     ** to store t
35650 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
35660 2e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  . balance_quick(
35670 29 20 69 6e 73 65 72 74 73 20 61 20 6e 65 77 20  ) inserts a new 
35680 63 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 2a  cell.          *
35690 2a 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2c 20  * into pParent, 
356a0 77 68 69 63 68 20 6d 61 79 20 63 61 75 73 65 20  which may cause 
356b0 70 50 61 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77  pParent overflow
356c0 2e 20 49 66 20 74 68 69 73 0a 20 20 20 20 20 20  . If this.      
356d0 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20      ** happens, 
356e0 74 68 65 20 6e 65 78 74 20 69 6e 74 65 72 61 74  the next interat
356f0 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f  ion of the do-lo
35700 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20  op will balance 
35710 70 50 61 72 65 6e 74 20 0a 20 20 20 20 20 20 20  pParent .       
35720 20 20 20 2a 2a 20 75 73 65 20 65 69 74 68 65 72     ** use either
35730 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
35740 28 29 20 6f 72 20 62 61 6c 61 6e 63 65 5f 64 65  () or balance_de
35750 65 70 65 72 28 29 2e 20 55 6e 74 69 6c 20 74 68  eper(). Until th
35760 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
35770 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6f 76 65  happens, the ove
35780 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20 73 74  rflow cell is st
35790 6f 72 65 64 20 69 6e 20 74 68 65 20 61 42 61 6c  ored in the aBal
357a0 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b 5d  anceQuickSpace[]
357b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75  .          ** bu
357c0 66 66 65 72 2e 20 0a 20 20 20 20 20 20 20 20 20  ffer. .         
357d0 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   **.          **
357e0 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   The purpose of 
357f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
35800 73 65 72 74 28 29 20 69 73 20 74 6f 20 63 68 65  sert() is to che
35810 63 6b 20 74 68 61 74 20 6f 6e 6c 79 20 61 0a 20  ck that only a. 
35820 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67           ** sing
35830 6c 65 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e  le call to balan
35840 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20 6d 61  ce_quick() is ma
35850 64 65 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c  de for each call
35860 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20 20 20   to this.       
35870 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20     ** function. 
35880 49 66 20 74 68 69 73 20 77 65 72 65 20 6e 6f 74  If this were not
35890 20 76 65 72 69 66 69 65 64 2c 20 61 20 73 75 62   verified, a sub
358a0 74 6c 65 20 62 75 67 20 69 6e 76 6f 6c 76 69 6e  tle bug involvin
358b0 67 20 72 65 75 73 65 0a 20 20 20 20 20 20 20 20  g reuse.        
358c0 20 20 2a 2a 20 6f 66 20 74 68 65 20 61 42 61 6c    ** of the aBal
358d0 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b 5d  anceQuickSpace[]
358e0 20 6d 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 2e   might sneak in.
358f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
35900 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
35910 28 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 5f 63  (balance_quick_c
35920 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20  alled++)==0 );. 
35930 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61           rc = ba
35940 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70 50 61 72  lance_quick(pPar
35950 65 6e 74 2c 20 70 50 61 67 65 2c 20 61 42 61 6c  ent, pPage, aBal
35960 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 29 3b  anceQuickSpace);
35970 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
35980 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
35990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
359a0 74 68 69 73 20 63 61 73 65 2c 20 63 61 6c 6c 20  this case, call 
359b0 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
359c0 29 20 74 6f 20 72 65 64 69 73 74 72 69 62 75 74  ) to redistribut
359d0 65 20 63 65 6c 6c 73 0a 20 20 20 20 20 20 20 20  e cells.        
359e0 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 70 50 61    ** between pPa
359f0 67 65 20 61 6e 64 20 75 70 20 74 6f 20 32 20 6f  ge and up to 2 o
35a00 66 20 69 74 73 20 73 69 62 6c 69 6e 67 20 70 61  f its sibling pa
35a10 67 65 73 2e 20 54 68 69 73 20 69 6e 76 6f 6c 76  ges. This involv
35a20 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
35a30 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
35a40 6e 74 65 6e 74 73 20 6f 66 20 70 50 61 72 65 6e  ntents of pParen
35a50 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61 75  t, which may cau
35a60 73 65 20 70 50 61 72 65 6e 74 20 74 6f 0a 20 20  se pParent to.  
35a70 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d          ** becom
35a80 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e  e overfull or un
35a90 64 65 72 66 75 6c 6c 2e 20 54 68 65 20 6e 65 78  derfull. The nex
35aa0 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
35ab0 68 65 20 64 6f 2d 6c 6f 6f 70 0a 20 20 20 20 20  he do-loop.     
35ac0 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 61 6c       ** will bal
35ad0 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20  ance the parent 
35ae0 70 61 67 65 20 74 6f 20 63 6f 72 72 65 63 74 20  page to correct 
35af0 74 68 69 73 2e 0a 20 20 20 20 20 20 20 20 20 20  this..          
35b00 2a 2a 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ** .          **
35b10 20 49 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   If the parent p
35b20 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72  age becomes over
35b30 66 75 6c 6c 2c 20 74 68 65 20 6f 76 65 72 66 6c  full, the overfl
35b40 6f 77 20 63 65 6c 6c 20 6f 72 20 63 65 6c 6c 73  ow cell or cells
35b50 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 72  .          ** ar
35b60 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
35b70 70 53 70 61 63 65 20 62 75 66 66 65 72 20 61 6c  pSpace buffer al
35b80 6c 6f 63 61 74 65 64 20 69 6d 6d 65 64 69 61 74  located immediat
35b90 65 6c 79 20 62 65 6c 6f 77 2e 20 0a 20 20 20 20  ely below. .    
35ba0 20 20 20 20 20 20 2a 2a 20 41 20 73 75 62 73 65        ** A subse
35bb0 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 20  quent iteration 
35bc0 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77  of the do-loop w
35bd0 69 6c 6c 20 64 65 61 6c 20 77 69 74 68 20 74 68  ill deal with th
35be0 69 73 20 62 79 0a 20 20 20 20 20 20 20 20 20 20  is by.          
35bf0 2a 2a 20 63 61 6c 6c 69 6e 67 20 62 61 6c 61 6e  ** calling balan
35c00 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 28 62 61  ce_nonroot() (ba
35c10 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20 6d  lance_deeper() m
35c20 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72  ay be called fir
35c30 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  st,.          **
35c40 20 62 75 74 20 69 74 20 64 6f 65 73 6e 27 74 20   but it doesn't 
35c50 64 65 61 6c 20 77 69 74 68 20 6f 76 65 72 66 6c  deal with overfl
35c60 6f 77 20 63 65 6c 6c 73 20 2d 20 6a 75 73 74 20  ow cells - just 
35c70 6d 6f 76 65 73 20 74 68 65 6d 20 74 6f 20 61 0a  moves them to a.
35c80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 66            ** dif
35c90 66 65 72 65 6e 74 20 70 61 67 65 29 2e 20 4f 6e  ferent page). On
35ca0 63 65 20 74 68 69 73 20 73 75 62 73 65 71 75 65  ce this subseque
35cb0 6e 74 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e  nt call to balan
35cc0 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 0a 20 20  ce_nonroot() .  
35cd0 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 63          ** has c
35ce0 6f 6d 70 6c 65 74 65 64 2c 20 69 74 20 69 73 20  ompleted, it is 
35cf0 73 61 66 65 20 74 6f 20 72 65 6c 65 61 73 65 20  safe to release 
35d00 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
35d10 72 20 75 73 65 64 20 62 79 0a 20 20 20 20 20 20  r used by.      
35d20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65 76 69      ** the previ
35d30 6f 75 73 20 63 61 6c 6c 2c 20 61 73 20 74 68 65  ous call, as the
35d40 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 64   overflow cell d
35d50 61 74 61 20 77 69 6c 6c 20 68 61 76 65 20 62 65  ata will have be
35d60 65 6e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  en .          **
35d70 20 63 6f 70 69 65 64 20 65 69 74 68 65 72 20 69   copied either i
35d80 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20  nto the body of 
35d90 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
35da0 6f 72 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a  or into the new.
35db0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 53 70            ** pSp
35dc0 61 63 65 20 62 75 66 66 65 72 20 70 61 73 73 65  ace buffer passe
35dd0 64 20 74 6f 20 74 68 65 20 6c 61 74 74 65 72 20  d to the latter 
35de0 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f  call to balance_
35df0 6e 6f 6e 72 6f 6f 74 28 29 2e 0a 20 20 20 20 20  nonroot()..     
35e00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
35e10 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20 73    u8 *pSpace = s
35e20 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
35e30 28 70 43 75 72 2d 3e 70 42 74 2d 3e 70 61 67 65  (pCur->pBt->page
35e40 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
35e50 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f   rc = balance_no
35e60 6e 72 6f 6f 74 28 70 50 61 72 65 6e 74 2c 20 69  nroot(pParent, i
35e70 49 64 78 2c 20 70 53 70 61 63 65 2c 20 69 50 61  Idx, pSpace, iPa
35e80 67 65 3d 3d 31 29 3b 0a 20 20 20 20 20 20 20 20  ge==1);.        
35e90 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20    if( pFree ){. 
35ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
35eb0 20 70 46 72 65 65 20 69 73 20 6e 6f 74 20 4e 55   pFree is not NU
35ec0 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  LL, it points to
35ed0 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
35ee0 65 72 20 75 73 65 64 20 0a 20 20 20 20 20 20 20  er used .       
35ef0 20 20 20 20 20 2a 2a 20 62 79 20 61 20 70 72 65       ** by a pre
35f00 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20 62 61  vious call to ba
35f10 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e  lance_nonroot().
35f20 20 49 74 73 20 63 6f 6e 74 65 6e 74 73 20 61 72   Its contents ar
35f30 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
35f40 20 6e 6f 77 20 73 74 6f 72 65 64 20 65 69 74 68   now stored eith
35f50 65 72 20 6f 6e 20 72 65 61 6c 20 64 61 74 61 62  er on real datab
35f60 61 73 65 20 70 61 67 65 73 20 6f 72 20 77 69 74  ase pages or wit
35f70 68 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20  hin the .       
35f80 20 20 20 20 20 2a 2a 20 6e 65 77 20 70 53 70 61       ** new pSpa
35f90 63 65 20 62 75 66 66 65 72 2c 20 73 6f 20 69 74  ce buffer, so it
35fa0 20 6d 61 79 20 62 65 20 73 61 66 65 6c 79 20 66   may be safely f
35fb0 72 65 65 64 20 68 65 72 65 2e 20 2a 2f 0a 20 20  reed here. */.  
35fc0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
35fd0 33 50 61 67 65 46 72 65 65 28 70 46 72 65 65 29  3PageFree(pFree)
35fe0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
35ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
36000 70 53 70 61 63 65 20 62 75 66 66 65 72 20 77 69  pSpace buffer wi
36010 6c 6c 20 62 65 20 66 72 65 65 64 20 61 66 74 65  ll be freed afte
36020 72 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20  r the next call 
36030 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  to.          ** 
36040 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
36050 29 2c 20 6f 72 20 6a 75 73 74 20 62 65 66 6f 72  ), or just befor
36060 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
36070 72 65 74 75 72 6e 73 2c 20 77 68 69 63 68 65 76  returns, whichev
36080 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
36090 63 6f 6d 65 73 20 66 69 72 73 74 2e 20 2a 2f 0a  comes first. */.
360a0 20 20 20 20 20 20 20 20 20 20 70 46 72 65 65 20            pFree 
360b0 3d 20 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20  = pSpace;.      
360c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
360d0 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66     pPage->nOverf
360e0 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  low = 0;..      
360f0 2f 2a 20 54 68 65 20 6e 65 78 74 20 69 74 65 72  /* The next iter
36100 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d  ation of the do-
36110 6c 6f 6f 70 20 62 61 6c 61 6e 63 65 73 20 74 68  loop balances th
36120 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 2a  e parent page. *
36130 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  /.      releaseP
36140 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
36150 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b    pCur->iPage--;
36160 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
36170 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
36180 3b 0a 0a 20 20 69 66 28 20 70 46 72 65 65 20 29  ;..  if( pFree )
36190 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
361a0 65 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20 20  eFree(pFree);.  
361b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
361c0 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  .../*.** Insert 
361d0 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74  a new record int
361e0 6f 20 74 68 65 20 42 54 72 65 65 2e 20 20 54 68  o the BTree.  Th
361f0 65 20 6b 65 79 20 69 73 20 67 69 76 65 6e 20 62  e key is given b
36200 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a  y (pKey,nKey).**
36210 20 61 6e 64 20 74 68 65 20 64 61 74 61 20 69 73   and the data is
36220 20 67 69 76 65 6e 20 62 79 20 28 70 44 61 74 61   given by (pData
36230 2c 6e 44 61 74 61 29 2e 20 20 54 68 65 20 63 75  ,nData).  The cu
36240 72 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c  rsor is used onl
36250 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77  y to.** define w
36260 68 61 74 20 74 61 62 6c 65 20 74 68 65 20 72 65  hat table the re
36270 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20 69  cord should be i
36280 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e 20 20 54  nserted into.  T
36290 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20  he cursor.** is 
362a0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
362b0 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69   a random locati
362c0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e  on..**.** For an
362d0 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f   INTKEY table, o
362e0 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 76 61 6c  nly the nKey val
362f0 75 65 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73  ue of the key is
36300 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a   used.  pKey is.
36310 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72  ** ignored.  For
36320 20 61 20 5a 45 52 4f 44 41 54 41 20 74 61 62 6c   a ZERODATA tabl
36330 65 2c 20 74 68 65 20 70 44 61 74 61 20 61 6e 64  e, the pData and
36340 20 6e 44 61 74 61 20 61 72 65 20 62 6f 74 68 20   nData are both 
36350 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ignored..**.** I
36360 66 20 74 68 65 20 73 65 65 6b 52 65 73 75 6c 74  f the seekResult
36370 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
36380 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73  n-zero, then a s
36390 75 63 63 65 73 73 66 75 6c 20 63 61 6c 6c 20 74  uccessful call t
363a0 6f 0a 2a 2a 20 4d 6f 76 65 74 6f 55 6e 70 61 63  o.** MovetoUnpac
363b0 6b 65 64 28 29 20 74 6f 20 73 65 65 6b 20 63 75  ked() to seek cu
363c0 72 73 6f 72 20 70 43 75 72 20 74 6f 20 28 70 4b  rsor pCur to (pK
363d0 65 79 2c 20 6e 4b 65 79 29 20 68 61 73 20 61 6c  ey, nKey) has al
363e0 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 65  ready.** been pe
363f0 72 66 6f 72 6d 65 64 2e 20 73 65 65 6b 52 65 73  rformed. seekRes
36400 75 6c 74 20 69 73 20 74 68 65 20 73 65 61 72 63  ult is the searc
36410 68 20 72 65 73 75 6c 74 20 72 65 74 75 72 6e 65  h result returne
36420 64 20 28 61 20 6e 65 67 61 74 69 76 65 0a 2a 2a  d (a negative.**
36430 20 6e 75 6d 62 65 72 20 69 66 20 70 43 75 72 20   number if pCur 
36440 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 65 6e 74  points at an ent
36450 72 79 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c  ry that is small
36460 65 72 20 74 68 61 6e 20 28 70 4b 65 79 2c 20 6e  er than (pKey, n
36470 4b 65 79 29 2c 20 6f 72 0a 2a 2a 20 61 20 70 6f  Key), or.** a po
36480 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20  sitive value if 
36490 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
364a0 6e 20 65 74 72 79 20 74 68 61 74 20 69 73 20 6c  n etry that is l
364b0 61 72 67 65 72 20 74 68 61 6e 20 0a 2a 2a 20 28  arger than .** (
364c0 70 4b 65 79 2c 20 6e 4b 65 79 29 29 2e 20 0a 2a  pKey, nKey)). .*
364d0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 65 6b  *.** If the seek
364e0 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72  Result parameter
364f0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
36500 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 67 75  en the caller gu
36510 61 72 61 6e 74 65 65 73 20 74 68 61 74 0a 2a 2a  arantees that.**
36520 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
36530 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20  pointing at the 
36540 65 78 69 73 74 69 6e 67 20 63 6f 70 79 20 6f 66  existing copy of
36550 20 61 20 72 6f 77 20 74 68 61 74 20 69 73 20 74   a row that is t
36560 6f 20 62 65 0a 2a 2a 20 6f 76 65 72 77 72 69 74  o be.** overwrit
36570 74 65 6e 2e 20 20 49 66 20 74 68 65 20 73 65 65  ten.  If the see
36580 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65  kResult paramete
36590 72 20 69 73 20 30 2c 20 74 68 65 6e 20 63 75 72  r is 0, then cur
365a0 73 6f 72 20 70 43 75 72 20 6d 61 79 0a 2a 2a 20  sor pCur may.** 
365b0 70 6f 69 6e 74 20 74 6f 20 61 6e 79 20 65 6e 74  point to any ent
365c0 72 79 20 6f 72 20 74 6f 20 6e 6f 20 65 6e 74 72  ry or to no entr
365d0 79 20 61 74 20 61 6c 6c 20 61 6e 64 20 73 6f 20  y at all and so 
365e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61  this function ha
365f0 73 20 74 6f 20 73 65 65 6b 0a 2a 2a 20 74 68 65  s to seek.** the
36600 20 63 75 72 73 6f 72 20 62 65 66 6f 72 65 20 74   cursor before t
36610 68 65 20 6e 65 77 20 6b 65 79 20 63 61 6e 20 62  he new key can b
36620 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69  e inserted..*/.i
36630 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
36640 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72 73 6f  nsert(.  BtCurso
36650 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
36660 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72          /* Inser
36670 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20  t data into the 
36680 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20 63 75  table of this cu
36690 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rsor */.  const 
366a0 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20  void *pKey, i64 
366b0 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20  nKey,    /* The 
366c0 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77 20 72  key of the new r
366d0 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ecord */.  const
366e0 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e   void *pData, in
366f0 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54 68 65  t nData,  /* The
36700 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e 65 77   data of the new
36710 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
36720 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20   nZero,         
36730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
36740 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 30  umber of extra 0
36750 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64   bytes to append
36760 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e   to data */.  in
36770 74 20 61 70 70 65 6e 64 42 69 61 73 2c 20 20 20  t appendBias,   
36780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36790 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
367a0 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65 6e 64  likely an append
367b0 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6b 52 65   */.  int seekRe
367c0 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  sult            
367d0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
367e0 66 20 70 72 69 6f 72 20 4d 6f 76 65 74 6f 55 6e  f prior MovetoUn
367f0 70 61 63 6b 65 64 28 29 20 63 61 6c 6c 20 2a 2f  packed() call */
36800 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
36810 69 6e 74 20 6c 6f 63 20 3d 20 73 65 65 6b 52 65  int loc = seekRe
36820 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 2f  sult;          /
36830 2a 20 2d 31 3a 20 62 65 66 6f 72 65 20 64 65 73  * -1: before des
36840 69 72 65 64 20 6c 6f 63 61 74 69 6f 6e 20 20 2b  ired location  +
36850 31 3a 20 61 66 74 65 72 20 2a 2f 0a 20 20 69 6e  1: after */.  in
36860 74 20 73 7a 4e 65 77 20 3d 20 30 3b 0a 20 20 69  t szNew = 0;.  i
36870 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67  nt idx;.  MemPag
36880 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 72 65  e *pPage;.  Btre
36890 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74  e *p = pCur->pBt
368a0 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ree;.  BtShared 
368b0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
368c0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
368d0 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67  oldCell;.  unsig
368e0 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43 65 6c  ned char *newCel
368f0 6c 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 43  l = 0;..  if( pC
36900 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
36910 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
36920 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
36930 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f  ipNext!=SQLITE_O
36940 4b 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  K );.    return 
36950 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a  pCur->skipNext;.
36960 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 63    }..  assert( c
36970 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
36980 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
36990 74 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  t( pCur->wrFlag 
369a0 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
369b0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
369c0 54 45 20 26 26 20 21 70 42 74 2d 3e 72 65 61 64  TE && !pBt->read
369d0 4f 6e 6c 79 20 29 3b 0a 20 20 61 73 73 65 72 74  Only );.  assert
369e0 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
369f0 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 70 43 75  TableLock(p, pCu
36a00 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
36a10 72 2d 3e 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20  r->pKeyInfo!=0, 
36a20 32 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65  2) );..  /* Asse
36a30 72 74 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  rt that the call
36a40 65 72 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 73  er has been cons
36a50 69 73 74 65 6e 74 2e 20 49 66 20 74 68 69 73 20  istent. If this 
36a60 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
36a70 64 0a 20 20 2a 2a 20 65 78 70 65 63 74 69 6e 67  d.  ** expecting
36a80 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65   an index b-tree
36a90 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
36aa0 72 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65  r should be inse
36ab0 72 74 69 6e 67 20 62 6c 6f 62 0a 20 20 2a 2a 20  rting blob.  ** 
36ac0 6b 65 79 73 20 77 69 74 68 20 6e 6f 20 61 73 73  keys with no ass
36ad0 6f 63 69 61 74 65 64 20 64 61 74 61 2e 20 49 66  ociated data. If
36ae0 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   the cursor was 
36af0 6f 70 65 6e 65 64 20 65 78 70 65 63 74 69 6e 67  opened expecting
36b00 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 6b 65 79 20   an.  ** intkey 
36b10 74 61 62 6c 65 2c 20 74 68 65 20 63 61 6c 6c 65  table, the calle
36b20 72 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65  r should be inse
36b30 72 74 69 6e 67 20 69 6e 74 65 67 65 72 20 6b 65  rting integer ke
36b40 79 73 20 77 69 74 68 20 61 0a 20 20 2a 2a 20 62  ys with a.  ** b
36b50 6c 6f 62 20 6f 66 20 61 73 73 6f 63 69 61 74 65  lob of associate
36b60 64 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20 61 73  d data.  */.  as
36b70 73 65 72 74 28 20 28 70 4b 65 79 3d 3d 30 29 3d  sert( (pKey==0)=
36b80 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  =(pCur->pKeyInfo
36b90 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ==0) );..  /* If
36ba0 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 73 65   this is an inse
36bb0 72 74 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20  rt into a table 
36bc0 62 2d 74 72 65 65 2c 20 69 6e 76 61 6c 69 64 61  b-tree, invalida
36bd0 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20  te any incrblob 
36be0 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70  .  ** cursors op
36bf0 65 6e 20 6f 6e 20 74 68 65 20 72 6f 77 20 62 65  en on the row be
36c00 69 6e 67 20 72 65 70 6c 61 63 65 64 20 28 61 73  ing replaced (as
36c10 73 75 6d 69 6e 67 20 74 68 69 73 20 69 73 20 61  suming this is a
36c20 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 6f 70   replace.  ** op
36c30 65 72 61 74 69 6f 6e 20 2d 20 69 66 20 69 74 20  eration - if it 
36c40 69 73 20 6e 6f 74 2c 20 74 68 65 20 66 6f 6c 6c  is not, the foll
36c50 6f 77 69 6e 67 20 69 73 20 61 20 6e 6f 2d 6f 70  owing is a no-op
36c60 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 75  ).  */.  if( pCu
36c70 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29  r->pKeyInfo==0 )
36c80 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  {.    invalidate
36c90 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28  IncrblobCursors(
36ca0 70 2c 20 6e 4b 65 79 2c 20 30 29 3b 0a 20 20 7d  p, nKey, 0);.  }
36cb0 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20  ..  /* Save the 
36cc0 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79  positions of any
36cd0 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f   other cursors o
36ce0 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  pen on this tabl
36cf0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20  e..  **.  ** In 
36d00 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20  some cases, the 
36d10 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 4d 6f 76  call to btreeMov
36d20 65 74 6f 28 29 20 62 65 6c 6f 77 20 69 73 20 61  eto() below is a
36d30 20 6e 6f 2d 6f 70 2e 20 46 6f 72 0a 20 20 2a 2a   no-op. For.  **
36d40 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 69   example, when i
36d50 6e 73 65 72 74 69 6e 67 20 64 61 74 61 20 69 6e  nserting data in
36d60 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  to a table with 
36d70 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64 20 69  auto-generated i
36d80 6e 74 65 67 65 72 0a 20 20 2a 2a 20 6b 65 79 73  nteger.  ** keys
36d90 2c 20 74 68 65 20 56 44 42 45 20 6c 61 79 65 72  , the VDBE layer
36da0 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65 33   invokes sqlite3
36db0 42 74 72 65 65 4c 61 73 74 28 29 20 74 6f 20 66  BtreeLast() to f
36dc0 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 0a 20  igure out the . 
36dd0 20 2a 2a 20 69 6e 74 65 67 65 72 20 6b 65 79 20   ** integer key 
36de0 74 6f 20 75 73 65 2e 20 49 74 20 74 68 65 6e 20  to use. It then 
36df0 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
36e00 69 6f 6e 20 74 6f 20 61 63 74 75 61 6c 6c 79 20  ion to actually 
36e10 69 6e 73 65 72 74 20 74 68 65 20 0a 20 20 2a 2a  insert the .  **
36e20 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20 69   data into the i
36e30 6e 74 6b 65 79 20 42 2d 54 72 65 65 2e 20 49 6e  ntkey B-Tree. In
36e40 20 74 68 69 73 20 63 61 73 65 20 62 74 72 65 65   this case btree
36e50 4d 6f 76 65 74 6f 28 29 20 72 65 63 6f 67 6e 69  Moveto() recogni
36e60 7a 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  zes.  ** that th
36e70 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65  e cursor is alre
36e80 61 64 79 20 77 68 65 72 65 20 69 74 20 6e 65 65  ady where it nee
36e90 64 73 20 74 6f 20 62 65 20 61 6e 64 20 72 65 74  ds to be and ret
36ea0 75 72 6e 73 20 77 69 74 68 6f 75 74 0a 20 20 2a  urns without.  *
36eb0 2a 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b  * doing any work
36ec0 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 77 61 72  . To avoid thwar
36ed0 74 69 6e 67 20 74 68 65 73 65 20 6f 70 74 69 6d  ting these optim
36ee0 69 7a 61 74 69 6f 6e 73 2c 20 69 74 20 69 73 20  izations, it is 
36ef0 69 6d 70 6f 72 74 61 6e 74 0a 20 20 2a 2a 20 6e  important.  ** n
36f00 6f 74 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20  ot to clear the 
36f10 63 75 72 73 6f 72 20 68 65 72 65 2e 0a 20 20 2a  cursor here..  *
36f20 2f 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c  /.  rc = saveAll
36f30 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75  Cursors(pBt, pCu
36f40 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
36f50 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  r);.  if( rc ) r
36f60 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20  eturn rc;.  if( 
36f70 21 6c 6f 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  !loc ){.    rc =
36f80 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75   btreeMoveto(pCu
36f90 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61  r, pKey, nKey, a
36fa0 70 70 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29  ppendBias, &loc)
36fb0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
36fc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
36fd0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
36fe0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
36ff0 49 44 20 7c 7c 20 28 70 43 75 72 2d 3e 65 53 74  ID || (pCur->eSt
37000 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
37010 4c 49 44 20 26 26 20 6c 6f 63 29 20 29 3b 0a 0a  LID && loc) );..
37020 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
37030 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
37040 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
37050 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20  Page->intKey || 
37060 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73  nKey>=0 );.  ass
37070 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
37080 20 7c 7c 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b   || !pPage->intK
37090 65 79 20 29 3b 0a 0a 20 20 54 52 41 43 45 28 28  ey );..  TRACE((
370a0 22 49 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d 25  "INSERT: table=%
370b0 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74  d nkey=%lld ndat
370c0 61 3d 25 64 20 70 61 67 65 3d 25 64 20 25 73 5c  a=%d page=%d %s\
370d0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43  n",.          pC
370e0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b  ur->pgnoRoot, nK
370f0 65 79 2c 20 6e 44 61 74 61 2c 20 70 50 61 67 65  ey, nData, pPage
37100 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20  ->pgno,.        
37110 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72    loc==0 ? "over
37120 77 72 69 74 65 22 20 3a 20 22 6e 65 77 20 65 6e  write" : "new en
37130 74 72 79 22 29 29 3b 0a 20 20 61 73 73 65 72 74  try"));.  assert
37140 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
37150 29 3b 0a 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d  );.  allocateTem
37160 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 6e  pSpace(pBt);.  n
37170 65 77 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54  ewCell = pBt->pT
37180 6d 70 53 70 61 63 65 3b 0a 20 20 69 66 28 20 6e  mpSpace;.  if( n
37190 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75  ewCell==0 ) retu
371a0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
371b0 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65  .  rc = fillInCe
371c0 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c  ll(pPage, newCel
371d0 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70  l, pKey, nKey, p
371e0 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e 5a 65  Data, nData, nZe
371f0 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a 20 20 69  ro, &szNew);.  i
37200 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
37210 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73 73 65 72  _insert;.  asser
37220 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69  t( szNew==cellSi
37230 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6e 65 77  zePtr(pPage, new
37240 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72  Cell) );.  asser
37250 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c  t( szNew<=MX_CEL
37260 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
37270 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49   idx = pCur->aiI
37280 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
37290 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20 29 7b  .  if( loc==0 ){
372a0 0a 20 20 20 20 75 31 36 20 73 7a 4f 6c 64 3b 0a  .    u16 szOld;.
372b0 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 3c      assert( idx<
372c0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
372d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
372e0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
372f0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
37300 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
37310 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
37320 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6c 64 43 65  .    }.    oldCe
37330 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
37340 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20 69  age, idx);.    i
37350 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
37360 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
37370 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c  newCell, oldCell
37380 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 4);.    }.    
37390 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65  szOld = cellSize
373a0 50 74 72 28 70 50 61 67 65 2c 20 6f 6c 64 43 65  Ptr(pPage, oldCe
373b0 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c  ll);.    rc = cl
373c0 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f  earCell(pPage, o
373d0 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 64 72 6f  ldCell);.    dro
373e0 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  pCell(pPage, idx
373f0 2c 20 73 7a 4f 6c 64 2c 20 26 72 63 29 3b 0a 20  , szOld, &rc);. 
37400 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
37410 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 7d   end_insert;.  }
37420 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30 20 26  else if( loc<0 &
37430 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  & pPage->nCell>0
37440 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
37450 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20  pPage->leaf );. 
37460 20 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d     idx = ++pCur-
37470 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
37480 67 65 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge];.  }else{.  
37490 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
374a0 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 69  >leaf );.  }.  i
374b0 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c  nsertCell(pPage,
374c0 20 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c 20 73   idx, newCell, s
374d0 7a 4e 65 77 2c 20 30 2c 20 30 2c 20 26 72 63 29  zNew, 0, 0, &rc)
374e0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
374f0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
37500 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70  ge->nCell>0 || p
37510 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  Page->nOverflow>
37520 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  0 );..  /* If no
37530 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
37540 65 64 20 61 6e 64 20 70 50 61 67 65 20 68 61 73  ed and pPage has
37550 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c   an overflow cel
37560 6c 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 28  l, call balance(
37570 29 20 0a 20 20 2a 2a 20 74 6f 20 72 65 64 69 73  ) .  ** to redis
37580 74 72 69 62 75 74 65 20 74 68 65 20 63 65 6c 6c  tribute the cell
37590 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 65  s within the tre
375a0 65 2e 20 53 69 6e 63 65 20 62 61 6c 61 6e 63 65  e. Since balance
375b0 28 29 20 6d 61 79 20 6d 6f 76 65 0a 20 20 2a 2a  () may move.  **
375c0 20 74 68 65 20 63 75 72 73 6f 72 2c 20 7a 65 72   the cursor, zer
375d0 6f 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69  o the BtCursor.i
375e0 6e 66 6f 2e 6e 53 69 7a 65 20 61 6e 64 20 42 74  nfo.nSize and Bt
375f0 43 75 72 73 6f 72 2e 76 61 6c 69 64 4e 4b 65 79  Cursor.validNKey
37600 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2e  .  ** variables.
37610 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 72 65 76 69  .  **.  ** Previ
37620 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ous versions of 
37630 53 51 4c 69 74 65 20 63 61 6c 6c 65 64 20 6d 6f  SQLite called mo
37640 76 65 54 6f 52 6f 6f 74 28 29 20 74 6f 20 6d 6f  veToRoot() to mo
37650 76 65 20 74 68 65 20 63 75 72 73 6f 72 0a 20 20  ve the cursor.  
37660 2a 2a 20 62 61 63 6b 20 74 6f 20 74 68 65 20 72  ** back to the r
37670 6f 6f 74 20 70 61 67 65 20 61 73 20 62 61 6c 61  oot page as bala
37680 6e 63 65 28 29 20 75 73 65 64 20 74 6f 20 69 6e  nce() used to in
37690 76 61 6c 69 64 61 74 65 20 74 68 65 20 63 6f 6e  validate the con
376a0 74 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 42 74  tents.  ** of Bt
376b0 43 75 72 73 6f 72 2e 61 70 50 61 67 65 5b 5d 20  Cursor.apPage[] 
376c0 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 61 69 49  and BtCursor.aiI
376d0 64 78 5b 5d 2e 20 49 6e 73 74 65 61 64 20 6f 66  dx[]. Instead of
376e0 20 64 6f 69 6e 67 20 74 68 61 74 2c 0a 20 20 2a   doing that,.  *
376f0 2a 20 73 65 74 20 74 68 65 20 63 75 72 73 6f 72  * set the cursor
37700 20 73 74 61 74 65 20 74 6f 20 22 69 6e 76 61 6c   state to "inval
37710 69 64 22 2e 20 54 68 69 73 20 6d 61 6b 65 73 20  id". This makes 
37720 63 6f 6d 6d 6f 6e 20 69 6e 73 65 72 74 20 6f 70  common insert op
37730 65 72 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 73 6c  erations.  ** sl
37740 69 67 68 74 6c 79 20 66 61 73 74 65 72 2e 0a 20  ightly faster.. 
37750 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 72 65 20 69   **.  ** There i
37760 73 20 61 20 73 75 62 74 6c 65 20 62 75 74 20 69  s a subtle but i
37770 6d 70 6f 72 74 61 6e 74 20 6f 70 74 69 6d 69 7a  mportant optimiz
37780 61 74 69 6f 6e 20 68 65 72 65 20 74 6f 6f 2e 20  ation here too. 
37790 57 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 0a 20  When inserting. 
377a0 20 2a 2a 20 6d 75 6c 74 69 70 6c 65 20 72 65 63   ** multiple rec
377b0 6f 72 64 73 20 69 6e 74 6f 20 61 6e 20 69 6e 74  ords into an int
377c0 6b 65 79 20 62 2d 74 72 65 65 20 75 73 69 6e 67  key b-tree using
377d0 20 61 20 73 69 6e 67 6c 65 20 63 75 72 73 6f 72   a single cursor
377e0 20 28 61 73 20 63 61 6e 0a 20 20 2a 2a 20 68 61   (as can.  ** ha
377f0 70 70 65 6e 20 77 68 69 6c 65 20 70 72 6f 63 65  ppen while proce
37800 73 73 69 6e 67 20 61 6e 20 22 49 4e 53 45 52 54  ssing an "INSERT
37810 20 49 4e 54 4f 20 2e 2e 2e 20 53 45 4c 45 43 54   INTO ... SELECT
37820 22 20 73 74 61 74 65 6d 65 6e 74 29 2c 20 69 74  " statement), it
37830 0a 20 20 2a 2a 20 69 73 20 61 64 76 61 6e 74 61  .  ** is advanta
37840 67 65 6f 75 73 20 74 6f 20 6c 65 61 76 65 20 74  geous to leave t
37850 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69  he cursor pointi
37860 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ng to the last e
37870 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20 74 68 65  ntry in.  ** the
37880 20 62 2d 74 72 65 65 20 69 66 20 70 6f 73 73 69   b-tree if possi
37890 62 6c 65 2e 20 49 66 20 74 68 65 20 63 75 72 73  ble. If the curs
378a0 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
378b0 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 0a  ing to the last.
378c0 20 20 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68    ** entry in th
378d0 65 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68 65  e table, and the
378e0 20 6e 65 78 74 20 72 6f 77 20 69 6e 73 65 72 74   next row insert
378f0 65 64 20 68 61 73 20 61 6e 20 69 6e 74 65 67 65  ed has an intege
37900 72 20 6b 65 79 0a 20 20 2a 2a 20 6c 61 72 67 65  r key.  ** large
37910 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65  r than the large
37920 73 74 20 65 78 69 73 74 69 6e 67 20 6b 65 79 2c  st existing key,
37930 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
37940 74 6f 20 69 6e 73 65 72 74 20 74 68 65 0a 20 20  to insert the.  
37950 2a 2a 20 72 6f 77 20 77 69 74 68 6f 75 74 20 73  ** row without s
37960 65 65 6b 69 6e 67 20 74 68 65 20 63 75 72 73 6f  eeking the curso
37970 72 2e 20 54 68 69 73 20 63 61 6e 20 62 65 20 61  r. This can be a
37980 20 62 69 67 20 70 65 72 66 6f 72 6d 61 6e 63 65   big performance
37990 20 62 6f 6f 73 74 2e 0a 20 20 2a 2f 0a 20 20 70   boost..  */.  p
379a0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
379b0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
379c0 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66  idNKey = 0;.  if
379d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
379e0 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  && pPage->nOverf
379f0 6c 6f 77 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  low ){.    rc = 
37a00 62 61 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a 0a  balance(pCur);..
37a10 20 20 20 20 2f 2a 20 4d 75 73 74 20 6d 61 6b 65      /* Must make
37a20 20 73 75 72 65 20 6e 4f 76 65 72 66 6c 6f 77 20   sure nOverflow 
37a30 69 73 20 72 65 73 65 74 20 74 6f 20 7a 65 72 6f  is reset to zero
37a40 20 65 76 65 6e 20 69 66 20 74 68 65 20 62 61 6c   even if the bal
37a50 61 6e 63 65 28 29 0a 20 20 20 20 2a 2a 20 66 61  ance().    ** fa
37a60 69 6c 73 2e 20 49 6e 74 65 72 6e 61 6c 20 64 61  ils. Internal da
37a70 74 61 20 73 74 72 75 63 74 75 72 65 20 63 6f 72  ta structure cor
37a80 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73  ruption will res
37a90 75 6c 74 20 6f 74 68 65 72 77 69 73 65 2e 20 0a  ult otherwise. .
37aa0 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 73 65 74      ** Also, set
37ab0 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
37ac0 65 20 74 6f 20 69 6e 76 61 6c 69 64 2e 20 54 68  e to invalid. Th
37ad0 69 73 20 73 74 6f 70 73 20 73 61 76 65 43 75 72  is stops saveCur
37ae0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 0a 20 20  sorPosition().  
37af0 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67    ** from trying
37b00 20 74 6f 20 73 61 76 65 20 74 68 65 20 63 75 72   to save the cur
37b10 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66  rent position of
37b20 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 2a 2f   the cursor.  */
37b30 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67  .    pCur->apPag
37b40 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
37b50 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
37b60 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
37b70 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
37b80 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
37b90 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
37ba0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72  r->iPage]->nOver
37bb0 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 65 6e 64 5f  flow==0 );..end_
37bc0 69 6e 73 65 72 74 3a 0a 20 20 72 65 74 75 72 6e  insert:.  return
37bd0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
37be0 6c 65 74 65 20 74 68 65 20 65 6e 74 72 79 20 74  lete the entry t
37bf0 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  hat the cursor i
37c00 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20  s pointing to.  
37c10 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73  The cursor.** is
37c20 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
37c30 74 20 61 20 61 72 62 69 74 72 61 72 79 20 6c 6f  t a arbitrary lo
37c40 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  cation..*/.int s
37c50 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
37c60 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
37c70 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20  ){.  Btree *p = 
37c80 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
37c90 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
37ca0 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20  p->pBt;         
37cb0 20 20 20 20 20 0a 20 20 69 6e 74 20 72 63 3b 20       .  int rc; 
37cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37ce0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
37cf0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
37d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37d10 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f        /* Page to
37d20 20 64 65 6c 65 74 65 20 63 65 6c 6c 20 66 72 6f   delete cell fro
37d30 6d 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  m */.  unsigned 
37d40 63 68 61 72 20 2a 70 43 65 6c 6c 3b 20 20 20 20  char *pCell;    
37d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
37d60 6f 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c 20 74  ointer to cell t
37d70 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e  o delete */.  in
37d80 74 20 69 43 65 6c 6c 49 64 78 3b 20 20 20 20 20  t iCellIdx;     
37d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37da0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
37db0 65 6c 6c 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f  ell to delete */
37dc0 0a 20 20 69 6e 74 20 69 43 65 6c 6c 44 65 70 74  .  int iCellDept
37dd0 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
37de0 20 20 20 20 20 20 20 20 2f 2a 20 44 65 70 74 68          /* Depth
37df0 20 6f 66 20 6e 6f 64 65 20 63 6f 6e 74 61 69 6e   of node contain
37e00 69 6e 67 20 70 43 65 6c 6c 20 2a 2f 20 0a 0a 20  ing pCell */ .. 
37e10 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
37e20 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
37e30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
37e40 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
37e50 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
37e60 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
37e70 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 61 73  readOnly );.  as
37e80 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46 6c  sert( pCur->wrFl
37e90 61 67 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ag );.  assert( 
37ea0 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
37eb0 62 6c 65 4c 6f 63 6b 28 70 2c 20 70 43 75 72 2d  bleLock(p, pCur-
37ec0 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2d  >pgnoRoot, pCur-
37ed0 3e 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 32 29  >pKeyInfo!=0, 2)
37ee0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 68   );.  assert( !h
37ef0 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28  asReadConflicts(
37f00 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  p, pCur->pgnoRoo
37f10 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56  t) );..  if( NEV
37f20 45 52 28 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  ER(pCur->aiIdx[p
37f30 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 43 75  Cur->iPage]>=pCu
37f40 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
37f50 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 29 20 0a  iPage]->nCell) .
37f60 20 20 20 7c 7c 20 4e 45 56 45 52 28 70 43 75 72     || NEVER(pCur
37f70 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
37f80 5f 56 41 4c 49 44 29 0a 20 20 29 7b 0a 20 20 20  _VALID).  ){.   
37f90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
37fa0 52 52 4f 52 3b 20 20 2f 2a 20 53 6f 6d 65 74 68  RROR;  /* Someth
37fb0 69 6e 67 20 68 61 73 20 67 6f 6e 65 20 61 77 72  ing has gone awr
37fc0 79 2e 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20  y. */.  }..  /* 
37fd0 49 66 20 74 68 69 73 20 69 73 20 61 20 64 65 6c  If this is a del
37fe0 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  ete operation to
37ff0 20 72 65 6d 6f 76 65 20 61 20 72 6f 77 20 66 72   remove a row fr
38000 6f 6d 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  om a table b-tre
38010 65 2c 0a 20 20 2a 2a 20 69 6e 76 61 6c 69 64 61  e,.  ** invalida
38020 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20  te any incrblob 
38030 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
38040 74 68 65 20 72 6f 77 20 62 65 69 6e 67 20 64 65  the row being de
38050 6c 65 74 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28  leted.  */.  if(
38060 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d   pCur->pKeyInfo=
38070 3d 30 20 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69  =0 ){.    invali
38080 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
38090 6f 72 73 28 70 2c 20 70 43 75 72 2d 3e 69 6e 66  ors(p, pCur->inf
380a0 6f 2e 6e 4b 65 79 2c 20 30 29 3b 0a 20 20 7d 0a  o.nKey, 0);.  }.
380b0 0a 20 20 69 43 65 6c 6c 44 65 70 74 68 20 3d 20  .  iCellDepth = 
380c0 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 69  pCur->iPage;.  i
380d0 43 65 6c 6c 49 64 78 20 3d 20 70 43 75 72 2d 3e  CellIdx = pCur->
380e0 61 69 49 64 78 5b 69 43 65 6c 6c 44 65 70 74 68  aiIdx[iCellDepth
380f0 5d 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  ];.  pPage = pCu
38100 72 2d 3e 61 70 50 61 67 65 5b 69 43 65 6c 6c 44  r->apPage[iCellD
38110 65 70 74 68 5d 3b 0a 20 20 70 43 65 6c 6c 20 3d  epth];.  pCell =
38120 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
38130 20 69 43 65 6c 6c 49 64 78 29 3b 0a 0a 20 20 2f   iCellIdx);..  /
38140 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 63 6f  * If the page co
38150 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6e 74  ntaining the ent
38160 72 79 20 74 6f 20 64 65 6c 65 74 65 20 69 73 20  ry to delete is 
38170 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65 2c  not a leaf page,
38180 20 6d 6f 76 65 0a 20 20 2a 2a 20 74 68 65 20 63   move.  ** the c
38190 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 72  ursor to the lar
381a0 67 65 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  gest entry in th
381b0 65 20 74 72 65 65 20 74 68 61 74 20 69 73 20 73  e tree that is s
381c0 6d 61 6c 6c 65 72 20 74 68 61 6e 0a 20 20 2a 2a  maller than.  **
381d0 20 74 68 65 20 65 6e 74 72 79 20 62 65 69 6e 67   the entry being
381e0 20 64 65 6c 65 74 65 64 2e 20 54 68 69 73 20 63   deleted. This c
381f0 65 6c 6c 20 77 69 6c 6c 20 72 65 70 6c 61 63 65  ell will replace
38200 20 74 68 65 20 63 65 6c 6c 20 62 65 69 6e 67 20   the cell being 
38210 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 66 72 6f  deleted.  ** fro
38220 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e  m the internal n
38230 6f 64 65 2e 20 54 68 65 20 27 70 72 65 76 69 6f  ode. The 'previo
38240 75 73 27 20 65 6e 74 72 79 20 69 73 20 75 73 65  us' entry is use
38250 64 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 65  d for this inste
38260 61 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 27  ad.  ** of the '
38270 6e 65 78 74 27 20 65 6e 74 72 79 2c 20 61 73 20  next' entry, as 
38280 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74  the previous ent
38290 72 79 20 69 73 20 61 6c 77 61 79 73 20 61 20 70  ry is always a p
382a0 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  art of the.  ** 
382b0 73 75 62 2d 74 72 65 65 20 68 65 61 64 65 64 20  sub-tree headed 
382c0 62 79 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  by the child pag
382d0 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 62 65  e of the cell be
382e0 69 6e 67 20 64 65 6c 65 74 65 64 2e 20 54 68 69  ing deleted. Thi
382f0 73 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 62 61 6c  s makes.  ** bal
38300 61 6e 63 69 6e 67 20 74 68 65 20 74 72 65 65 20  ancing the tree 
38310 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 65  following the de
38320 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 65  lete operation e
38330 61 73 69 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28  asier.  */.  if(
38340 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
38350 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64  .    int notUsed
38360 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
38370 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
38380 70 43 75 72 2c 20 26 6e 6f 74 55 73 65 64 29 3b  pCur, &notUsed);
38390 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
383a0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
383b0 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69  /* Save the posi
383c0 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68  tions of any oth
383d0 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  er cursors open 
383e0 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 20 62 65  on this table be
383f0 66 6f 72 65 0a 20 20 2a 2a 20 6d 61 6b 69 6e 67  fore.  ** making
38400 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69 6f   any modificatio
38410 6e 73 2e 20 4d 61 6b 65 20 74 68 65 20 70 61 67  ns. Make the pag
38420 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
38430 20 65 6e 74 72 79 20 74 6f 20 62 65 20 0a 20 20   entry to be .  
38440 2a 2a 20 64 65 6c 65 74 65 64 20 77 72 69 74 61  ** deleted writa
38450 62 6c 65 2e 20 54 68 65 6e 20 66 72 65 65 20 61  ble. Then free a
38460 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
38470 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
38480 68 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 74 72  h the .  ** entr
38490 79 20 61 6e 64