/ Hex Artifact Content
Login

Artifact 0fc16c6faa2358ad5d892da528cedaade06b70e4:


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 69 6e 74  ntent ){.    int
4500: 20 6e 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20   nPage = 100;.  
4510: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
4520: 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
4530: 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
4540: 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 50    /* If sqlite3P
4550: 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 29 20  agerPagecount() 
4560: 66 61 69 6c 73 20 74 68 65 72 65 20 69 73 20 6e  fails there is n
4570: 6f 20 68 61 72 6d 20 62 65 63 61 75 73 65 20 74  o harm because t
4580: 68 65 0a 20 20 20 20 2a 2a 20 6e 50 61 67 65 20  he.    ** nPage 
4590: 76 61 72 69 61 62 6c 65 20 69 73 20 75 6e 63 68  variable is unch
45a0: 61 6e 67 65 64 20 66 72 6f 6d 20 69 74 73 20 64  anged from its d
45b0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20  efault value of 
45c0: 31 30 30 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e  100 */.    pBt->
45d0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71  pHasContent = sq
45e0: 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
45f0: 65 28 28 75 33 32 29 6e 50 61 67 65 29 3b 0a 20  e((u32)nPage);. 
4600: 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61     if( !pBt->pHa
4610: 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  sContent ){.    
4620: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
4630: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
4640: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4650: 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69  OK && pgno<=sqli
4660: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 42  te3BitvecSize(pB
4670: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20  t->pHasContent) 
4680: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
4690: 74 65 33 42 69 74 76 65 63 53 65 74 28 70 42 74  te3BitvecSet(pBt
46a0: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70  ->pHasContent, p
46b0: 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
46c0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
46d0: 51 75 65 72 79 20 74 68 65 20 42 74 53 68 61 72  Query the BtShar
46e0: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76  ed.pHasContent v
46f0: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ector..**.** Thi
4700: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
4710: 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72 65 65  lled when a free
4720: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
4730: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
4740: 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  the.** free-list
4750: 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72   for reuse. It r
4760: 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20  eturns false if 
4770: 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  it is safe to re
4780: 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61  trieve the.** pa
4790: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
47a0: 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
47b0: 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
47c0: 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68  ag set. True oth
47d0: 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
47e0: 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 48 61  c int btreeGetHa
47f0: 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65  sContent(BtShare
4800: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
4810: 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20  o){.  Bitvec *p 
4820: 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  = pBt->pHasConte
4830: 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20  nt;.  return (p 
4840: 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33  && (pgno>sqlite3
4850: 42 69 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c  BitvecSize(p) ||
4860: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
4870: 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d  st(p, pgno)));.}
4880: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64  ../*.** Clear (d
4890: 65 73 74 72 6f 79 29 20 74 68 65 20 42 74 53 68  estroy) the BtSh
48a0: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
48b0: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 73 68   bitvec. This sh
48c0: 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b  ould be.** invok
48d0: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
48e0: 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69  sion of each wri
48f0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te-transaction..
4900: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
4910: 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
4920: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4930: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74  t){.  sqlite3Bit
4940: 76 65 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e  vecDestroy(pBt->
4950: 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  pHasContent);.  
4960: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4970: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
4980: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
4990: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
49a0: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
49b0: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
49c0: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
49d0: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
49e0: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
49f0: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
4a00: 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ESEEK..**.** The
4a10: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
4a20: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
4a30: 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61  sor is valid (ha
4a40: 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  s eState==CURSOR
4a50: 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72  _VALID).** prior
4a60: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
4a70: 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73   routine.  .*/.s
4a80: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
4a90: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
4aa0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
4ab0: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
4ac0: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
4ad0: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b  =pCur->eState );
4ae0: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43  .  assert( 0==pC
4af0: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73  ur->pKey );.  as
4b00: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
4b10: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
4b20: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
4b30: 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
4b40: 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a  , &pCur->nKey);.
4b50: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
4b60: 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b  LITE_OK );  /* K
4b70: 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20  eySize() cannot 
4b80: 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  fail */..  /* If
4b90: 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b   this is an intK
4ba0: 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74  ey table, then t
4bb0: 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f  he above call to
4bc0: 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a   BtreeKeySize().
4bd0: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
4be0: 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70  integer key in p
4bf0: 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68  Cur->nKey. In th
4c00: 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61 6c  is case this val
4c10: 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74  ue is.  ** all t
4c20: 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 2e  hat is required.
4c30: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
4c40: 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20  Cur is not open 
4c50: 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a  on an intKey.  *
4c60: 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61  * table, then ma
4c70: 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61  lloc space for a
4c80: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43 75  nd store the pCu
4c90: 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66  r->nKey bytes of
4ca0: 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e   key .  ** data.
4cb0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70  .  */.  if( 0==p
4cc0: 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
4cd0: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 76 6f  intKey ){.    vo
4ce0: 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74  id *pKey = sqlit
4cf0: 65 33 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29 70  e3Malloc( (int)p
4d00: 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20  Cur->nKey );.   
4d10: 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
4d20: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
4d30: 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c  treeKey(pCur, 0,
4d40: 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79   (int)pCur->nKey
4d50: 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69  , pKey);.      i
4d60: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4d70: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
4d80: 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20  ->pKey = pKey;. 
4d90: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4da0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
4db0: 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a  (pKey);.      }.
4dc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4dd0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
4de0: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
4df0: 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 61  assert( !pCur->a
4e00: 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
4e10: 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20   || !pCur->pKey 
4e20: 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
4e30: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
4e40: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
4e50: 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  0; i<=pCur->iPag
4e60: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
4e70: 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
4e80: 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
4e90: 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
4ea0: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
4eb0: 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
4ec0: 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  -1;.    pCur->eS
4ed0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45  tate = CURSOR_RE
4ee0: 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a  QUIRESEEK;.  }..
4ef0: 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
4f00: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b  flowCache(pCur);
4f10: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4f20: 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20  ./*.** Save the 
4f30: 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c  positions of all
4f40: 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70 74   cursors (except
4f50: 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20 61   pExcept) that a
4f60: 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68  re open on.** th
4f70: 65 20 74 61 62 6c 65 20 20 77 69 74 68 20 72 6f  e table  with ro
4f80: 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 55  ot-page iRoot. U
4f90: 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20  sually, this is 
4fa0: 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  called just befo
4fb0: 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45 78  re cursor.** pEx
4fc0: 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20  cept is used to 
4fd0: 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62 6c 65  modify the table
4fe0: 20 28 42 74 72 65 65 44 65 6c 65 74 65 28 29 20   (BtreeDelete() 
4ff0: 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29  or BtreeInsert()
5000: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
5010: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
5020: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
5030: 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72  gno iRoot, BtCur
5040: 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20  sor *pExcept){. 
5050: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
5060: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
5070: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
5080: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
5090: 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c  rt( pExcept==0 |
50a0: 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d  | pExcept->pBt==
50b0: 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  pBt );.  for(p=p
50c0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
50d0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
50e0: 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20   if( p!=pExcept 
50f0: 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20  && (0==iRoot || 
5100: 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f  p->pgnoRoot==iRo
5110: 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  ot) && .        
5120: 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
5130: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  R_VALID ){.     
5140: 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75   int rc = saveCu
5150: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
5160: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
5170: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
5180: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
5190: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
51a0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
51b0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
51c0: 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ear the current 
51d0: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
51e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
51f0: 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
5200: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
5210: 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
5220: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
5230: 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  r) );.  sqlite3_
5240: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
5250: 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d  ;.  pCur->pKey =
5260: 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61   0;.  pCur->eSta
5270: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
5280: 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  LID;.}../*.** In
5290: 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   this version of
52a0: 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b   BtreeMoveto, pK
52b0: 65 79 20 69 73 20 61 20 70 61 63 6b 65 64 20 69  ey is a packed i
52c0: 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73  ndex record.** s
52d0: 75 63 68 20 61 73 20 69 73 20 67 65 6e 65 72 61  uch as is genera
52e0: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61  ted by the OP_Ma
52f0: 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
5300: 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20    Unpack the.** 
5310: 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20  record and then 
5320: 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f  call BtreeMoveto
5330: 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f  Unpacked() to do
5340: 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74   the work..*/.st
5350: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f  atic int btreeMo
5360: 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72  veto(.  BtCursor
5370: 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43   *pCur,     /* C
5380: 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68  ursor open on th
5390: 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 73 65  e btree to be se
53a0: 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  arched */.  cons
53b0: 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
53c0: 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66  /* Packed key if
53d0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6e   the btree is an
53e0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20   index */.  i64 
53f0: 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
5400: 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66  /* Integer key f
5410: 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65  or tables.  Size
5420: 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64   of pKey for ind
5430: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69  ices */.  int bi
5440: 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  as,           /*
5450: 20 42 69 61 73 20 73 65 61 72 63 68 20 74 6f 20   Bias search to 
5460: 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
5470: 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
5480: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
5490: 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
54a0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
54b0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
54c0: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20        /* Status 
54d0: 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  code */.  Unpack
54e0: 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
54f0: 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64  y;   /* Unpacked
5500: 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
5510: 63 68 61 72 20 61 53 70 61 63 65 5b 31 35 30 5d  char aSpace[150]
5520: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  ;          /* Te
5530: 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70 49 64  mp space for pId
5540: 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69 64 20  xKey - to avoid 
5550: 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 69  a malloc */..  i
5560: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  f( pKey ){.    a
5570: 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36  ssert( nKey==(i6
5580: 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20  4)(int)nKey );. 
5590: 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c     pIdxKey = sql
55a0: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
55b0: 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49  pack(pCur->pKeyI
55c0: 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20  nfo, (int)nKey, 
55d0: 70 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20  pKey,.          
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55f0: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 70 61              aSpa
5600: 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 63  ce, sizeof(aSpac
5610: 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  e));.    if( pId
5620: 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  xKey==0 ) return
5630: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
5640: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78   }else{.    pIdx
5650: 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Key = 0;.  }.  r
5660: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
5670: 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
5680: 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b  Cur, pIdxKey, nK
5690: 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b  ey, bias, pRes);
56a0: 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20  .  if( pKey ){. 
56b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65     sqlite3VdbeDe
56c0: 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f  leteUnpackedReco
56d0: 72 64 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d  rd(pIdxKey);.  }
56e0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
56f0: 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74  ./*.** Restore t
5700: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
5710: 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73   position it was
5720: 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65   in (or as close
5730: 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29   to as possible)
5740: 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72  .** when saveCur
5750: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61  sorPosition() wa
5760: 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74  s called. Note t
5770: 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65  hat this call de
5780: 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61  letes the .** sa
5790: 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66  ved position inf
57a0: 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65  o stored by save
57b0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
57c0: 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62  , so there can b
57d0: 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65  e.** at most one
57e0: 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f   effective resto
57f0: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
5800: 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61  () call after ea
5810: 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f  ch .** saveCurso
5820: 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a  rPosition()..*/.
5830: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
5840: 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  RestoreCursorPos
5850: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
5860: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
5870: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
5880: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
5890: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
58a0: 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
58b0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
58c0: 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
58d0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
58e0: 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
58f0: 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
5900: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
5910: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
5920: 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62 74  VALID;.  rc = bt
5930: 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
5940: 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72  pCur->pKey, pCur
5950: 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43 75 72  ->nKey, 0, &pCur
5960: 2d 3e 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69  ->skipNext);.  i
5970: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5980: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
5990: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
59a0: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79  ;.    pCur->pKey
59b0: 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
59c0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
59d0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
59e0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
59f0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a  RSOR_INVALID );.
5a00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5a10: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74  .}..#define rest
5a20: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
5a30: 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74  n(p) \.  (p->eSt
5a40: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
5a50: 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20  IRESEEK ? \.    
5a60: 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72       btreeRestor
5a70: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
5a80: 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20  p) : \.         
5a90: 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a  SQLITE_OK)../*.*
5aa0: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74  * Determine whet
5ab0: 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72  her or not a cur
5ac0: 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72  sor has moved fr
5ad0: 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  om the position 
5ae0: 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70  it.** was last p
5af0: 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72 73 6f  laced at.  Curso
5b00: 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65 6e  rs can move when
5b10: 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61 72   the row they ar
5b20: 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61 74  e pointing.** at
5b30: 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20   is deleted out 
5b40: 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d 2e  from under them.
5b50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
5b60: 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e 20 65  ine returns an e
5b70: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73 6f 6d  rror code if som
5b80: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
5b90: 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74 65 67  g.  The.** integ
5ba0: 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20 69 73  er *pHasMoved is
5bb0: 20 73 65 74 20 74 6f 20 6f 6e 65 20 69 66 20 74   set to one if t
5bc0: 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f  he cursor has mo
5bd0: 76 65 64 20 61 6e 64 20 30 20 69 66 20 6e 6f 74  ved and 0 if not
5be0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5bf0: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
5c00: 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ved(BtCursor *pC
5c10: 75 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d 6f 76  ur, int *pHasMov
5c20: 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ed){.  int rc;..
5c30: 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
5c40: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
5c50: 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  r);.  if( rc ){.
5c60: 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d      *pHasMoved =
5c70: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   1;.    return r
5c80: 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  c;.  }.  if( pCu
5c90: 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
5ca0: 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
5cb0: 3e 73 6b 69 70 4e 65 78 74 21 3d 30 20 29 7b 0a  >skipNext!=0 ){.
5cc0: 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d      *pHasMoved =
5cd0: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
5ce0: 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b   *pHasMoved = 0;
5cf0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
5d00: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
5d10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5d20: 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
5d30: 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75   Given a page nu
5d40: 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61  mber of a regula
5d50: 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  r database page,
5d60: 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   return the page
5d70: 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  .** number for t
5d80: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  he pointer-map p
5d90: 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
5da0: 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  s the entry for 
5db0: 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67  the.** input pag
5dc0: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61  e number..*/.sta
5dd0: 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50  tic Pgno ptrmapP
5de0: 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a  ageno(BtShared *
5df0: 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
5e00: 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72  .  int nPagesPer
5e10: 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20  MapPage;.  Pgno 
5e20: 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20  iPtrMap, ret;.  
5e30: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
5e40: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
5e50: 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 50 61 67  mutex) );.  nPag
5e60: 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28  esPerMapPage = (
5e70: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
5e80: 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20  5)+1;.  iPtrMap 
5e90: 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65  = (pgno-2)/nPage
5ea0: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72  sPerMapPage;.  r
5eb0: 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50  et = (iPtrMap*nP
5ec0: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20  agesPerMapPage) 
5ed0: 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d  + 2; .  if( ret=
5ee0: 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
5ef0: 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72  GE(pBt) ){.    r
5f00: 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  et++;.  }.  retu
5f10: 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn ret;.}../*.**
5f20: 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   Write an entry 
5f30: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
5f40: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
5f50: 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73   routine updates
5f60: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
5f70: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
5f80: 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20  number 'key'.** 
5f90: 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20  so that it maps 
5fa0: 74 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20  to type 'eType' 
5fb0: 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20  and parent page 
5fc0: 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a  number 'pgno'..*
5fd0: 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20  *.** If *pRC is 
5fe0: 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65  initially non-ze
5ff0: 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f  ro (non-SQLITE_O
6000: 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  K) then this rou
6010: 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d  tine is.** a no-
6020: 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  op.  If an error
6030: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70   occurs, the app
6040: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
6050: 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ode is written.*
6060: 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a  * into *pRC..*/.
6070: 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d  static void ptrm
6080: 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a  apPut(BtShared *
6090: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
60a0: 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61  8 eType, Pgno pa
60b0: 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b  rent, int *pRC){
60c0: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
60d0: 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  ge;  /* The poin
60e0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
60f0: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
6100: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
6110: 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20  er map data */. 
6120: 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20   Pgno iPtrmap;  
6130: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
6140: 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65  r map page numbe
6150: 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  r */.  int offse
6160: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  t;       /* Offs
6170: 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61  et in pointer ma
6180: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
6190: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rc;           /*
61a0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
61b0: 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a  m subfunctions *
61c0: 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  /..  if( *pRC ) 
61d0: 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
61e0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
61f0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
6200: 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61  ) );.  /* The ma
6210: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67  ster-journal pag
6220: 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65  e number must ne
6230: 76 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61  ver be used as a
6240: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
6250: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  e */.  assert( 0
6260: 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ==PTRMAP_ISPAGE(
6270: 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  pBt, PENDING_BYT
6280: 45 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a  E_PAGE(pBt)) );.
6290: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
62a0: 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
62b0: 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20  if( key==0 ){.  
62c0: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
62d0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
62e0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
62f0: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
6300: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
6310: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
6320: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
6330: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
6340: 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  &pDbPage);.  if(
6350: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
6360: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  {.    *pRC = rc;
6370: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6380: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
6390: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
63a0: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
63b0: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
63c0: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
63d0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
63e0: 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78    goto ptrmap_ex
63f0: 69 74 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  it;.  }.  pPtrma
6400: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
6410: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
6420: 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65  bPage);..  if( e
6430: 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66  Type!=pPtrmap[of
6440: 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74  fset] || get4byt
6450: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
6460: 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b  t+1])!=parent ){
6470: 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52  .    TRACE(("PTR
6480: 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e  MAP_UPDATE: %d->
6490: 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c  (%d,%d)\n", key,
64a0: 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29   eType, parent))
64b0: 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d  ;.    *pRC= rc =
64c0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
64d0: 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
64e0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
64f0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72  OK ){.      pPtr
6500: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54  map[offset] = eT
6510: 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ype;.      put4b
6520: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
6530: 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b  set+1], parent);
6540: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d  .    }.  }..ptrm
6550: 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ap_exit:.  sqlit
6560: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
6570: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
6580: 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72  Read an entry fr
6590: 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  om the pointer m
65a0: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
65b0: 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65 73  outine retrieves
65c0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
65d0: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
65e0: 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a  'key', writing.*
65f0: 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 70  * the type and p
6600: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
6610: 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64  r to *pEType and
6620: 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69   *pPgno respecti
6630: 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f  vely..** An erro
6640: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
6650: 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  ed if something 
6660: 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65  goes wrong, othe
6670: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
6680: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
6690: 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72 65  trmapGet(BtShare
66a0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
66b0: 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67  , u8 *pEType, Pg
66c0: 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62  no *pPgno){.  Db
66d0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
66e0: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
66f0: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
6700: 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20  t iPtrmap;      
6710: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
6720: 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  page index */.  
6730: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
6740: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
6750: 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  p page data */. 
6760: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
6770: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
6780: 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65   entry in pointe
6790: 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72  r map */.  int r
67a0: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
67b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
67c0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
67d0: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
67e0: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
67f0: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
6800: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
6810: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
6820: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
6830: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
6840: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
6850: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
6860: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
6870: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
6880: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
6890: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
68a0: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 61 73  rmap, key);.  as
68b0: 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20  sert( pEType!=0 
68c0: 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70  );.  *pEType = p
68d0: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a  Ptrmap[offset];.
68e0: 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70    if( pPgno ) *p
68f0: 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
6900: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
6910: 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50  1]);..  sqlite3P
6920: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
6930: 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70  e);.  if( *pETyp
6940: 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35  e<1 || *pEType>5
6950: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
6960: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
6970: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6980: 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69  K;.}..#else /* i
6990: 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45  f defined SQLITE
69a0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
69b0: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74   */.  #define pt
69c0: 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c  rmapPut(w,x,y,z,
69d0: 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74  rc).  #define pt
69e0: 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29  rmapGet(w,x,y,z)
69f0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
6a00: 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76  fine ptrmapPutOv
6a10: 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a  flPtr(x, y, rc).
6a20: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69  #endif../*.** Gi
6a30: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
6a40: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
6a50: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
6a60: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
6a70: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
6a80: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
6a90: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
6aa0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
6ab0: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
6ac0: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
6ad0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
6ae0: 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65  ks only for page
6af0: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f  s that do not co
6b00: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
6b10: 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ells..*/.#define
6b20: 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c   findCell(P,I) \
6b30: 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b  .  ((P)->aData +
6b40: 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20   ((P)->maskPage 
6b50: 26 20 67 65 74 32 62 79 74 65 28 26 28 50 29 2d  & get2byte(&(P)-
6b60: 3e 61 44 61 74 61 5b 28 50 29 2d 3e 63 65 6c 6c  >aData[(P)->cell
6b70: 4f 66 66 73 65 74 2b 32 2a 28 49 29 5d 29 29 29  Offset+2*(I)])))
6b80: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d  ../*.** This a m
6b90: 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73  ore complex vers
6ba0: 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28  ion of findCell(
6bb0: 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72  ) that works for
6bc0: 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 64  .** pages that d
6bd0: 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  o contain overfl
6be0: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  ow cells..*/.sta
6bf0: 74 69 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72  tic u8 *findOver
6c00: 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65  flowCell(MemPage
6c10: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
6c20: 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ll){.  int i;.  
6c30: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
6c40: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
6c50: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
6c60: 0a 20 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e  .  for(i=pPage->
6c70: 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d  nOverflow-1; i>=
6c80: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
6c90: 20 6b 3b 0a 20 20 20 20 73 74 72 75 63 74 20 5f   k;.    struct _
6ca0: 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b  OvflCell *pOvfl;
6cb0: 0a 20 20 20 20 70 4f 76 66 6c 20 3d 20 26 70 50  .    pOvfl = &pP
6cc0: 61 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20  age->aOvfl[i];. 
6cd0: 20 20 20 6b 20 3d 20 70 4f 76 66 6c 2d 3e 69 64     k = pOvfl->id
6ce0: 78 3b 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69 43  x;.    if( k<=iC
6cf0: 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ell ){.      if(
6d00: 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20   k==iCell ){.   
6d10: 20 20 20 20 20 72 65 74 75 72 6e 20 70 4f 76 66       return pOvf
6d20: 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20  l->pCell;.      
6d30: 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b  }.      iCell--;
6d40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
6d50: 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  urn findCell(pPa
6d60: 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f  ge, iCell);.}../
6d70: 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c  *.** Parse a cel
6d80: 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20  l content block 
6d90: 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20  and fill in the 
6da0: 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75  CellInfo structu
6db0: 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61 72  re.  There.** ar
6dc0: 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f  e two versions o
6dd0: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  f this function.
6de0: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
6df0: 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63  () takes a .** c
6e00: 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68 65  ell index as the
6e10: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
6e20: 20 61 6e 64 20 62 74 72 65 65 50 61 72 73 65 43   and btreeParseC
6e30: 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b  ellPtr() .** tak
6e40: 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  es a pointer to 
6e50: 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20  the body of the 
6e60: 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f  cell as its seco
6e70: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  nd argument..**.
6e80: 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 66  ** Within this f
6e90: 69 6c 65 2c 20 74 68 65 20 70 61 72 73 65 43 65  ile, the parseCe
6ea0: 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e 20 62  ll() macro can b
6eb0: 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64  e called instead
6ec0: 20 6f 66 0a 2a 2a 20 62 74 72 65 65 50 61 72 73   of.** btreePars
6ed0: 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e  eCellPtr(). Usin
6ee0: 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73  g some compilers
6ef0: 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66  , this will be f
6f00: 61 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aster..*/.static
6f10: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
6f20: 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61  CellPtr(.  MemPa
6f30: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
6f40: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
6f50: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
6f60: 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
6f70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
6f80: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
6f90: 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65  ll text. */.  Ce
6fa0: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
6fb0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
6fc0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
6fd0: 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b 20 20  */.){.  u16 n;  
6fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ff0: 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20  /* Number bytes 
7000: 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  in cell content 
7010: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
7020: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
7030: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7040: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
7050: 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73  ayload */..  ass
7060: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
7070: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
7080: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
7090: 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20   pInfo->pCell = 
70a0: 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  pCell;.  assert(
70b0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
70c0: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
70d0: 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65  1 );.  n = pPage
70e0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
70f0: 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34    assert( n==4-4
7100: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
7110: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
7120: 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Key ){.    if( p
7130: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
7140: 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67 65 74 56  .      n += getV
7150: 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e  arint32(&pCell[n
7160: 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  ], nPayload);.  
7170: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
7180: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20  Payload = 0;.   
7190: 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56   }.    n += getV
71a0: 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c  arint(&pCell[n],
71b0: 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e   (u64*)&pInfo->n
71c0: 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  Key);.    pInfo-
71d0: 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61  >nData = nPayloa
71e0: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
71f0: 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 30  pInfo->nData = 0
7200: 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61  ;.    n += getVa
7210: 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d  rint32(&pCell[n]
7220: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  , nPayload);.   
7230: 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e   pInfo->nKey = n
7240: 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70  Payload;.  }.  p
7250: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
7260: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
7270: 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b  fo->nHeader = n;
7280: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
7290: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
72a0: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
72b0: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
72c0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
72d0: 31 20 29 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c  1 );.  if( likel
72e0: 79 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  y(nPayload<=pPag
72f0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a  e->maxLocal) ){.
7300: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
7310: 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e  he (easy) common
7320: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
7330: 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66  entire payload f
7340: 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  its.    ** on th
7350: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e  e local page.  N
7360: 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65  o overflow is re
7370: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
7380: 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20     int nSize;   
7390: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
73a0: 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e  size of cell con
73b0: 74 65 6e 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  tent in bytes */
73c0: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61  .    nSize = nPa
73d0: 79 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20 20 20 70  yload + n;.    p
73e0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
73f0: 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  u16)nPayload;.  
7400: 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c    pInfo->iOverfl
7410: 6f 77 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ow = 0;.    if( 
7420: 28 6e 53 69 7a 65 20 26 20 7e 33 29 3d 3d 30 20  (nSize & ~3)==0 
7430: 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  ){.      nSize =
7440: 20 34 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 69   4;        /* Mi
7450: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
7460: 69 73 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  is 4 */.    }.  
7470: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
7480: 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 20 20 7d   (u16)nSize;.  }
7490: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
74a0: 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c  the payload will
74b0: 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74   not fit complet
74c0: 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ely on the local
74d0: 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20   page, we have. 
74e0: 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20     ** to decide 
74f0: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72  how much to stor
7500: 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f  e locally and ho
7510: 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20  w much to spill 
7520: 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72  onto.    ** over
7530: 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65  flow pages.  The
7540: 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20   strategy is to 
7550: 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f  minimize the amo
7560: 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20  unt of unused.  
7570: 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76    ** space on ov
7580: 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69  erflow pages whi
7590: 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61  le keeping the a
75a0: 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73  mount of local s
75b0: 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e  torage.    ** in
75c0: 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61   between minLoca
75d0: 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a  l and maxLocal..
75e0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61      **.    ** Wa
75f0: 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67  rning:  changing
7600: 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f   the way overflo
7610: 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73  w payload is dis
7620: 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a  tributed in any.
7630: 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20      ** way will 
7640: 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63  result in an inc
7650: 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66  ompatible file f
7660: 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ormat..    */.  
7670: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20    int minLocal; 
7680: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75   /* Minimum amou
7690: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
76a0: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
76b0: 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20    int maxLocal; 
76c0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75   /* Maximum amou
76d0: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
76e0: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
76f0: 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20    int surplus;  
7700: 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79   /* Overflow pay
7710: 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66  load available f
7720: 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  or local storage
7730: 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61   */..    minLoca
7740: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
7750: 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61  cal;.    maxLoca
7760: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  l = pPage->maxLo
7770: 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73  cal;.    surplus
7780: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e   = minLocal + (n
7790: 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63  Payload - minLoc
77a0: 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d  al)%(pPage->pBt-
77b0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
77c0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
77d0: 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61  surplus==maxLoca
77e0: 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
77f0: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
7800: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
7810: 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78  ( surplus <= max
7820: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70  Local ){.      p
7830: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
7840: 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 20  u16)surplus;.   
7850: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
7860: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
7870: 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  16)minLocal;.   
7880: 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f   }.    pInfo->iO
7890: 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36 29 28  verflow = (u16)(
78a0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20  pInfo->nLocal + 
78b0: 6e 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  n);.    pInfo->n
78c0: 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f  Size = pInfo->iO
78d0: 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d  verflow + 4;.  }
78e0: 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65  .}.#define parse
78f0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
7900: 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20 62 74  l, pInfo) \.  bt
7910: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
7920: 28 70 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c  (pPage), findCel
7930: 6c 28 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c  l((pPage), (iCel
7940: 6c 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a 73 74  l)), (pInfo)).st
7950: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
7960: 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  arseCell(.  MemP
7970: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
7980: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
7990: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
79a0: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20  */.  int iCell, 
79b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
79c0: 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20  The cell index. 
79d0: 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30   First cell is 0
79e0: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
79f0: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
7a00: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
7a10: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
7a20: 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  parseCell(pPage,
7a30: 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   iCell, pInfo);.
7a40: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
7a50: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
7a60: 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20  r of bytes that 
7a70: 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20  a Cell needs in 
7a80: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
7a90: 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72   area of the btr
7aa0: 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65  ee-page.  The re
7ab0: 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c  turn number incl
7ac0: 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  udes the cell.**
7ad0: 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64   data header and
7ae0: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f   the local paylo
7af0: 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20  ad, but not any 
7b00: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72  overflow page or
7b10: 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73  .** the space us
7b20: 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70  ed by the cell p
7b30: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
7b40: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
7b50: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
7b60: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
7b70: 75 38 20 2a 70 49 74 65 72 20 3d 20 26 70 43 65  u8 *pIter = &pCe
7b80: 6c 6c 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  ll[pPage->childP
7b90: 74 72 53 69 7a 65 5d 3b 0a 20 20 75 33 32 20 6e  trSize];.  u32 n
7ba0: 53 69 7a 65 3b 0a 0a 23 69 66 64 65 66 20 53 51  Size;..#ifdef SQ
7bb0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
7bc0: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
7bd0: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
7be0: 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  ion should alway
7bf0: 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  s be the same as
7c00: 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49  .  ** the (CellI
7c10: 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65  nfo.nSize) value
7c20: 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20   found by doing 
7c30: 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20  a full parse of 
7c40: 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49  the.  ** cell. I
7c50: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69  f SQLITE_DEBUG i
7c60: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  s defined, an as
7c70: 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f  sert() at the bo
7c80: 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69  ttom of.  ** thi
7c90: 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66  s function verif
7ca0: 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e  ies that this in
7cb0: 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76  variant is not v
7cc0: 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65  iolated. */.  Ce
7cd0: 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f  llInfo debuginfo
7ce0: 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
7cf0: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
7d00: 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b  ll, &debuginfo);
7d10: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
7d20: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
7d30: 20 20 20 20 75 38 20 2a 70 45 6e 64 3b 0a 20 20      u8 *pEnd;.  
7d40: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
7d50: 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 70 49  Data ){.      pI
7d60: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
7d70: 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29  32(pIter, nSize)
7d80: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7d90: 20 20 20 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20     nSize = 0;.  
7da0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 70 49 74 65    }..    /* pIte
7db0: 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20  r now points at 
7dc0: 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67  the 64-bit integ
7dd0: 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20  er key value, a 
7de0: 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
7df0: 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e  .    ** integer.
7e00: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
7e10: 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72  lock moves pIter
7e20: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
7e30: 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 20 20   first byte.    
7e40: 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ** past the end 
7e50: 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  of the key value
7e60: 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20  . */.    pEnd = 
7e70: 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77  &pIter[9];.    w
7e80: 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29  hile( (*pIter++)
7e90: 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  &0x80 && pIter<p
7ea0: 45 6e 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  End );.  }else{.
7eb0: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
7ec0: 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20  Varint32(pIter, 
7ed0: 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 74  nSize);.  }..  t
7ee0: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
7ef0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
7f00: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
7f10: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
7f20: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
7f30: 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61   nSize>pPage->ma
7f40: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e  xLocal ){.    in
7f50: 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61  t minLocal = pPa
7f60: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
7f70: 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63    nSize = minLoc
7f80: 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69  al + (nSize - mi
7f90: 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65  nLocal) % (pPage
7fa0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
7fb0: 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74  e - 4);.    test
7fc0: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
7fd0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
7fe0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53      testcase( nS
7ff0: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
8000: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
8010: 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d  ( nSize>pPage->m
8020: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  axLocal ){.     
8030: 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61   nSize = minLoca
8040: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69  l;.    }.    nSi
8050: 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 6e  ze += 4;.  }.  n
8060: 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49  Size += (u32)(pI
8070: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20  ter - pCell);.. 
8080: 20 2f 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20   /* The minimum 
8090: 73 69 7a 65 20 6f 66 20 61 6e 79 20 63 65 6c 6c  size of any cell
80a0: 20 69 73 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a   is 4 bytes. */.
80b0: 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b    if( nSize<4 ){
80c0: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 0a  .    nSize = 4;.
80d0: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e    }..  assert( n
80e0: 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e  Size==debuginfo.
80f0: 6e 53 69 7a 65 20 29 3b 0a 20 20 72 65 74 75 72  nSize );.  retur
8100: 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a  n (u16)nSize;.}.
8110: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8120: 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72  EBUG./* This var
8130: 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69  iation on cellSi
8140: 7a 65 50 74 72 28 29 20 69 73 20 75 73 65 64 20  zePtr() is used 
8150: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
8160: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  () statements.**
8170: 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63   only. */.static
8180: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65   u16 cellSize(Me
8190: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
81a0: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75  t iCell){.  retu
81b0: 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  rn cellSizePtr(p
81c0: 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70  Page, findCell(p
81d0: 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d  Page, iCell));.}
81e0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
81f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
8200: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66  OVACUUM./*.** If
8210: 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c   the cell pCell,
8220: 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50   part of page pP
8230: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  age contains a p
8240: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
8250: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69  overflow page, i
8260: 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69  nsert an entry i
8270: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  nto the pointer-
8280: 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f  map.** for the o
8290: 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f  verflow page..*/
82a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72  .static void ptr
82b0: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65  mapPutOvflPtr(Me
82c0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
82d0: 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52   *pCell, int *pR
82e0: 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  C){.  CellInfo i
82f0: 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20  nfo;.  if( *pRC 
8300: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
8310: 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a  rt( pCell!=0 );.
8320: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
8330: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
8340: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65  , &info);.  asse
8350: 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  rt( (info.nData+
8360: 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
8370: 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e  :info.nKey))==in
8380: 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  fo.nPayload );. 
8390: 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
83a0: 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  low ){.    Pgno 
83b0: 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
83c0: 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
83d0: 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72  rflow]);.    ptr
83e0: 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
83f0: 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  t, ovfl, PTRMAP_
8400: 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65  OVERFLOW1, pPage
8410: 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20  ->pgno, pRC);.  
8420: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
8430: 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68  ** Defragment th
8440: 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41  e page given.  A
8450: 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76  ll Cells are mov
8460: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  ed to the.** end
8470: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e 64   of the page and
8480: 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20   all free space 
8490: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74  is collected int
84a0: 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65  o one.** big Fre
84b0: 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73  eBlk that occurs
84c0: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
84d0: 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a  header and cell.
84e0: 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ** pointer array
84f0: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
8500: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73  ntent area..*/.s
8510: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
8520: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
8530: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
8540: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
8550: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
8560: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
8570: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pc;             
8580: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
8590: 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c  s of a i-th cell
85a0: 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85c0: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
85d0: 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  e page header */
85e0: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
85f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8600: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
8610: 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
8620: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
8630: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61  /* Number of usa
8640: 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70  ble bytes on a p
8650: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  age */.  int cel
8660: 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  lOffset;        
8670: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
8680: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
8690: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  r array */.  int
86a0: 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20   cbrk;          
86b0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
86c0: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
86d0: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
86e0: 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
86f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8700: 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
8710: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
8720: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
8730: 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ta;       /* The
8740: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
8750: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
8760: 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65  emp;       /* Te
8770: 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c  mp area for cell
8780: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e   content */.  in
8790: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
87a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
87b0: 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c  t allowable cell
87c0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
87d0: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20  iCellLast;      
87e0: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70         /* Last p
87f0: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64  ossible cell ind
8800: 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74  ex */...  assert
8810: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
8820: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
8830: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
8840: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
8850: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
8860: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ( pPage->pBt->us
8870: 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49  ableSize <= SQLI
8880: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
8890: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
88a0: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
88b0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
88c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
88d0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
88e0: 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d  tex) );.  temp =
88f0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
8900: 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42  pSpace(pPage->pB
8910: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61  t->pPager);.  da
8920: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
8930: 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
8940: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63  ->hdrOffset;.  c
8950: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
8960: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
8970: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
8980: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
8990: 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65   nCell==get2byte
89a0: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29  (&data[hdr+3]) )
89b0: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
89c0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
89d0: 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20  bleSize;.  cbrk 
89e0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
89f0: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63  [hdr+5]);.  memc
8a00: 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d 2c 20  py(&temp[cbrk], 
8a10: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61  &data[cbrk], usa
8a20: 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b 29 3b  bleSize - cbrk);
8a30: 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65  .  cbrk = usable
8a40: 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72  Size;.  iCellFir
8a50: 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  st = cellOffset 
8a60: 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65  + 2*nCell;.  iCe
8a70: 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53  llLast = usableS
8a80: 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69  ize - 4;.  for(i
8a90: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
8aa0: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
8ab0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
8ac0: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
8ad0: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
8ae0: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
8af0: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
8b00: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
8b10: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
8b20: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
8b30: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
8b40: 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c==iCellLast );.
8b50: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
8b60: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
8b70: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
8b80: 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e      /* These con
8b90: 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72  ditions have alr
8ba0: 65 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69  eady been verifi
8bb0: 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50  ed in btreeInitP
8bc0: 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20  age().    ** if 
8bd0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56  SQLITE_ENABLE_OV
8be0: 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43  ERSIZE_CELL_CHEC
8bf0: 4b 20 69 73 20 64 65 66 69 6e 65 64 20 0a 20 20  K is defined .  
8c00: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c    */.    if( pc<
8c10: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
8c20: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
8c30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8c40: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
8c50: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
8c60: 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65   assert( pc>=iCe
8c70: 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69  llFirst && pc<=i
8c80: 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
8c90: 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  size = cellSizeP
8ca0: 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b  tr(pPage, &temp[
8cb0: 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d  pc]);.    cbrk -
8cc0: 3d 20 73 69 7a 65 3b 0a 23 69 66 20 64 65 66 69  = size;.#if defi
8cd0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
8ce0: 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f  E_OVERSIZE_CELL_
8cf0: 43 48 45 43 4b 29 0a 20 20 20 20 69 66 28 20 63  CHECK).    if( c
8d00: 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 29  brk<iCellFirst )
8d10: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
8d20: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
8d30: 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  PT;.    }.#else.
8d40: 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65      if( cbrk<iCe
8d50: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69  llFirst || pc+si
8d60: 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ze>usableSize ){
8d70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
8d80: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
8d90: 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  T;.    }.#endif.
8da0: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
8db0: 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a  +size<=usableSiz
8dc0: 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  e && cbrk>=iCell
8dd0: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
8de0: 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65  tcase( cbrk+size
8df0: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
8e00: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
8e10: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
8e20: 65 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  e );.    memcpy(
8e30: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65  &data[cbrk], &te
8e40: 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20  mp[pc], size);. 
8e50: 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64     put2byte(pAdd
8e60: 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20  r, cbrk);.  }.  
8e70: 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43  assert( cbrk>=iC
8e80: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75  ellFirst );.  pu
8e90: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
8ea0: 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61  +5], cbrk);.  da
8eb0: 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20  ta[hdr+1] = 0;. 
8ec0: 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30   data[hdr+2] = 0
8ed0: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
8ee0: 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  = 0;.  memset(&d
8ef0: 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c  ata[iCellFirst],
8f00: 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69   0, cbrk-iCellFi
8f10: 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rst);.  assert( 
8f20: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
8f30: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
8f40: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
8f50: 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74   cbrk-iCellFirst
8f60: 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  !=pPage->nFree )
8f70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8f80: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
8f90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
8fa0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
8fb0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
8fc0: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
8fd0: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
8fe0: 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73   B-Tree page pas
8ff0: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
9000: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72  rst argument. Wr
9010: 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74  ite into *pIdx t
9020: 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50  he index into pP
9030: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20  age->aData[].** 
9040: 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  of the first byt
9050: 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73  e of allocated s
9060: 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74  pace. Return eit
9070: 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  her SQLITE_OK or
9080: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  .** an error cod
9090: 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54  e (usually SQLIT
90a0: 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a  E_CORRUPT)..**.*
90b0: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61  * The caller gua
90c0: 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65  rantees that the
90d0: 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  re is sufficient
90e0: 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74   space to make t
90f0: 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  he.** allocation
9100: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
9110: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65  might need to de
9120: 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65  fragment in orde
9130: 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c  r to bring.** al
9140: 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65  l the space toge
9150: 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20  ther, however.  
9160: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
9170: 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a  l avoid using.**
9180: 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62   the first two b
9190: 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65  ytes past the ce
91a0: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll pointer area 
91b0: 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79  since presumably
91c0: 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74   this.** allocat
91d0: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64  ion is being mad
91e0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  e in order to in
91f0: 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c  sert a new cell,
9200: 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61   so we will.** a
9210: 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69  lso end up needi
9220: 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f  ng a new cell po
9230: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
9240: 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61   int allocateSpa
9250: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
9260: 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e  e, int nByte, in
9270: 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73  t *pIdx){.  cons
9280: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67  t int hdr = pPag
9290: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  e->hdrOffset;   
92a0: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
92b0: 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  of pPage->hdrOff
92c0: 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  set */.  u8 * co
92d0: 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
92e0: 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a  ->aData;      /*
92f0: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
9300: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
9310: 20 20 69 6e 74 20 6e 46 72 61 67 3b 20 20 20 20    int nFrag;    
9320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9330: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9340: 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64 20 62   of fragmented b
9350: 79 74 65 73 20 6f 6e 20 70 50 61 67 65 20 2a 2f  ytes on pPage */
9360: 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20  .  int top;     
9370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9380: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
9390: 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f   byte of cell co
93a0: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
93b0: 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20  int gap;        
93c0: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
93d0: 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c   gap between cel
93e0: 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63  l pointers and c
93f0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ell content */. 
9400: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
9410: 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75   /* Integer retu
9420: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
9430: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20   usableSize; /* 
9440: 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 74  Usable size of t
9450: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 0a 20 20  he page */.  .  
9460: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
9470: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
9480: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
9490: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
94a0: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  ge->pBt );.  ass
94b0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
94c0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
94d0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
94e0: 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30  assert( nByte>=0
94f0: 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20   );  /* Minimum 
9500: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
9510: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
9520: 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20  e->nFree>=nByte 
9530: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9540: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
9550: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
9560: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
9570: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 61 73 73  sableSize;.  ass
9580: 65 72 74 28 20 6e 42 79 74 65 20 3c 20 75 73 61  ert( nByte < usa
9590: 62 6c 65 53 69 7a 65 2d 38 20 29 3b 0a 0a 20 20  bleSize-8 );..  
95a0: 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72  nFrag = data[hdr
95b0: 2b 37 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  +7];.  assert( p
95c0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
95d0: 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34   == hdr + 12 - 4
95e0: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
95f0: 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63    gap = pPage->c
9600: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
9610: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 74 6f  age->nCell;.  to
9620: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
9630: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69 66  ta[hdr+5]);.  if
9640: 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65 74 75  ( gap>top ) retu
9650: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
9660: 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74 63 61  T_BKPT;.  testca
9670: 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29  se( gap+2==top )
9680: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  ;.  testcase( ga
9690: 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65  p+1==top );.  te
96a0: 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70  stcase( gap==top
96b0: 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72 61 67   );..  if( nFrag
96c0: 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41  >=60 ){.    /* A
96d0: 6c 77 61 79 73 20 64 65 66 72 61 67 6d 65 6e 74  lways defragment
96e0: 20 68 69 67 68 6c 79 20 66 72 61 67 6d 65 6e 74   highly fragment
96f0: 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20  ed pages */.    
9700: 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50  rc = defragmentP
9710: 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
9720: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
9730: 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  rc;.    top = ge
9740: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
9750: 2b 35 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  +5]);.  }else if
9760: 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a  ( gap+2<=top ){.
9770: 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68      /* Search th
9780: 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69  e freelist looki
9790: 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c  ng for a free sl
97a0: 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  ot big enough to
97b0: 20 73 61 74 69 73 66 79 20 0a 20 20 20 20 2a 2a   satisfy .    **
97c0: 20 74 68 65 20 72 65 71 75 65 73 74 2e 20 54 68   the request. Th
97d0: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  e allocation is 
97e0: 6d 61 64 65 20 66 72 6f 6d 20 74 68 65 20 66 69  made from the fi
97f0: 72 73 74 20 66 72 65 65 20 73 6c 6f 74 20 69 6e  rst free slot in
9800: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 69 73   .    ** the lis
9810: 74 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 20  t that is large 
9820: 65 6e 6f 75 67 68 20 74 6f 20 61 63 63 6f 6d 61  enough to accoma
9830: 64 61 74 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a  date it..    */.
9840: 20 20 20 20 69 6e 74 20 70 63 2c 20 61 64 64 72      int pc, addr
9850: 3b 0a 20 20 20 20 66 6f 72 28 61 64 64 72 3d 68  ;.    for(addr=h
9860: 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32  dr+1; (pc = get2
9870: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
9880: 29 29 3e 30 3b 20 61 64 64 72 3d 70 63 29 7b 0a  ))>0; addr=pc){.
9890: 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 3b 20        int size; 
98a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
98b0: 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 20 73  ze of the free s
98c0: 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  lot */.      if(
98d0: 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34   pc>usableSize-4
98e0: 20 7c 7c 20 70 63 3c 61 64 64 72 2b 34 20 29 7b   || pc<addr+4 ){
98f0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
9900: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9910: 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
9920: 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
9930: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
9940: 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e  .      if( size>
9950: 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  =nByte ){.      
9960: 20 20 69 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d    int x = size -
9970: 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20   nByte;.        
9980: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29  testcase( x==4 )
9990: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
99a0: 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20  se( x==3 );.    
99b0: 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b 0a 20      if( x<4 ){. 
99c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f           /* Remo
99d0: 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d  ve the slot from
99e0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20   the free-list. 
99f0: 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65  Update the numbe
9a00: 72 20 6f 66 0a 20 20 20 20 20 20 20 20 20 20 2a  r of.          *
9a10: 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  * fragmented byt
9a20: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
9a30: 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ge. */.         
9a40: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 61 64   memcpy(&data[ad
9a50: 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20  dr], &data[pc], 
9a60: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 61  2);.          da
9a70: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 28 75 38 29  ta[hdr+7] = (u8)
9a80: 28 6e 46 72 61 67 20 2b 20 78 29 3b 0a 20 20 20  (nFrag + x);.   
9a90: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
9aa0: 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65 53  ize+pc > usableS
9ab0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
9ac0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9ad0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
9ae0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9af0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f        /* The slo
9b00: 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65  t remains on the
9b10: 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75   free-list. Redu
9b20: 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61  ce its size to a
9b30: 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20  ccount.         
9b40: 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74   ** for the port
9b50: 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20  ion used by the 
9b60: 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  new allocation. 
9b70: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  */.          put
9b80: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
9b90: 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d  ], x);.        }
9ba0: 0a 20 20 20 20 20 20 20 20 2a 70 49 64 78 20 3d  .        *pIdx =
9bb0: 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20 20 20   pc + x;.       
9bc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9bd0: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
9be0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
9bf0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
9c00: 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70  ere is enough sp
9c10: 61 63 65 20 69 6e 20 74 68 65 20 67 61 70 20 74  ace in the gap t
9c20: 6f 20 73 61 74 69 73 66 79 0a 20 20 2a 2a 20 74  o satisfy.  ** t
9c30: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20  he allocation.  
9c40: 49 66 20 6e 6f 74 2c 20 64 65 66 72 61 67 6d 65  If not, defragme
9c50: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  nt..  */.  testc
9c60: 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65  ase( gap+2+nByte
9c70: 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67  ==top );.  if( g
9c80: 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29  ap+2+nByte>top )
9c90: 7b 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72 61  {.    rc = defra
9ca0: 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29  gmentPage(pPage)
9cb0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
9cc0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f  eturn rc;.    to
9cd0: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
9ce0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
9cf0: 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42 79 74  assert( gap+nByt
9d00: 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a  e<=top );.  }...
9d10: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
9d20: 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61  mory from the ga
9d30: 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  p in between the
9d40: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
9d50: 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ray.  ** and the
9d60: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
9d70: 65 61 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e  ea.  The btreeIn
9d80: 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61  itPage() call ha
9d90: 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76  s already.  ** v
9da0: 61 6c 69 64 61 74 65 64 20 74 68 65 20 66 72 65  alidated the fre
9db0: 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68  elist.  Given th
9dc0: 61 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  at the freelist 
9dd0: 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a  is valid, there.
9de0: 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74    ** is no way t
9df0: 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  hat the allocati
9e00: 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66  on can extend of
9e10: 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
9e20: 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20   page..  ** The 
9e30: 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76  assert() below v
9e40: 65 72 69 66 69 65 73 20 74 68 65 20 70 72 65 76  erifies the prev
9e50: 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20  ious sentence.. 
9e60: 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79   */.  top -= nBy
9e70: 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  te;.  put2byte(&
9e80: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70  data[hdr+5], top
9e90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70  );.  assert( top
9ea0: 2b 6e 42 79 74 65 20 3c 3d 20 70 50 61 67 65 2d  +nByte <= pPage-
9eb0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
9ec0: 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f   );.  *pIdx = to
9ed0: 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  p;.  return SQLI
9ee0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
9ef0: 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e  Return a section
9f00: 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61   of the pPage->a
9f10: 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65  Data to the free
9f20: 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72  list..** The fir
9f30: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e  st byte of the n
9f40: 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73  ew free block is
9f50: 20 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74   pPage->aDisk[st
9f60: 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20  art].** and the 
9f70: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63  size of the bloc
9f80: 6b 20 69 73 20 22 73 69 7a 65 22 20 62 79 74 65  k is "size" byte
9f90: 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66  s..**.** Most of
9fa0: 20 74 68 65 20 65 66 66 6f 72 74 20 68 65 72 65   the effort here
9fb0: 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20   is involved in 
9fc0: 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61 63 65  coalesing adjace
9fd0: 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b  nt.** free block
9fe0: 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  s into a single 
9ff0: 62 69 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a  big free block..
a000: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
a010: 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  eeSpace(MemPage 
a020: 2a 70 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72  *pPage, int star
a030: 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20  t, int size){.  
a040: 69 6e 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e  int addr, pbegin
a050: 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 69 4c 61  , hdr;.  int iLa
a060: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
a070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
a080: 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66  rgest possible f
a090: 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
a0a0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
a0b0: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
a0c0: 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65  ->aData;..  asse
a0d0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
a0e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
a0f0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
a100: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
a110: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
a120: 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65  rt( start>=pPage
a130: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50  ->hdrOffset+6+pP
a140: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
a150: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  e );.  assert( (
a160: 73 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70  start + size)<=p
a170: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
a180: 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  eSize );.  asser
a190: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
a1a0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
a1b0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
a1c0: 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b  sert( size>=0 );
a1d0: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65     /* Minimum ce
a1e0: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
a1f0: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42  .  if( pPage->pB
a200: 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20  t->secureDelete 
a210: 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72  ){.    /* Overwr
a220: 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
a230: 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
a240: 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 75  os when the secu
a250: 72 65 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a  re_delete.    **
a260: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
a270: 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
a280: 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30  (&data[start], 0
a290: 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  , size);.  }..  
a2a0: 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61 63 65  /* Add the space
a2b0: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c   back into the l
a2c0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72  inked list of fr
a2d0: 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65 20  eeblocks.  Note 
a2e0: 74 68 61 74 0a 20 20 2a 2a 20 65 76 65 6e 20 74  that.  ** even t
a2f0: 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c  hough the freebl
a300: 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65  ock list was che
a310: 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69  cked by btreeIni
a320: 74 50 61 67 65 28 29 2c 0a 20 20 2a 2a 20 62 74  tPage(),.  ** bt
a330: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 64 69  reeInitPage() di
a340: 64 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65  d not detect ove
a350: 72 6c 61 70 70 69 6e 67 20 63 65 6c 6c 73 20 6f  rlapping cells o
a360: 72 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b  r.  ** freeblock
a370: 73 20 74 68 61 74 20 6f 76 65 72 6c 61 70 70 65  s that overlappe
a380: 64 20 63 65 6c 6c 73 2e 20 20 20 4e 6f 72 20 64  d cells.   Nor d
a390: 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 77 68  oes it detect wh
a3a0: 65 6e 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  en the.  ** cell
a3b0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 65 78   content area ex
a3c0: 63 65 65 64 73 20 74 68 65 20 76 61 6c 75 65 20  ceeds the value 
a3d0: 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61 64  in the page head
a3e0: 65 72 2e 20 20 49 66 20 74 68 65 73 65 0a 20 20  er.  If these.  
a3f0: 2a 2a 20 73 69 74 75 61 74 69 6f 6e 73 20 61 72  ** situations ar
a400: 69 73 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71  ise, then subseq
a410: 75 65 6e 74 20 69 6e 73 65 72 74 20 6f 70 65 72  uent insert oper
a420: 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 63 6f 72  ations might cor
a430: 72 75 70 74 0a 20 20 2a 2a 20 74 68 65 20 66 72  rupt.  ** the fr
a440: 65 65 6c 69 73 74 2e 20 20 53 6f 20 77 65 20 64  eelist.  So we d
a450: 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20  o need to check 
a460: 66 6f 72 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  for corruption w
a470: 68 69 6c 65 20 73 63 61 6e 6e 69 6e 67 0a 20 20  hile scanning.  
a480: 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ** the freelist.
a490: 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50  .  */.  hdr = pP
a4a0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
a4b0: 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31    addr = hdr + 1
a4c0: 3b 0a 20 20 69 4c 61 73 74 20 3d 20 70 50 61 67  ;.  iLast = pPag
a4d0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
a4e0: 7a 65 20 2d 20 34 3b 0a 20 20 61 73 73 65 72 74  ze - 4;.  assert
a4f0: 28 20 73 74 61 72 74 3c 3d 69 4c 61 73 74 20 29  ( start<=iLast )
a500: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67  ;.  while( (pbeg
a510: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
a520: 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72  ata[addr]))<star
a530: 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b  t && pbegin>0 ){
a540: 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 3c  .    if( pbegin<
a550: 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  addr+4 ){.      
a560: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
a570: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
a580: 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62 65  }.    addr = pbe
a590: 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  gin;.  }.  if( p
a5a0: 62 65 67 69 6e 3e 69 4c 61 73 74 20 29 7b 0a 20  begin>iLast ){. 
a5b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a5c0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
a5d0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62 65   }.  assert( pbe
a5e0: 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67  gin>addr || pbeg
a5f0: 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62  in==0 );.  put2b
a600: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  yte(&data[addr],
a610: 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62   start);.  put2b
a620: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d  yte(&data[start]
a630: 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74  , pbegin);.  put
a640: 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72  2byte(&data[star
a650: 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70  t+2], size);.  p
a660: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50  Page->nFree = pP
a670: 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75 31  age->nFree + (u1
a680: 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f  6)size;..  /* Co
a690: 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20  alesce adjacent 
a6a0: 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20  free blocks */. 
a6b0: 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b   addr = hdr + 1;
a6c0: 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69  .  while( (pbegi
a6d0: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
a6e0: 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a  ta[addr]))>0 ){.
a6f0: 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70      int pnext, p
a700: 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73 73  size, x;.    ass
a710: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
a720: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
a730: 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70  pbegin<=pPage->p
a740: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
a750: 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20   );.    pnext = 
a760: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
a770: 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69  begin]);.    psi
a780: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
a790: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
a7a0: 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b      if( pbegin +
a7b0: 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e   psize + 3 >= pn
a7c0: 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29  ext && pnext>0 )
a7d0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61 67  {.      int frag
a7e0: 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67   = pnext - (pbeg
a7f0: 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20  in+psize);.     
a800: 20 69 66 28 20 28 66 72 61 67 3c 30 29 20 7c 7c   if( (frag<0) ||
a810: 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61 74 61   (frag>(int)data
a820: 5b 68 64 72 2b 37 5d 29 20 29 7b 0a 20 20 20 20  [hdr+7]) ){.    
a830: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a840: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
a850: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 61        }.      da
a860: 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 28 75 38  ta[hdr+7] -= (u8
a870: 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78 20 3d  )frag;.      x =
a880: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
a890: 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20 20 70  pnext]);.      p
a8a0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  ut2byte(&data[pb
a8b0: 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 20  egin], x);.     
a8c0: 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67 65 74   x = pnext + get
a8d0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78  2byte(&data[pnex
a8e0: 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e 3b 0a  t+2]) - pbegin;.
a8f0: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
a900: 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20  data[pbegin+2], 
a910: 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  x);.    }else{. 
a920: 20 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67       addr = pbeg
a930: 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  in;.    }.  }.. 
a940: 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20   /* If the cell 
a950: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67  content area beg
a960: 69 6e 73 20 77 69 74 68 20 61 20 66 72 65 65 62  ins with a freeb
a970: 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e  lock, remove it.
a980: 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68   */.  if( data[h
a990: 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b  dr+1]==data[hdr+
a9a0: 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32  5] && data[hdr+2
a9b0: 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29  ]==data[hdr+6] )
a9c0: 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20  {.    int top;. 
a9d0: 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32     pbegin = get2
a9e0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
a9f0: 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ]);.    memcpy(&
aa00: 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61  data[hdr+1], &da
aa10: 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a  ta[pbegin], 2);.
aa20: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
aa30: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
aa40: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
aa50: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20  a[pbegin+2]);.  
aa60: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
aa70: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20  [hdr+5], top);. 
aa80: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c   }.  assert( sql
aa90: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
aaa0: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
aab0: 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  age) );.  return
aac0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
aad0: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20  *.** Decode the 
aae0: 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20  flags byte (the 
aaf0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
ab00: 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20  e header) for a 
ab10: 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  page.** and init
ab20: 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66  ialize fields of
ab30: 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
ab40: 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67  ucture according
ab50: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ly..**.** Only t
ab60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
ab70: 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75  binations are su
ab80: 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69  pported.  Anythi
ab90: 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ng different.** 
aba0: 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72  indicates a corr
abb0: 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
abc0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  es:.**.**       
abd0: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a    PTF_ZERODATA.*
abe0: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
abf0: 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41  RODATA | PTF_LEA
ac00: 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  F.**         PTF
ac10: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
ac20: 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20  INTKEY.**       
ac30: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
ac40: 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54   PTF_INTKEY | PT
ac50: 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63  F_LEAF.*/.static
ac60: 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73   int decodeFlags
ac70: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
ac80: 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a   int flagByte){.
ac90: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
aca0: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
acb0: 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a  f pPage->pBt */.
acc0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
acd0: 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50  ->hdrOffset==(pP
ace0: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
acf0: 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73  00 : 0) );.  ass
ad00: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
ad10: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
ad20: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
ad30: 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75  pPage->leaf = (u
ad40: 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b  8)(flagByte>>3);
ad50: 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45    assert( PTF_LE
ad60: 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20  AF == 1<<3 );.  
ad70: 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46  flagByte &= ~PTF
ad80: 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e  _LEAF;.  pPage->
ad90: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34  childPtrSize = 4
ada0: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a  -4*pPage->leaf;.
adb0: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
adc0: 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79  Bt;.  if( flagBy
add0: 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54  te==(PTF_LEAFDAT
ade0: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20  A | PTF_INTKEY) 
adf0: 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  ){.    pPage->in
ae00: 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50  tKey = 1;.    pP
ae10: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 70  age->hasData = p
ae20: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
ae30: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
ae40: 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a  = pBt->maxLeaf;.
ae50: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
ae60: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65  cal = pBt->minLe
ae70: 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  af;.  }else if( 
ae80: 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45  flagByte==PTF_ZE
ae90: 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50  RODATA ){.    pP
aea0: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b  age->intKey = 0;
aeb0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44  .    pPage->hasD
aec0: 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ata = 0;.    pPa
aed0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
aee0: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  Bt->maxLocal;.  
aef0: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
af00: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  l = pBt->minLoca
af10: 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  l;.  }else{.    
af20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
af30: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
af40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
af50: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  OK;.}../*.** Ini
af60: 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69  tialize the auxi
af70: 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f  liary informatio
af80: 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f  n for a disk blo
af90: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ck..**.** Return
afa0: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
afb0: 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65  ccess.  If we se
afc0: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
afd0: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74  does.** not cont
afe0: 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  ain a well-forme
aff0: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  d database page,
b000: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a   then return .**
b010: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
b020: 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65    Note that a re
b030: 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f  turn of SQLITE_O
b040: 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75  K does not.** gu
b050: 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
b060: 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f   page is well-fo
b070: 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73  rmed.  It only s
b080: 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20  hows that.** we 
b090: 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74  failed to detect
b0a0: 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e   any corruption.
b0b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
b0c0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d  treeInitPage(Mem
b0d0: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20  Page *pPage){.. 
b0e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b0f0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
b100: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b110: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
b120: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
b130: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
b140: 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
b150: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
b160: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
b170: 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d  assert( pPage ==
b180: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
b190: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
b1a0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
b1b0: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
b1c0: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
b1d0: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
b1e0: 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28  bPage) );..  if(
b1f0: 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20   !pPage->isInit 
b200: 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20  ){.    u16 pc;  
b210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
b220: 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c  ress of a freebl
b230: 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65  ock within pPage
b240: 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20  ->aData[] */.   
b250: 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20   u8 hdr;        
b260: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
b270: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61   beginning of pa
b280: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20  ge header */.   
b290: 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
b2a0: 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20      /* Equal to 
b2b0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
b2c0: 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
b2d0: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  t;        /* The
b2e0: 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72 75   main btree stru
b2f0: 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 75 31 36  cture */.    u16
b300: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
b310: 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61  /* Amount of usa
b320: 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63  ble space on eac
b330: 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31  h page */.    u1
b340: 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  6 cellOffset;   
b350: 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20   /* Offset from 
b360: 73 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f  start of page to
b370: 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e   first cell poin
b380: 74 65 72 20 2a 2f 0a 20 20 20 20 75 31 36 20 6e  ter */.    u16 n
b390: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Free;         /*
b3a0: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
b3b0: 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70  d bytes on the p
b3c0: 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 74  age */.    u16 t
b3d0: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  op;           /*
b3e0: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
b3f0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
b400: 61 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20  area */.    int 
b410: 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f  iCellFirst;    /
b420: 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c  * First allowabl
b430: 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
b440: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  ock offset */.  
b450: 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b    int iCellLast;
b460: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
b470: 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72  sible cell or fr
b480: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
b490: 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61  /..    pBt = pPa
b4a0: 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64  ge->pBt;..    hd
b4b0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
b4c0: 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d  fset;.    data =
b4d0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
b4e0: 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61     if( decodeFla
b4f0: 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68  gs(pPage, data[h
b500: 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51  dr]) ) return SQ
b510: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
b520: 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  T;.    assert( p
b530: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
b540: 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
b550: 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 20  ze<=32768 );.   
b560: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
b570: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
b580: 20 2d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d   - 1;.    pPage-
b590: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
b5a0: 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d      usableSize =
b5b0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
b5c0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c  ;.    pPage->cel
b5d0: 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66  lOffset = cellOf
b5e0: 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20  fset = hdr + 12 
b5f0: 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b  - 4*pPage->leaf;
b600: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
b610: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
b620: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43  );.    pPage->nC
b630: 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26  ell = get2byte(&
b640: 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20  data[hdr+3]);.  
b650: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
b660: 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20  ll>MX_CELL(pBt) 
b670: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d  ){.      /* To m
b680: 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20  any cells for a 
b690: 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68  single page.  Th
b6a0: 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63  e page must be c
b6b0: 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20  orrupt */.      
b6c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
b6d0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
b6e0: 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  }.    testcase( 
b6f0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58  pPage->nCell==MX
b700: 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 0a 20  _CELL(pBt) );.. 
b710: 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65     /* A malforme
b720: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  d database page 
b730: 6d 69 67 68 74 20 63 61 75 73 65 20 75 73 20 74  might cause us t
b740: 6f 20 72 65 61 64 20 70 61 73 74 20 74 68 65 20  o read past the 
b750: 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61  end.    ** of pa
b760: 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  ge when parsing 
b770: 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a  a cell.  .    **
b780: 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
b790: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63  owing block of c
b7a0: 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79  ode checks early
b7b0: 20 74 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c   to see if a cel
b7c0: 6c 20 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a  l extends.    **
b7d0: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
b7e0: 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79   a page boundary
b7f0: 20 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49   and causes SQLI
b800: 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65  TE_CORRUPT to be
b810: 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65   .    ** returne
b820: 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20  d if it does..  
b830: 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69    */.    iCellFi
b840: 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  rst = cellOffset
b850: 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
b860: 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74  l;.    iCellLast
b870: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
b880: 34 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  4;.#if defined(S
b890: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
b8a0: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
b8b0: 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e  ).    {.      in
b8c0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
b8d0: 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68  /* Index into th
b8e0: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
b8f0: 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e  rray */.      in
b900: 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20  t sz;           
b910: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
b920: 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  l */..      if( 
b930: 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69  !pPage->leaf ) i
b940: 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20  CellLast--;.    
b950: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
b960: 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
b970: 0a 20 20 20 20 20 20 20 20 70 63 20 3d 20 67 65  .        pc = ge
b980: 74 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c  t2byte(&data[cel
b990: 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20  lOffset+i*2]);. 
b9a0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
b9b0: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
b9c0: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
b9d0: 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61  ase( pc==iCellLa
b9e0: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  st );.        if
b9f0: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
ba00: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
ba10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
ba20: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
ba30: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
ba40: 20 7d 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20   }.        sz = 
ba50: 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
ba60: 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  e, &data[pc]);. 
ba70: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
ba80: 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69   pc+sz==usableSi
ba90: 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ze );.        if
baa0: 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69  ( pc+sz>usableSi
bab0: 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
bac0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
bad0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
bae0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
baf0: 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
bb00: 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74  leaf ) iCellLast
bb10: 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64  ++;.    }  .#end
bb20: 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75  if..    /* Compu
bb30: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65  te the total fre
bb40: 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70  e space on the p
bb50: 61 67 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20  age */.    pc = 
bb60: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
bb70: 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65  dr+1]);.    nFre
bb80: 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  e = data[hdr+7] 
bb90: 2b 20 74 6f 70 3b 0a 20 20 20 20 77 68 69 6c 65  + top;.    while
bba0: 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  ( pc>0 ){.      
bbb0: 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a  u16 next, size;.
bbc0: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65        if( pc<iCe
bbd0: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
bbe0: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
bbf0: 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 66     /* Start of f
bc00: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66  ree block is off
bc10: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
bc20: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
bc30: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
bc40: 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20   .      }.      
bc50: 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28  next = get2byte(
bc60: 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
bc70: 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74    size = get2byt
bc80: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a  e(&data[pc+2]);.
bc90: 20 20 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e        if( (next>
bca0: 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69  0 && next<=pc+si
bcb0: 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65  ze+3) || pc+size
bcc0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
bcd0: 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62         /* Free b
bce0: 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e  locks must be in
bcf0: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
bd00: 2e 20 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62  . And the last b
bd10: 79 74 65 20 6f 66 0a 09 2a 2a 20 74 68 65 20 66  yte of..** the f
bd20: 72 65 65 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c  ree-block must l
bd30: 69 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ie on the databa
bd40: 73 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  se page.  */.   
bd50: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
bd60: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
bd70: 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20   .      }.      
bd80: 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20  nFree = nFree + 
bd90: 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d  size;.      pc =
bda0: 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20   next;.    }..  
bdb0: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
bdc0: 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69  nt, nFree contai
bdd0: 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  ns the sum of th
bde0: 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
bdf0: 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20  start.    ** of 
be00: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
be10: 20 61 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e   area plus the n
be20: 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62 79  umber of free by
be30: 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a  tes within.    *
be40: 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  * the cell-conte
be50: 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68 69 73  nt area. If this
be60: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
be70: 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65   the usable-size
be80: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  .    ** of the p
be90: 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61  age, then the pa
bea0: 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
beb0: 70 74 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b  pted. This check
bec0: 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72   also.    ** ser
bed0: 76 65 73 20 74 6f 20 76 65 72 69 66 79 20 74 68  ves to verify th
bee0: 61 74 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  at the offset to
bef0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
bf00: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20  e cell-content. 
bf10: 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f     ** area, acco
bf20: 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67  rding to the pag
bf30: 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77  e header, lies w
bf40: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a  ithin the page..
bf50: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
bf60: 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  Free>usableSize 
bf70: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
bf80: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
bf90: 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20  KPT; .    }.    
bfa0: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28  pPage->nFree = (
bfb0: 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65  u16)(nFree - iCe
bfc0: 6c 6c 46 69 72 73 74 29 3b 0a 20 20 20 20 70 50  llFirst);.    pP
bfd0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
bfe0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
bff0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
c000: 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70  * Set up a raw p
c010: 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c  age so that it l
c020: 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61  ooks like a data
c030: 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e  base page holdin
c040: 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e  g.** no entries.
c050: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c060: 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65  zeroPage(MemPage
c070: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
c080: 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  gs){.  unsigned 
c090: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
c0a0: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53  ge->aData;.  BtS
c0b0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
c0c0: 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64  ge->pBt;.  u8 hd
c0d0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
c0e0: 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73  fset;.  u16 firs
c0f0: 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
c100: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
c110: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
c120: 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  age)==pPage->pgn
c130: 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  o );.  assert( s
c140: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
c150: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
c160: 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50  ge) == (void*)pP
c170: 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
c180: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
c190: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
c1a0: 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a  age) == data );.
c1b0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c1c0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
c1d0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
c1e0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
c1f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
c200: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
c210: 0a 20 20 69 66 28 20 70 42 74 2d 3e 73 65 63 75  .  if( pBt->secu
c220: 72 65 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20  reDelete ){.    
c230: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
c240: 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c  ], 0, pBt->usabl
c250: 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20  eSize - hdr);.  
c260: 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20  }.  data[hdr] = 
c270: 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66  (char)flags;.  f
c280: 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b  irst = hdr + 8 +
c290: 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c   4*((flags&PTF_L
c2a0: 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20  EAF)==0 ?1:0);. 
c2b0: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
c2c0: 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64  r+1], 0, 4);.  d
c2d0: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
c2e0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
c2f0: 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73  [hdr+5], pBt->us
c300: 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  ableSize);.  pPa
c310: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d  ge->nFree = pBt-
c320: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69  >usableSize - fi
c330: 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61  rst;.  decodeFla
c340: 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29  gs(pPage, flags)
c350: 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  ;.  pPage->hdrOf
c360: 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70 50  fset = hdr;.  pP
c370: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
c380: 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65  = first;.  pPage
c390: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
c3a0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
c3b0: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
c3c0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
c3d0: 33 32 37 36 38 20 29 3b 0a 20 20 70 50 61 67 65  32768 );.  pPage
c3e0: 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42 74  ->maskPage = pBt
c3f0: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b 0a  ->pageSize - 1;.
c400: 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
c410: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49   0;.  pPage->isI
c420: 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  nit = 1;.}.../*.
c430: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50  ** Convert a DbP
c440: 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  age obtained fro
c450: 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f  m the pager into
c460: 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20   a MemPage used 
c470: 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20  by.** the btree 
c480: 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  layer..*/.static
c490: 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
c4a0: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62  ageFromDbPage(Db
c4b0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50  Page *pDbPage, P
c4c0: 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72  gno pgno, BtShar
c4d0: 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
c4e0: 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65  age *pPage = (Me
c4f0: 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61  mPage*)sqlite3Pa
c500: 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
c510: 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61  age);.  pPage->a
c520: 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61  Data = sqlite3Pa
c530: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
c540: 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44  ge);.  pPage->pD
c550: 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b  bPage = pDbPage;
c560: 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20  .  pPage->pBt = 
c570: 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67  pBt;.  pPage->pg
c580: 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61  no = pgno;.  pPa
c590: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
c5a0: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
c5b0: 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65 74 75   100 : 0;.  retu
c5c0: 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a  rn pPage; .}../*
c5d0: 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
c5e0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20  rom the pager.  
c5f0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
c600: 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
c610: 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
c620: 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
c630: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
c640: 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20   noContent flag 
c650: 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73  is set, it means
c660: 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
c670: 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68  care about.** th
c680: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
c690: 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69   page at this ti
c6a0: 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67  me.  So do not g
c6b0: 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a  o to the disk.**
c6c0: 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f   to fetch the co
c6d0: 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c  ntent.  Just fil
c6e0: 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  l in the content
c6f0: 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20   with zeros for 
c700: 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68  now..** If in th
c710: 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c  e future we call
c720: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
c730: 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67  te() on this pag
c740: 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73  e, that.** means
c750: 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64   we have started
c760: 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64   to be concerned
c770: 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61   about content a
c780: 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72  nd the disk.** r
c790: 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ead should occur
c7a0: 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
c7b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
c7c0: 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74  reeGetPage(.  Bt
c7d0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
c7e0: 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
c7f0: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
c800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
c810: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
c820: 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
c830: 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
c840: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
c850: 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
c860: 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
c870: 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20   noContent      
c880: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61 64    /* Do not load
c890: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 66   page content if
c8a0: 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   true */.){.  in
c8b0: 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a  t rc;.  DbPage *
c8c0: 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65  pDbPage;..  asse
c8d0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
c8e0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
c8f0: 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
c900: 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
c910: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
c920: 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70  no, (DbPage**)&p
c930: 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  DbPage, noConten
c940: 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  t);.  if( rc ) r
c950: 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50  eturn rc;.  *ppP
c960: 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46  age = btreePageF
c970: 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
c980: 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
c990: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c9a0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  K;.}../*.** Retr
c9b0: 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  ieve a page from
c9c0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
c9d0: 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
c9e0: 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a  ed page is not.*
c9f0: 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
ca00: 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74   pager cache ret
ca10: 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61  urn NULL. Initia
ca20: 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
ca30: 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
ca40: 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
ca50: 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f  ts if needed..*/
ca60: 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
ca70: 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70  *btreePageLookup
ca80: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
ca90: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62  Pgno pgno){.  Db
caa0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
cab0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
cac0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
cad0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62  >mutex) );.  pDb
cae0: 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
caf0: 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
cb00: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
cb10: 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
cb20: 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
cb30: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
cb40: 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
cb50: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
cb60: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
cb70: 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
cb80: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
cb90: 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68   in pages. If th
cba0: 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
cbb0: 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74  of.** error, ret
cbc0: 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69  urn ((unsigned i
cbd0: 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69  nt)-1)..*/.stati
cbe0: 63 20 50 67 6e 6f 20 70 61 67 65 72 50 61 67 65  c Pgno pagerPage
cbf0: 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a  count(BtShared *
cc00: 70 42 74 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67  pBt){.  int nPag
cc10: 65 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63  e = -1;.  int rc
cc20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
cc30: 3e 70 50 61 67 65 31 20 29 3b 0a 20 20 72 63 20  >pPage1 );.  rc 
cc40: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
cc50: 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
cc60: 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
cc70: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
cc80: 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3d 3d  TE_OK || nPage==
cc90: 2d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  -1 );.  return (
cca0: 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 7d 0a 0a 2f  Pgno)nPage;.}../
ccb0: 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
ccc0: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61  from the pager a
ccd0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
cce0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
ccf0: 69 73 20 6a 75 73 74 20 61 0a 2a 2a 20 63 6f 6e  is just a.** con
cd00: 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72  venience wrapper
cd10: 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65   around separate
cd20: 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 47   calls to btreeG
cd30: 65 74 50 61 67 65 28 29 20 61 6e 64 20 0a 2a 2a  etPage() and .**
cd40: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
cd50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
cd60: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
cd70: 20 74 68 65 20 76 61 6c 75 65 20 2a 70 70 50 61   the value *ppPa
cd80: 67 65 20 69 73 20 73 65 74 20 74 6f 20 69 73 20  ge is set to is 
cd90: 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a  undefined. It.**
cda0: 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68   may remain unch
cdb0: 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79  anged, or it may
cdc0: 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e   be set to an in
cdd0: 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a  valid value..*/.
cde0: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e  static int getAn
cdf0: 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53  dInitPage(.  BtS
ce00: 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
ce10: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
ce20: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
ce30: 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
ce40: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ce50: 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74   the page to get
ce60: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
ce70: 70 70 50 61 67 65 20 20 20 20 20 2f 2a 20 57 72  ppPage     /* Wr
ce80: 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69  ite the page poi
ce90: 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  nter here */.){.
cea0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 45 53 54    int rc;.  TEST
ceb0: 4f 4e 4c 59 28 20 50 67 6e 6f 20 69 4c 61 73 74  ONLY( Pgno iLast
cec0: 50 67 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  Pg = pagerPageco
ced0: 75 6e 74 28 70 42 74 29 3b 20 29 0a 20 20 61 73  unt(pBt); ).  as
cee0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
cef0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
cf00: 74 65 78 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20  tex) );..  rc = 
cf10: 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
cf20: 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  , pgno, ppPage, 
cf30: 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
cf40: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
cf50: 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
cf60: 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
cf70: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
cf80: 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
cf90: 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
cfa0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
cfb0: 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
cfc0: 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20 77 61  d page number wa
cfd0: 73 20 65 69 74 68 65 72 20 30 20 6f 72 20 67 72  s either 0 or gr
cfe0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 70  eater than the p
cff0: 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  age.  ** number 
d000: 6f 66 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  of the last page
d010: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
d020: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
d030: 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 0a 20 20  should return.  
d040: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
d050: 54 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  T or some other 
d060: 65 72 72 6f 72 20 28 69 2e 65 2e 20 53 51 4c 49  error (i.e. SQLI
d070: 54 45 5f 46 55 4c 4c 29 2e 20 43 68 65 63 6b 20  TE_FULL). Check 
d080: 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69  that this.  ** i
d090: 73 20 74 68 65 20 63 61 73 65 2e 20 20 2a 2f 0a  s the case.  */.
d0a0: 20 20 61 73 73 65 72 74 28 20 28 70 67 6e 6f 3e    assert( (pgno>
d0b0: 30 20 26 26 20 70 67 6e 6f 3c 3d 69 4c 61 73 74  0 && pgno<=iLast
d0c0: 50 67 29 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54  Pg) || rc!=SQLIT
d0d0: 45 5f 4f 4b 20 29 3b 0a 20 20 74 65 73 74 63 61  E_OK );.  testca
d0e0: 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20  se( pgno==0 );. 
d0f0: 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d   testcase( pgno=
d100: 3d 69 4c 61 73 74 50 67 20 29 3b 0a 0a 20 20 72  =iLastPg );..  r
d110: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
d120: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d  ** Release a Mem
d130: 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75  Page.  This shou
d140: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  ld be called onc
d150: 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72  e for each prior
d160: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65  .** call to btre
d170: 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  eGetPage..*/.sta
d180: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
d190: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
d1a0: 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67  age){.  if( pPag
d1b0: 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
d1c0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
d1d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
d1e0: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61  ge->pBt );.    a
d1f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
d200: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
d210: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
d220: 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
d230: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d240: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
d250: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
d260: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
d270: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
d280: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
d290: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
d2a0: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
d2b0: 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
d2c0: 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
d2d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20  }../*.** During 
d2e0: 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e  a rollback, when
d2f0: 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61   the pager reloa
d300: 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ds information i
d310: 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a  nto the cache.**
d320: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63   so that the cac
d330: 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74  he is restored t
d340: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
d350: 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72  tate at the star
d360: 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e  t of.** the tran
d370: 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63  saction, for eac
d380: 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20  h page restored 
d390: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
d3a0: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
d3b0: 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73  is routine needs
d3c0: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78   to reset the ex
d3d0: 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e  tra data section
d3e0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
d3f0: 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67  he.** page to ag
d400: 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
d410: 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73  tored data..*/.s
d420: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52  tatic void pageR
d430: 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44  einit(DbPage *pD
d440: 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ata){.  MemPage 
d450: 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20  *pPage;.  pPage 
d460: 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
d470: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
d480: 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65  a(pData);.  asse
d490: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
d4a0: 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
d4b0: 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ta)>0 );.  if( p
d4c0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
d4d0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
d4e0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
d4f0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
d500: 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
d510: 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20  isInit = 0;.    
d520: 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
d530: 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
d540: 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f  ta)>1 ){.      /
d550: 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f  * pPage might no
d560: 74 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67  t be a btree pag
d570: 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20  e;  it might be 
d580: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
d590: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72  .      ** or ptr
d5a0: 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72  map page or a fr
d5b0: 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f  ee page.  In tho
d5c0: 73 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f  se cases, the fo
d5d0: 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a  llowing.      **
d5e0: 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e   call to btreeIn
d5f0: 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69  itPage() will li
d600: 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49  kely return SQLI
d610: 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20  TE_CORRUPT..    
d620: 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d    ** But no harm
d630: 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73   is done by this
d640: 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72  .  And it is ver
d650: 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  y important that
d660: 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49  .      ** btreeI
d670: 6e 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c  nitPage() be cal
d680: 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72  led on every btr
d690: 65 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61  ee page so we ma
d6a0: 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ke.      ** the 
d6b0: 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70  call for every p
d6c0: 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69  age that comes i
d6d0: 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67  n for re-initing
d6e0: 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65  . */.      btree
d6f0: 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
d700: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
d710: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  .** Invoke the b
d720: 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20  usy handler for 
d730: 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  a btree..*/.stat
d740: 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f  ic int btreeInvo
d750: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f  keBusyHandler(vo
d760: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53  id *pArg){.  BtS
d770: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74  hared *pBt = (Bt
d780: 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20  Shared*)pArg;.  
d790: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20  assert( pBt->db 
d7a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
d7b0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
d7c0: 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  pBt->db->mutex) 
d7d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
d7e0: 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
d7f0: 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62  dler(&pBt->db->b
d800: 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a  usyHandler);.}..
d810: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74  /*.** Open a dat
d820: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
d830: 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  ** zFilename is 
d840: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
d850: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
d860: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
d870: 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61  NULL.** a new da
d880: 74 61 62 61 73 65 20 77 69 74 68 20 61 20 72 61  tabase with a ra
d890: 6e 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72 65  ndom name is cre
d8a0: 61 74 65 64 2e 20 20 54 68 69 73 20 72 61 6e 64  ated.  This rand
d8b0: 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61  omly named.** da
d8c0: 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c  tabase file will
d8d0: 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e   be deleted when
d8e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
d8f0: 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
d900: 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
d910: 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
d920: 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  en an in-memory 
d930: 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
d940: 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61  ted.** that is a
d950: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73  utomatically des
d960: 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69  troyed when it i
d970: 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
d980: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
d990: 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  is already opene
d9a0: 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  d in the same da
d9b0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
d9c0: 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20  n.** and we are 
d9d0: 69 6e 20 73 68 61 72 65 64 20 63 61 63 68 65 20  in shared cache 
d9e0: 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f  mode, then the o
d9f0: 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69  pen will fail wi
da00: 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  th an.** SQLITE_
da10: 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72  CONSTRAINT error
da20: 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c  .  We cannot all
da30: 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42  ow two or more B
da40: 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63  tShared.** objec
da50: 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ts in the same d
da60: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
da70: 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73  on since doing s
da80: 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74  o will lead.** t
da90: 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20  o problems with 
daa0: 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  locking..*/.int 
dab0: 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
dac0: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
dad0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e  zFilename,  /* N
dae0: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
daf0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42  containing the B
db00: 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f  Tree database */
db10: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
db20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
db30: 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
db40: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74  e handle */.  Bt
db50: 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20  ree **ppBtree,  
db60: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
db70: 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62   to new Btree ob
db80: 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72  ject written her
db90: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
dba0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
dbb0: 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  * Options */.  i
dbc0: 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
dbd0: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
dbe0: 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
dbf0: 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
dc00: 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71  pen() */.){.  sq
dc10: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b  lite3_vfs *pVfs;
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dc30: 54 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 66  The VFS to use f
dc40: 6f 72 20 74 68 69 73 20 62 74 72 65 65 20 2a 2f  or this btree */
dc50: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
dc60: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
dc70: 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74    /* Shared part
dc80: 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74   of btree struct
dc90: 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  ure */.  Btree *
dca0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
dcb0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
dcc0: 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  e to return */. 
dcd0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
dce0: 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20  mutexOpen = 0;  
dcf0: 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72 61  /* Prevents a ra
dd00: 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69  ce condition. Ti
dd10: 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20  cket #3537 */.  
dd20: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
dd30: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  OK;            /
dd40: 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72  * Result code fr
dd50: 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
dd60: 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76   */.  u8 nReserv
dd70: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
dd80: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20       /* Byte of 
dd90: 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20  unused space on 
dda0: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75  each page */.  u
ddb0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62  nsigned char zDb
ddc0: 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a  Header[100];  /*
ddd0: 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65 72   Database header
dde0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f   content */..  /
ddf0: 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62  * Set the variab
de00: 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72  le isMemdb to tr
de10: 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ue for an in-mem
de20: 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72  ory database, or
de30: 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72   .  ** false for
de40: 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61   a file-based da
de50: 74 61 62 61 73 65 2e 20 54 68 69 73 20 73 79 6d  tabase. This sym
de60: 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71 75  bol is only requ
de70: 69 72 65 64 20 69 66 0a 20 20 2a 2a 20 65 69 74  ired if.  ** eit
de80: 68 65 72 20 6f 66 20 74 68 65 20 73 68 61 72 65  her of the share
de90: 64 2d 64 61 74 61 20 6f 72 20 61 75 74 6f 76 61  d-data or autova
dea0: 63 75 75 6d 20 66 65 61 74 75 72 65 73 20 61 72  cuum features ar
deb0: 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a  e compiled .  **
dec0: 20 69 6e 74 6f 20 74 68 65 20 6c 69 62 72 61 72   into the librar
ded0: 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  y..  */.#if !def
dee0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
def0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 7c  _SHARED_CACHE) |
df00: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
df10: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
df20: 4d 29 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49  M).  #ifdef SQLI
df30: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
df40: 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  .    const int i
df50: 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65  sMemdb = 0;.  #e
df60: 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  lse.    const in
df70: 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c  t isMemdb = zFil
df80: 65 6e 61 6d 65 20 26 26 20 21 73 74 72 63 6d 70  ename && !strcmp
df90: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65  (zFilename, ":me
dfa0: 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69  mory:");.  #endi
dfb0: 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  f.#endif..  asse
dfc0: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61  rt( db!=0 );.  a
dfd0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
dfe0: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
dff0: 74 65 78 29 20 29 3b 0a 0a 20 20 70 56 66 73 20  tex) );..  pVfs 
e000: 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 70 20  = db->pVfs;.  p 
e010: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
e020: 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65  ero(sizeof(Btree
e030: 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  ));.  if( !p ){.
e040: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e050: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
e060: 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
e070: 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20  S_NONE;.  p->db 
e080: 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51  = db;.#ifndef SQ
e090: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
e0a0: 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b  _CACHE.  p->lock
e0b0: 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  .pBtree = p;.  p
e0c0: 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20  ->lock.iTable = 
e0d0: 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  1;.#endif..#if !
e0e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
e0f0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
e100: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
e110: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
e120: 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74  ).  /*.  ** If t
e130: 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20 63  his Btree is a c
e140: 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68 61  andidate for sha
e150: 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20 74  red cache, try t
e160: 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65  o find an.  ** e
e170: 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65 64  xisting BtShared
e180: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65 20   object that we 
e190: 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20  can share with. 
e1a0: 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d 64   */.  if( isMemd
e1b0: 62 3d 3d 30 20 26 26 20 7a 46 69 6c 65 6e 61 6d  b==0 && zFilenam
e1c0: 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
e1d0: 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73  ] ){.    if( vfs
e1e0: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
e1f0: 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20  PEN_SHAREDCACHE 
e200: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75  ){.      int nFu
e210: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66  llPathname = pVf
e220: 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
e230: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75  .      char *zFu
e240: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
e250: 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c  ite3Malloc(nFull
e260: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
e270: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
e280: 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20  mutexShared;.   
e290: 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
e2a0: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a   1;.      if( !z
e2b0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
e2c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
e2d0: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
e2e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
e2f0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
e300: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 75 6c      sqlite3OsFul
e310: 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
e320: 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c  zFilename, nFull
e330: 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Pathname, zFullP
e340: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
e350: 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69  mutexOpen = sqli
e360: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
e370: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
e380: 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73  C_OPEN);.      s
e390: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
e3a0: 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  er(mutexOpen);. 
e3b0: 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64       mutexShared
e3c0: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
e3d0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
e3e0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
e3f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
e400: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
e410: 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
e420: 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42  for(pBt=GLOBAL(B
e430: 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
e440: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
e450: 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e  ; pBt; pBt=pBt->
e460: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
e470: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65  assert( pBt->nRe
e480: 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  f>0 );.        i
e490: 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75  f( 0==strcmp(zFu
e4a0: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69  llPathname, sqli
e4b0: 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65  te3PagerFilename
e4c0: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 0a 20  (pBt->pPager)). 
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4e0: 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56  && sqlite3PagerV
e4f0: 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  fs(pBt->pPager)=
e500: 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20  =pVfs ){.       
e510: 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
e520: 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62        for(iDb=db
e530: 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b  ->nDb-1; iDb>=0;
e540: 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20   iDb--){.       
e550: 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69       Btree *pExi
e560: 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b  sting = db->aDb[
e570: 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  iDb].pBt;.      
e580: 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74        if( pExist
e590: 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67  ing && pExisting
e5a0: 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20  ->pBt==pBt ){.  
e5b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
e5c0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
e5d0: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
e5e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
e5f0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
e600: 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
e610: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e620: 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
e630: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
e640: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
e650: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
e660: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e670: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
e680: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e690: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e6a0: 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
e6b0: 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e            pBt->n
e6c0: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
e6d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
e6e0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
e6f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
e700: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
e710: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
e720: 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
e730: 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  me);.    }.#ifde
e740: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
e750: 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f     else{.      /
e760: 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c  * In debug mode,
e770: 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72   we mark all per
e780: 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65  sistent database
e790: 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20  s as sharable.  
e7a0: 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e      ** even when
e7b0: 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20   they are not.  
e7c0: 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74  This exercises t
e7d0: 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20  he locking code 
e7e0: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76  and.      ** giv
e7f0: 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e  es more opportun
e800: 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28  ity for asserts(
e810: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
e820: 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73  ld()).      ** s
e830: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e  tatements to fin
e840: 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65  d locking proble
e850: 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ms..      */.   
e860: 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
e870: 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
e880: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
e890: 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
e8a0: 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  /*.    ** The fo
e8b0: 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
e8c0: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73  make sure that s
e8d0: 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62  tructures used b
e8e0: 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a  y the btree are.
e8f0: 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74      ** the right
e900: 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20   size.  This is 
e910: 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74  to guard against
e920: 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68   size changes th
e930: 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a  at result.    **
e940: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
e950: 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61  on a different a
e960: 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20  rchitecture..   
e970: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
e980: 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c  sizeof(i64)==8 |
e990: 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34  | sizeof(i64)==4
e9a0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
e9b0: 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c  sizeof(u64)==8 |
e9c0: 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34  | sizeof(u64)==4
e9d0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
e9e0: 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29  sizeof(u32)==4 )
e9f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
ea00: 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a  zeof(u16)==2 );.
ea10: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
ea20: 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20  of(Pgno)==4 );. 
ea30: 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69   .    pBt = sqli
ea40: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
ea50: 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20  izeof(*pBt) );. 
ea60: 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b     if( pBt==0 ){
ea70: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
ea80: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
ea90: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
eaa0: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
eab0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
eac0: 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d  Open(pVfs, &pBt-
ead0: 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61  >pPager, zFilena
eae0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
eaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58                EX
eb00: 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c  TRA_SIZE, flags,
eb10: 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52   vfsFlags, pageR
eb20: 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20  einit);.    if( 
eb30: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
eb40: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
eb50: 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
eb60: 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
eb70: 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
eb80: 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
eb90: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
eba0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
ebb0: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
ebc0: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
ebd0: 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64  .    pBt->db = d
ebe0: 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  b;.    sqlite3Pa
ebf0: 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
ec00: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62  r(pBt->pPager, b
ec10: 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
ec20: 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20  ndler, pBt);.   
ec30: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
ec40: 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73   .    pBt->pCurs
ec50: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  or = 0;.    pBt-
ec60: 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
ec70: 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d   pBt->readOnly =
ec80: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
ec90: 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61  eadonly(pBt->pPa
eca0: 67 65 72 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  ger);.#ifdef SQL
ecb0: 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
ecc0: 45 0a 20 20 20 20 70 42 74 2d 3e 73 65 63 75 72  E.    pBt->secur
ecd0: 65 44 65 6c 65 74 65 20 3d 20 31 3b 0a 23 65 6e  eDelete = 1;.#en
ece0: 64 69 66 0a 20 20 20 20 70 42 74 2d 3e 70 61 67  dif.    pBt->pag
ecf0: 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65  eSize = get2byte
ed00: 28 26 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 29  (&zDbHeader[16])
ed10: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
ed20: 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70  ageSize<512 || p
ed30: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c  Bt->pageSize>SQL
ed40: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
ed50: 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28  E.         || ((
ed60: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29  pBt->pageSize-1)
ed70: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21  &pBt->pageSize)!
ed80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  =0 ){.      pBt-
ed90: 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23  >pageSize = 0;.#
eda0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
edb0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
edc0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61      /* If the ma
edd0: 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72  gic name ":memor
ede0: 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20  y:" will create 
edf0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
ee00: 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20  abase, then.    
ee10: 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61    ** leave the a
ee20: 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61  utoVacuum mode a
ee30: 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f  t 0 (do not auto
ee40: 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69  -vacuum), even i
ee50: 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
ee60: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
ee70: 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e  CUUM is true. On
ee80: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
ee90: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
eea0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
eeb0: 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e  B has been defin
eec0: 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72  ed, then ":memor
eed0: 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20  y:" is just a.  
eee0: 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66      ** regular f
eef0: 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ile-name. In thi
ef00: 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d  s case the auto-
ef10: 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61  vacuum applies a
ef20: 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20  s per normal..  
ef30: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
ef40: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69   zFilename && !i
ef50: 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
ef60: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
ef70: 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
ef80: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f  ULT_AUTOVACUUM ?
ef90: 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20   1 : 0);.       
efa0: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
efb0: 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
efc0: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32  LT_AUTOVACUUM==2
efd0: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
efe0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
eff0: 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20  nReserve = 0;.  
f000: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
f010: 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61  Reserve = zDbHea
f020: 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70  der[20];.      p
f030: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
f040: 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  d = 1;.#ifndef S
f050: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
f060: 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d  ACUUM.      pBt-
f070: 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
f080: 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
f090: 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  er[36 + 4*4])?1:
f0a0: 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69  0);.      pBt->i
f0b0: 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
f0c0: 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
f0d0: 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
f0e0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
f0f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
f100: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
f110: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
f120: 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
f130: 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20  serve);.    if( 
f140: 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f  rc ) goto btree_
f150: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42  open_out;.    pB
f160: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
f170: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
f180: 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
f190: 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65  sert( (pBt->page
f1a0: 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20  Size & 7)==0 ); 
f1b0: 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
f1c0: 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65  ment of pageSize
f1d0: 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66   */.   .#if !def
f1e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
f1f0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
f200: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
f210: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
f220: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
f230: 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  w BtShared objec
f240: 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  t to the linked 
f250: 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74  list sharable Bt
f260: 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a  Shareds..    */.
f270: 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61      if( p->shara
f280: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ble ){.      sql
f290: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
f2a0: 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70  xShared;.      p
f2b0: 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Bt->nRef = 1;.  
f2c0: 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20      mutexShared 
f2d0: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
f2e0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
f2f0: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
f300: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
f310: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
f320: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
f330: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29  fig.bCoreMutex )
f340: 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d  {.        pBt->m
f350: 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75  utex = sqlite3Mu
f360: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
f370: 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
f380: 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75       if( pBt->mu
f390: 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
f3a0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f3b0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
f3c0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
f3d0: 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
f3e0: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
f3f0: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
f400: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
f410: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
f420: 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
f430: 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74        pBt->pNext
f440: 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
f450: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
f460: 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
f470: 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
f480: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
f490: 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
f4a0: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
f4b0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
f4c0: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d  exShared);.    }
f4d0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66  .#endif.  }..#if
f4e0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
f4f0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
f500: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
f510: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
f520: 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  IO).  /* If the 
f530: 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61  new Btree uses a
f540: 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61   sharable pBtSha
f550: 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74  red, then link t
f560: 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65  he new.  ** Btre
f570: 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20  e into the list 
f580: 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20  of all sharable 
f590: 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73  Btrees for the s
f5a0: 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ame connection..
f5b0: 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73    ** The list is
f5c0: 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69   kept in ascendi
f5d0: 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20  ng order by pBt 
f5e0: 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  address..  */.  
f5f0: 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
f600: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
f610: 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20    Btree *pSib;. 
f620: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
f630: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
f640: 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64     if( (pSib = d
f650: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d  b->aDb[i].pBt)!=
f660: 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61  0 && pSib->shara
f670: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ble ){.        w
f680: 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65  hile( pSib->pPre
f690: 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62  v ){ pSib = pSib
f6a0: 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20  ->pPrev; }.     
f6b0: 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53     if( p->pBt<pS
f6c0: 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  ib->pBt ){.     
f6d0: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
f6e0: 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pSib;.          
f6f0: 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  p->pPrev = 0;.  
f700: 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50          pSib->pP
f710: 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rev = p;.       
f720: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f730: 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
f740: 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e  Next && pSib->pN
f750: 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20  ext->pBt<p->pBt 
f760: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
f770: 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78  Sib = pSib->pNex
f780: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
f790: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
f7a0: 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  t = pSib->pNext;
f7b0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
f7c0: 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  rev = pSib;.    
f7d0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65        if( p->pNe
f7e0: 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  xt ){.          
f7f0: 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
f800: 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20  v = p;.         
f810: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69   }.          pSi
f820: 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  b->pNext = p;.  
f830: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f840: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
f850: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
f860: 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a    *ppBtree = p;.
f870: 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a  .btree_open_out:
f880: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
f890: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
f8a0: 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
f8b0: 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  er ){.      sqli
f8c0: 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42  te3PagerClose(pB
f8d0: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
f8e0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
f8f0: 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ee(pBt);.    sql
f900: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
f910: 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a    *ppBtree = 0;.
f920: 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f    }.  if( mutexO
f930: 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  pen ){.    asser
f940: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
f950: 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29  _held(mutexOpen)
f960: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
f970: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
f980: 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65  xOpen);.  }.  re
f990: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f9a0: 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
f9b0: 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
f9c0: 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20  unter.  When it 
f9d0: 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a  reaches zero,.**
f9e0: 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68   remove the BtSh
f9f0: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66  ared structure f
fa00: 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20  rom the sharing 
fa10: 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  list.  Return.**
fa20: 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53   true if the BtS
fa30: 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
fa40: 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20  er reaches zero 
fa50: 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61  and return.** fa
fa60: 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69  lse if it is sti
fa70: 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a  ll positive..*/.
fa80: 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76  static int remov
fa90: 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
faa0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
fab0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
fac0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
fad0: 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  E.  sqlite3_mute
fae0: 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20 42 74  x *pMaster;.  Bt
faf0: 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20  Shared *pList;. 
fb00: 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30   int removed = 0
fb10: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
fb20: 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65  ite3_mutex_nothe
fb30: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
fb40: 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 73 71  ;.  pMaster = sq
fb50: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
fb60: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
fb70: 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 73  TIC_MASTER);.  s
fb80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
fb90: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70  er(pMaster);.  p
fba0: 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  Bt->nRef--;.  if
fbb0: 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pBt->nRef<=0 )
fbc0: 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c  {.    if( GLOBAL
fbd0: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
fbe0: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
fbf0: 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  t)==pBt ){.     
fc00: 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
fc10: 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
fc20: 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d  acheList) = pBt-
fc30: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
fc40: 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d  e{.      pList =
fc50: 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
fc60: 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
fc70: 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
fc80: 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70   while( ALWAYS(p
fc90: 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e  List) && pList->
fca0: 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20  pNext!=pBt ){.  
fcb0: 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73        pList=pLis
fcc0: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
fcd0: 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  }.      if( ALWA
fce0: 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20  YS(pList) ){.   
fcf0: 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78       pList->pNex
fd00: 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  t = pBt->pNext;.
fd10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
fd20: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
fd30: 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20  EADSAFE ){.     
fd40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
fd50: 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b  ree(pBt->mutex);
fd60: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76  .    }.    remov
fd70: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71  ed = 1;.  }.  sq
fd80: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
fd90: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  e(pMaster);.  re
fda0: 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65  turn removed;.#e
fdb0: 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  lse.  return 1;.
fdc0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
fdd0: 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70  Make sure pBt->p
fde0: 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20  TmpSpace points 
fdf0: 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  to an allocation
fe00: 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f   of .** MX_CELL_
fe10: 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73 2e  SIZE(pBt) bytes.
fe20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
fe30: 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
fe40: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
fe50: 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54  {.  if( !pBt->pT
fe60: 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70  mpSpace ){.    p
fe70: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
fe80: 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
fe90: 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  c( pBt->pageSize
fea0: 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   );.  }.}../*.**
feb0: 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70   Free the pBt->p
fec0: 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  TmpSpace allocat
fed0: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ion.*/.static vo
fee0: 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63 65  id freeTempSpace
fef0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
ff00: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72  .  sqlite3PageFr
ff10: 65 65 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ee( pBt->pTmpSpa
ff20: 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70 54 6d 70  ce);.  pBt->pTmp
ff30: 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  Space = 0;.}../*
ff40: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65  .** Close an ope
ff50: 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  n database and i
ff60: 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75  nvalidate all cu
ff70: 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rsors..*/.int sq
ff80: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
ff90: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
ffa0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
ffb0: 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  pBt;.  BtCursor 
ffc0: 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f  *pCur;..  /* Clo
ffd0: 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f  se all cursors o
ffe0: 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68  pened via this h
fff0: 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73  andle.  */.  ass
10000 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
10010 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
10020 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
10030 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
10040 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70  .  pCur = pBt->p
10050 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28  Cursor;.  while(
10060 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43   pCur ){.    BtC
10070 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43  ursor *pTmp = pC
10080 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70  ur;.    pCur = p
10090 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
100a0 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65  if( pTmp->pBtree
100b0 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==p ){.      sql
100c0 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
100d0 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20  rsor(pTmp);.    
100e0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c  }.  }..  /* Roll
100f0 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20  back any active 
10100 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
10110 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20  free the handle 
10120 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20  structure..  ** 
10130 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  The call to sqli
10140 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
10150 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62  () drops any tab
10160 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  le-locks held by
10170 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c  .  ** this handl
10180 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
10190 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
101a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
101b0 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a  eLeave(p);..  /*
101c0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74   If there are st
101d0 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61  ill other outsta
101e0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
101f0 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62   to the shared-b
10200 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74  tree.  ** struct
10210 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e  ure, return now.
10220 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   The remainder o
10230 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
10240 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70   cleans .  ** up
10250 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
10260 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
10270 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
10280 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d  =0 && p->locked=
10290 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e  =0 );.  if( !p->
102a0 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f  sharable || remo
102b0 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
102c0 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a  t(pBt) ){.    /*
102d0 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c   The pBt is no l
102e0 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61  onger on the sha
102f0 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65  ring list, so we
10300 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20   can access.    
10310 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61  ** it without ha
10320 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65  ving to hold the
10330 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20   mutex..    **. 
10340 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20     ** Clean out 
10350 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42  and delete the B
10360 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a  tShared object..
10370 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
10380 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
10390 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
103a0 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
103b0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
103c0 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
103d0 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61   && pBt->pSchema
103e0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78   ){.      pBt->x
103f0 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e  FreeSchema(pBt->
10400 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
10410 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
10420 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pBt->pSchema);.
10430 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
10440 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
10450 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
10460 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
10470 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
10480 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70  ACHE.  assert( p
10490 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
104a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
104b0 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
104c0 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d  f( p->pPrev ) p-
104d0 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
104e0 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20  p->pNext;.  if( 
104f0 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e  p->pNext ) p->pN
10500 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
10510 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20  pPrev;.#endif.. 
10520 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
10530 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
10540 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
10550 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20  hange the limit 
10560 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
10570 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69   pages allowed i
10580 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a  n the cache..**.
10590 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** The maximum n
105a0 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70  umber of cache p
105b0 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74  ages is set to t
105c0 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76  he absolute.** v
105d0 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20  alue of mxPage. 
105e0 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65   If mxPage is ne
105f0 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65  gative, the page
10600 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74  r will.** operat
10610 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79  e asynchronously
10620 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73   - it will not s
10630 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28  top to do fsync(
10640 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20  )s.** to insure 
10650 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
10660 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66  to the disk surf
10670 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f  ace before.** co
10680 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73  ntinuing.  Trans
10690 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f  actions still wo
106a0 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75  rk if synchronou
106b0 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64  s is off,.** and
106c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
106d0 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65  nnot be corrupte
106e0 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61  d if this progra
106f0 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42  m.** crashes.  B
10700 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74  ut if the operat
10710 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68  ing system crash
10720 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a  es or there is.*
10730 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65  * an abrupt powe
10740 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73  r failure when s
10750 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66  ynchronous is of
10760 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  f, the database.
10770 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74  ** could be left
10780 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
10790 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65  ent and unrecove
107a0 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20  rable state..** 
107b0 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  Synchronous is o
107c0 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20  n by default so 
107d0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
107e0 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f  ion is not.** no
107f0 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a  rmally a worry..
10800 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
10810 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
10820 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
10830 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Page){.  BtShare
10840 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
10850 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10860 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
10870 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
10880 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
10890 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
108a0 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
108b0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  e(pBt->pPager, m
108c0 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
108d0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
108e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
108f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
10900 6e 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61  nge the way data
10910 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69   is synced to di
10920 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  sk in order to i
10930 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65  ncrease or decre
10940 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20  ase.** how well 
10950 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73  the database res
10960 69 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20  ists damage due 
10970 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e  to OS crashes an
10980 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  d power.** failu
10990 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73  res.  Level 1 is
109a0 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79   the same as asy
109b0 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79  nchronous (no sy
109c0 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a  ncs() occur and.
109d0 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69  ** there is a hi
109e0 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  gh probability o
109f0 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c  f damage)  Level
10a00 20 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c   2 is the defaul
10a10 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20  t.  There.** is 
10a20 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e  a very low but n
10a30 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c  on-zero probabil
10a40 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20  ity of damage.  
10a50 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20  Level 3 reduces 
10a60 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69  the.** probabili
10a70 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20  ty of damage to 
10a80 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69  near zero but wi
10a90 74 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f  th a write perfo
10aa0 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e  rmance reduction
10ab0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
10ac0 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
10ad0 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74  RAGMAS.int sqlit
10ae0 65 33 42 74 72 65 65 53 65 74 53 61 66 65 74 79  e3BtreeSetSafety
10af0 4c 65 76 65 6c 28 42 74 72 65 65 20 2a 70 2c 20  Level(Btree *p, 
10b00 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66  int level, int f
10b10 75 6c 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53 68  ullSync){.  BtSh
10b20 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
10b30 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
10b40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10b50 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
10b60 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
10b70 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
10b80 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74  te3PagerSetSafet
10b90 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67  yLevel(pBt->pPag
10ba0 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53  er, level, fullS
10bb0 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ync);.  sqlite3B
10bc0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
10bd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10be0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
10bf0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
10c00 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65 65   the given btree
10c10 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65 74   is set to safet
10c20 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f  y level 1.  In o
10c30 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72  ther.** words, r
10c40 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f  eturn TRUE if no
10c50 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f   sync() occurs o
10c60 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73  n the disk files
10c70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10c80 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
10c90 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  d(Btree *p){.  B
10ca0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
10cb0 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ->pBt;.  int rc;
10cc0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10cd0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
10ce0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20  >db->mutex) );  
10cf0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
10d00 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
10d10 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  t( pBt && pBt->p
10d20 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20  Pager );.  rc = 
10d30 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
10d40 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nc(pBt->pPager);
10d50 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
10d60 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
10d70 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  n rc;.}..#if !de
10d80 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
10d90 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
10da0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
10db0 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
10dc0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
10dd0 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20  e default pages 
10de0 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d  size and the num
10df0 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
10e00 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a  bytes per page..
10e10 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61  ** Or, if the pa
10e20 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65  ge size has alre
10e30 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20  ady been fixed, 
10e40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
10e50 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f  ADONLY .** witho
10e60 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74  ut changing anyt
10e70 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hing..**.** The 
10e80 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62  page size must b
10e90 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62  e a power of 2 b
10ea0 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
10eb0 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61  5536.  If the pa
10ec0 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c  ge.** size suppl
10ed0 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65  ied does not mee
10ee0 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  t this constrain
10ef0 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  t then the page 
10f00 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63  size is not.** c
10f10 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61  hanged..**.** Pa
10f20 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e  ge sizes are con
10f30 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61  strained to be a
10f40 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f   power of two so
10f50 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e   that the region
10f60 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62  .** of the datab
10f70 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  ase file used fo
10f80 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e  r locking (begin
10f90 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f  ning at PENDING_
10fa0 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72  BYTE,.** the fir
10fb0 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
10fc0 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30   1GB boundary, 0
10fd0 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73  x40000000) needs
10fe0 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20   to occur.** at 
10ff0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
11000 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
11010 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73  f parameter nRes
11020 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61  erve is less tha
11030 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
11040 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
11050 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72  ved.** bytes per
11060 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e   page is left un
11070 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
11080 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68  f the iFix!=0 th
11090 65 6e 20 74 68 65 20 70 61 67 65 53 69 7a 65 46  en the pageSizeF
110a0 69 78 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  ixed flag is set
110b0 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67   so that the pag
110c0 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75  e size.** and au
110d0 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61  tovacuum mode ca
110e0 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63  n no longer be c
110f0 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
11100 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
11110 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  geSize(Btree *p,
11120 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69   int pageSize, i
11130 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74  nt nReserve, int
11140 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63   iFix){.  int rc
11150 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11160 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
11170 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
11180 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26  ( nReserve>=-1 &
11190 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
111a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
111b0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
111c0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
111d0 78 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xed ){.    sqlit
111e0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
111f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11200 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
11210 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c  .  if( nReserve<
11220 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76  0 ){.    nReserv
11230 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
11240 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
11250 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ize;.  }.  asser
11260 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26  t( nReserve>=0 &
11270 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
11280 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a  );.  if( pageSiz
11290 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
112a0 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
112b0 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20  AGE_SIZE &&.    
112c0 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31      ((pageSize-1
112d0 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29  )&pageSize)==0 )
112e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
112f0 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
11300 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
11310 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21  pBt->pPage1 && !
11320 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
11330 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
11340 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a  e = (u16)pageSiz
11350 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  e;.    freeTempS
11360 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20  pace(pBt);.  }. 
11370 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
11380 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
11390 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
113a0 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65  >pageSize, nRese
113b0 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61  rve);.  pBt->usa
113c0 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70  bleSize = pBt->p
113d0 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e  ageSize - (u16)n
113e0 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69  Reserve;.  if( i
113f0 46 69 78 20 29 20 70 42 74 2d 3e 70 61 67 65 53  Fix ) pBt->pageS
11400 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 20 20  izeFixed = 1;.  
11410 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11420 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
11430 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
11440 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  rn the currently
11450 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69   defined page si
11460 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ze.*/.int sqlite
11470 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
11480 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  e(Btree *p){.  r
11490 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
114a0 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  geSize;.}../*.**
114b0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
114c0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
114d0 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
114e0 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68  of every page th
114f0 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74  at.** are intent
11500 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65  ually left unuse
11510 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
11520 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65  "reserved" space
11530 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65   that is.** some
11540 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78  times used by ex
11550 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74  tensions..*/.int
11560 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
11570 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70  Reserve(Btree *p
11580 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
11590 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
115a0 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74  p);.  n = p->pBt
115b0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
115c0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
115d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
115e0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
115f0 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n n;.}../*.** Se
11600 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  t the maximum pa
11610 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64  ge count for a d
11620 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67  atabase if mxPag
11630 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a  e is positive..*
11640 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  * No changes are
11650 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20   made if mxPage 
11660 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65  is 0 or negative
11670 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  ..** Regardless 
11680 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  of the value of 
11690 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
116a0 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
116b0 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
116c0 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67  lite3BtreeMaxPag
116d0 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c  eCount(Btree *p,
116e0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
116f0 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
11700 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
11710 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65   n = sqlite3Page
11720 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d  rMaxPageCount(p-
11730 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  >pBt->pPager, mx
11740 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
11750 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11760 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
11770 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 65 63 75  .** Set the secu
11780 72 65 44 65 6c 65 74 65 20 66 6c 61 67 20 69 66  reDelete flag if
11790 20 6e 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72   newFlag is 0 or
117a0 20 31 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20   1.  If newFlag 
117b0 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d  is -1,.** then m
117c0 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20  ake no changes. 
117d0 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74   Always return t
117e0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
117f0 73 65 63 75 72 65 44 65 6c 65 74 65 0a 2a 2a 20  secureDelete.** 
11800 73 65 74 74 69 6e 67 20 61 66 74 65 72 20 74 68  setting after th
11810 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74  e change..*/.int
11820 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63   sqlite3BtreeSec
11830 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65 20  ureDelete(Btree 
11840 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29  *p, int newFlag)
11850 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28  {.  int b;.  if(
11860 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
11870 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
11880 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
11890 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20  newFlag>=0 ){.  
118a0 20 20 70 2d 3e 70 42 74 2d 3e 73 65 63 75 72 65    p->pBt->secure
118b0 44 65 6c 65 74 65 20 3d 20 28 6e 65 77 46 6c 61  Delete = (newFla
118c0 67 21 3d 30 29 20 3f 20 31 20 3a 20 30 3b 0a 20  g!=0) ? 1 : 0;. 
118d0 20 7d 20 0a 20 20 62 20 3d 20 70 2d 3e 70 42 74   } .  b = p->pBt
118e0 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 3b 0a  ->secureDelete;.
118f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
11900 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
11910 20 62 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   b;.}.#endif /* 
11920 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
11930 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
11940 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  AS) || !defined(
11950 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
11960 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68  UM) */../*.** Ch
11970 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76  ange the 'auto-v
11980 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20  acuum' property 
11990 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
119a0 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63   If the 'autoVac
119b0 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uum'.** paramete
119c0 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
119d0 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  hen auto-vacuum 
119e0 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  mode is enabled.
119f0 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20   If zero, it.** 
11a00 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65  is disabled. The
11a10 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
11a20 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  or the auto-vacu
11a30 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a  um property is .
11a40 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
11a50 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41   the SQLITE_DEFA
11a60 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d  ULT_AUTOVACUUM m
11a70 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  acro..*/.int sql
11a80 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f  ite3BtreeSetAuto
11a90 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c  Vacuum(Btree *p,
11aa0 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29   int autoVacuum)
11ab0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
11ac0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
11ad0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11ae0 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a  READONLY;.#else.
11af0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
11b00 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
11b10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11b20 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75    u8 av = (u8)au
11b30 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c  toVacuum;..  sql
11b40 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
11b50 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61  );.  if( pBt->pa
11b60 67 65 53 69 7a 65 46 69 78 65 64 20 26 26 20 28  geSizeFixed && (
11b70 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61  av ?1:0)!=pBt->a
11b80 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
11b90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
11ba0 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DONLY;.  }else{.
11bb0 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
11bc0 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20  uum = av ?1:0;. 
11bd0 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
11be0 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b  um = av==2 ?1:0;
11bf0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
11c00 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
11c10 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
11c20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
11c30 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
11c40 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
11c50 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74  property. If aut
11c60 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20  o-vacuum is .** 
11c70 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74  enabled 1 is ret
11c80 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
11c90 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
11ca0 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
11cb0 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
11cc0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
11cd0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
11ce0 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54  return BTREE_AUT
11cf0 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65  OVACUUM_NONE;.#e
11d00 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  lse.  int rc;.  
11d10 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
11d20 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20  r(p);.  rc = (. 
11d30 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74     (!p->pBt->aut
11d40 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  oVacuum)?BTREE_A
11d50 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a  UTOVACUUM_NONE:.
11d60 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e      (!p->pBt->in
11d70 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  crVacuum)?BTREE_
11d80 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a  AUTOVACUUM_FULL:
11d90 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56  .    BTREE_AUTOV
11da0 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a  ACUUM_INCR.  );.
11db0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
11dc0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
11dd0 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a   rc;.#endif.}...
11de0 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65  /*.** Get a refe
11df0 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20  rence to pPage1 
11e00 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
11e10 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  file.  This will
11e20 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65  .** also acquire
11e30 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74   a readlock on t
11e40 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  hat file..**.** 
11e50 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
11e60 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
11e70 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  .  If the file i
11e80 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d  s not a.** well-
11e90 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
11ea0 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54  file, then SQLIT
11eb0 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74  E_CORRUPT is ret
11ec0 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45  urned..** SQLITE
11ed0 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
11ee0 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
11ef0 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51  e is locked.  SQ
11f00 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73  LITE_NOMEM.** is
11f10 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20   returned if we 
11f20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
11f30 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y. .*/.static in
11f40 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68  t lockBtree(BtSh
11f50 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
11f60 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
11f70 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 6e  *pPage1;.  int n
11f80 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
11f90 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
11fa0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
11fb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
11fc0 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20  ->pPage1==0 );. 
11fd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
11fe0 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74  erSharedLock(pBt
11ff0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  ->pPager);.  if(
12000 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12010 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
12020 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
12030 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
12040 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
12050 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
12060 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73  n rc;..  /* Do s
12070 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20  ome checking to 
12080 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20  help insure the 
12090 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72  file we opened r
120a0 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20  eally is.  ** a 
120b0 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66  valid database f
120c0 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20  ile. .  */.  rc 
120d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
120e0 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
120f0 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
12100 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12110 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61  K ){.    goto pa
12120 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
12130 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 50 61  .  }else if( nPa
12140 67 65 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  ge>0 ){.    int 
12150 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 69 6e  pageSize;.    in
12160 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  t usableSize;.  
12170 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50    u8 *page1 = pP
12180 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
12190 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
121a0 41 44 42 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d  ADB;.    if( mem
121b0 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69  cmp(page1, zMagi
121c0 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20  cHeader, 16)!=0 
121d0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
121e0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
121f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
12200 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20  age1[18]>1 ){.  
12210 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c      pBt->readOnl
12220 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  y = 1;.    }.   
12230 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31   if( page1[19]>1
12240 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
12250 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
12260 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
12270 54 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65  The maximum embe
12280 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75  dded fraction mu
12290 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 32 35  st be exactly 25
122a0 25 2e 20 20 41 6e 64 20 74 68 65 20 6d 69 6e 69  %.  And the mini
122b0 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64  mum.    ** embed
122c0 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73  ded fraction mus
122d0 74 20 62 65 20 31 32 2e 35 25 20 66 6f 72 20 62  t be 12.5% for b
122e0 6f 74 68 20 6c 65 61 66 2d 64 61 74 61 20 61 6e  oth leaf-data an
122f0 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e  d non-leaf-data.
12300 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67  .    ** The orig
12310 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f  inal design allo
12320 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74  wed these amount
12330 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61  s to vary, but a
12340 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73  s of.    ** vers
12350 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65  ion 3.6.0, we re
12360 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65  quire them to be
12370 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20   fixed..    */. 
12380 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70     if( memcmp(&p
12390 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c  age1[21], "\100\
123a0 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29  040\040",3)!=0 )
123b0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
123c0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
123d0 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69      }.    pageSi
123e0 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 70  ze = get2byte(&p
123f0 61 67 65 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69  age1[16]);.    i
12400 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29  f( ((pageSize-1)
12410 26 70 61 67 65 53 69 7a 65 29 21 3d 30 20 7c 7c  &pageSize)!=0 ||
12420 20 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c   pageSize<512 ||
12430 0a 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45  .        (SQLITE
12440 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 3c 33  _MAX_PAGE_SIZE<3
12450 32 37 36 38 20 26 26 20 70 61 67 65 53 69 7a 65  2768 && pageSize
12460 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
12470 5f 53 49 5a 45 29 0a 20 20 20 20 29 7b 0a 20 20  _SIZE).    ){.  
12480 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
12490 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
124a0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  }.    assert( (p
124b0 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
124c0 29 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a  );.    usableSiz
124d0 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70  e = pageSize - p
124e0 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66  age1[20];.    if
124f0 28 20 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d  ( pageSize!=pBt-
12500 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
12510 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64     /* After read
12520 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
12530 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
12540 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61  se assuming a pa
12550 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a  ge size.      **
12560 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61 67   of BtShared.pag
12570 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64  eSize, we have d
12580 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 74  iscovered that t
12590 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a  he page-size is.
125a0 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c        ** actuall
125b0 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f  y pageSize. Unlo
125c0 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ck the database,
125d0 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67   leave pBt->pPag
125e0 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a  e1 at.      ** z
125f0 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ero and return S
12600 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61  QLITE_OK. The ca
12610 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74  ller will call t
12620 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20  his function.   
12630 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68     ** again with
12640 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67   the correct pag
12650 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f  e-size..      */
12660 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
12670 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
12680 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
12690 65 20 3d 20 28 75 31 36 29 75 73 61 62 6c 65 53  e = (u16)usableS
126a0 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ize;.      pBt->
126b0 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29  pageSize = (u16)
126c0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
126d0 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
126e0 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
126f0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
12700 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
12710 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
12720 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
12730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12740 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d         pageSize-
12750 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20  usableSize);.   
12760 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12770 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 61 62    }.    if( usab
12780 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20  leSize<480 ){.  
12790 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
127a0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
127b0 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  }.    pBt->pageS
127c0 69 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65 53  ize = (u16)pageS
127d0 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
127e0 61 62 6c 65 53 69 7a 65 20 3d 20 28 75 31 36 29  ableSize = (u16)
127f0 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e  usableSize;.#ifn
12800 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12810 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70  AUTOVACUUM.    p
12820 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
12830 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
12840 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  1[36 + 4*4])?1:0
12850 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  );.    pBt->incr
12860 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
12870 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37  te(&page1[36 + 7
12880 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
12890 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c  f.  }..  /* maxL
128a0 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69  ocal is the maxi
128b0 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
128c0 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c  yload to store l
128d0 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20  ocally for.  ** 
128e0 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75  a cell.  Make su
128f0 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65  re it is small e
12900 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74  nough so that at
12910 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74   least minFanout
12920 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20  .  ** cells can 
12930 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20  will fit on one 
12940 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65  page.  We assume
12950 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20   a 10-byte page 
12960 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73  header..  ** Bes
12970 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64  ides the payload
12980 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20  , the cell must 
12990 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20  store:.  **     
129a0 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74  2-byte pointer t
129b0 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20  o the cell.  ** 
129c0 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64      4-byte child
129d0 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20   pointer.  **   
129e0 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61    9-byte nKey va
129f0 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
12a00 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a  yte nData value.
12a10 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
12a20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  overflow page po
12a30 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20  inter.  ** So a 
12a40 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
12a50 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 65 72   a 2-byte poiner
12a60 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68  , a header which
12a70 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20   is as much as. 
12a80 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e   ** 17 bytes lon
12a90 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20  g, 0 to N bytes 
12aa0 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20  of payload, and 
12ab0 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79  an optional 4 by
12ac0 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a  te overflow.  **
12ad0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20   page pointer.. 
12ae0 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f   */.  pBt->maxLo
12af0 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62  cal = (pBt->usab
12b00 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35  leSize-12)*64/25
12b10 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d  5 - 23;.  pBt->m
12b20 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e  inLocal = (pBt->
12b30 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
12b40 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42  2/255 - 23;.  pB
12b50 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42 74  t->maxLeaf = pBt
12b60 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
12b70 35 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  5;.  pBt->minLea
12b80 66 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  f = (pBt->usable
12b90 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
12ba0 2d 20 32 33 3b 0a 20 20 61 73 73 65 72 74 28 20  - 23;.  assert( 
12bb0 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32  pBt->maxLeaf + 2
12bc0 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a  3 <= MX_CELL_SIZ
12bd0 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d  E(pBt) );.  pBt-
12be0 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31  >pPage1 = pPage1
12bf0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
12c00 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69  E_OK;..page1_ini
12c10 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65  t_failed:.  rele
12c20 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
12c30 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
12c40 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
12c50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
12c60 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
12c70 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e  nding cursors an
12c80 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20  d we are not in 
12c90 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66  the middle.** of
12ca0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
12cb0 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65  ut there is a re
12cc0 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
12cd0 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a  atabase, then.**
12ce0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e   this routine un
12cf0 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70  refs the first p
12d00 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
12d10 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a  ase file which .
12d20 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63  ** has the effec
12d30 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74  t of releasing t
12d40 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a  he read lock..**
12d50 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
12d60 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
12d70 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20   progress, this 
12d80 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
12d90 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
12da0 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  id unlockBtreeIf
12db0 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20  Unused(BtShared 
12dc0 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28  *pBt){.  assert(
12dd0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12de0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
12df0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
12e00 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20 7c 7c 20  ->pCursor==0 || 
12e10 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
12e20 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b  on>TRANS_NONE );
12e30 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
12e40 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
12e50 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50  _NONE && pBt->pP
12e60 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 61  age1!=0 ){.    a
12e70 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
12e80 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  e1->aData );.   
12e90 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12ea0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
12eb0 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b  t->pPager)==1 );
12ec0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
12ed0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
12ee0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
12ef0 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b  ge(pBt->pPage1);
12f00 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
12f10 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
12f20 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73  ** If pBt points
12f30 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c   to an empty fil
12f40 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74  e then convert t
12f50 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a  hat empty file.*
12f60 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70  * into a new emp
12f70 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20 69  ty database by i
12f80 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
12f90 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a  first page of.**
12fa0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
12fb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77  /.static int new
12fc0 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65  Database(BtShare
12fd0 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61  d *pBt){.  MemPa
12fe0 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67  ge *pP1;.  unsig
12ff0 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a  ned char *data;.
13000 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
13010 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  nPage;..  assert
13020 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
13030 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
13040 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
13050 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
13060 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
13070 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
13080 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50  =SQLITE_OK || nP
13090 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  age>0 ){.    ret
130a0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
130b0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
130c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d  .  assert( pP1!=
130d0 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  0 );.  data = pP
130e0 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d  1->aData;.  rc =
130f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
13100 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29  te(pP1->pDbPage)
13110 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
13120 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79  urn rc;.  memcpy
13130 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61  (data, zMagicHea
13140 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67  der, sizeof(zMag
13150 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73  icHeader));.  as
13160 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61  sert( sizeof(zMa
13170 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29  gicHeader)==16 )
13180 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
13190 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e 70 61 67  ta[16], pBt->pag
131a0 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 31  eSize);.  data[1
131b0 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31  8] = 1;.  data[1
131c0 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  9] = 1;.  assert
131d0 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
131e0 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e<=pBt->pageSize
131f0 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   && pBt->usableS
13200 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61  ize+255>=pBt->pa
13210 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  geSize);.  data[
13220 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e  20] = (u8)(pBt->
13230 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
13240 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64  usableSize);.  d
13250 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20  ata[21] = 64;.  
13260 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20  data[22] = 32;. 
13270 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a   data[23] = 32;.
13280 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32    memset(&data[2
13290 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a  4], 0, 100-24);.
132a0 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20    zeroPage(pP1, 
132b0 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
132c0 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  EAF|PTF_LEAFDATA
132d0 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53   );.  pBt->pageS
132e0 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69  izeFixed = 1;.#i
132f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13300 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61  T_AUTOVACUUM.  a
13310 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
13320 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
13330 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20  ->autoVacuum==0 
13340 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
13350 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20  ->incrVacuum==1 
13360 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  || pBt->incrVacu
13370 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62  um==0 );.  put4b
13380 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34  yte(&data[36 + 4
13390 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61  *4], pBt->autoVa
133a0 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74  cuum);.  put4byt
133b0 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34  e(&data[36 + 7*4
133c0 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ], pBt->incrVacu
133d0 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  um);.#endif.  re
133e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
133f0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
13400 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20   to start a new 
13410 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77  transaction. A w
13420 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
13430 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69  .** is started i
13440 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
13450 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f  ument is nonzero
13460 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65  , otherwise a re
13470 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ad-.** transacti
13480 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f  on.  If the seco
13490 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32  nd argument is 2
134a0 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63   or more and exc
134b0 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  lusive.** transa
134c0 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
134d0 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e  , meaning that n
134e0 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  o other process 
134f0 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f  is allowed.** to
13500 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
13510 62 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73  base.  A preexis
13520 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e  ting transaction
13530 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75   may not be.** u
13540 70 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75  pgraded to exclu
13550 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  sive by calling 
13560 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73  this routine a s
13570 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65  econd time - the
13580 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20  .** exclusivity 
13590 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  flag only works 
135a0 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61  for a new transa
135b0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77  ction..**.** A w
135c0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
135d0 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64   must be started
135e0 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
135f0 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67  ng any .** chang
13600 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
13610 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65  se.  None of the
13620 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
13630 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72  nes .** will wor
13640 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73  k unless a trans
13650 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65  action is starte
13660 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20  d first:.**.**  
13670 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
13680 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a  CreateTable().**
13690 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
136a0 65 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a  eeCreateIndex().
136b0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
136c0 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29  treeClearTable()
136d0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
136e0 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29  BtreeDropTable()
136f0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
13700 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a  BtreeInsert().**
13710 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
13720 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20  eeDelete().**   
13730 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55     sqlite3BtreeU
13740 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a  pdateMeta().**.*
13750 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20  * If an initial 
13760 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69  attempt to acqui
13770 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c  re the lock fail
13780 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63  s because of loc
13790 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20  k contention.** 
137a0 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
137b0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
137c0 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69  unlocked, then i
137d0 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
137e0 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65  andler.** if the
137f0 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20  re is one.  But 
13800 69 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65  if there was pre
13810 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c  viously a read-l
13820 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69  ock, do not.** i
13830 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
13840 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65  andler - just re
13850 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
13860 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  .  SQLITE_BUSY i
13870 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77  s .** returned w
13880 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72  hen there is alr
13890 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  eady a read-lock
138a0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   in order to avo
138b0 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a  id a deadlock..*
138c0 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  *.** Suppose the
138d0 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65  re are two proce
138e0 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41  sses A and B.  A
138f0 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
13900 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20   and B has.** a 
13910 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20  reserved lock.  
13920 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  B tries to promo
13930 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  te to exclusive 
13940 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
13950 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73  ecause.** of A's
13960 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74   read lock.  A t
13970 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
13980 74 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20  to reserved but 
13990 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e  is blocked by B.
139a0 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f  .** One or the o
139b0 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20  ther of the two 
139c0 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67  processes must g
139d0 69 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65  ive way or there
139e0 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72   can be.** no pr
139f0 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75  ogress.  By retu
13a00 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53  rning SQLITE_BUS
13a10 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69  Y and not invoki
13a20 6e 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ng the busy call
13a30 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61  back.** when A a
13a40 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61  lready has a rea
13a50 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75  d lock, we encou
13a60 72 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75  rage A to give u
13a70 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70  p and let B.** p
13a80 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  roceed..*/.int s
13a90 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
13aa0 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20  Trans(Btree *p, 
13ab0 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 73  int wrflag){.  s
13ac0 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d  qlite3 *pBlock =
13ad0 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a   0;.  BtShared *
13ae0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
13af0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
13b00 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  OK;..  sqlite3Bt
13b10 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62  reeEnter(p);.  b
13b20 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
13b30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62  ;..  /* If the b
13b40 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20  tree is already 
13b50 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
13b60 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20  action, or it.  
13b70 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ** is already in
13b80 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
13b90 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74  ion and a read-t
13ba0 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
13bb0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
13bc0 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  is is a no-op.. 
13bd0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
13be0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
13bf0 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73  E || (p->inTrans
13c00 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20  ==TRANS_READ && 
13c10 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20  !wrflag) ){.    
13c20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
13c30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  ;.  }..  /* Writ
13c40 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e transactions a
13c50 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  re not possible 
13c60 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  on a read-only d
13c70 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28  atabase */.  if(
13c80 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26   pBt->readOnly &
13c90 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
13ca0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
13cb0 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74  ONLY;.    goto t
13cc0 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
13cd0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13ce0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
13cf0 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65  E.  /* If anothe
13d00 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  r database handl
13d10 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70  e has already op
13d20 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61  ened a write tra
13d30 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f  nsaction .  ** o
13d40 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74  n this shared-bt
13d50 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ree structure an
13d60 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65  d a second write
13d70 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
13d80 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20    ** requested, 
13d90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
13da0 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  CKED..  */.  if(
13db0 20 28 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d   (wrflag && pBt-
13dc0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
13dd0 54 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20  TRANS_WRITE) || 
13de0 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 29  pBt->isPending )
13df0 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70  {.    pBlock = p
13e00 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b  Bt->pWriter->db;
13e10 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66  .  }else if( wrf
13e20 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c  lag>1 ){.    BtL
13e30 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20  ock *pIter;.    
13e40 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
13e50 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
13e60 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
13e70 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
13e80 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a  r->pBtree!=p ){.
13e90 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d          pBlock =
13ea0 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e   pIter->pBtree->
13eb0 64 62 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  db;.        brea
13ec0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
13ed0 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63  .  }.  if( pBloc
13ee0 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  k ){.    sqlite3
13ef0 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
13f00 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29  d(p->db, pBlock)
13f10 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
13f20 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
13f30 41 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74  ACHE;.    goto t
13f40 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
13f50 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79  #endif..  /* Any
13f60 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65   read-only or re
13f70 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63  ad-write transac
13f80 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72  tion implies a r
13f90 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a  ead-lock on .  *
13fa0 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20  * page 1. So if 
13fb0 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65  some other share
13fc0 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61  d-cache client a
13fd0 6c 72 65 61 64 79 20 68 61 73 20 61 20 77 72 69  lready has a wri
13fe0 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e  te-lock .  ** on
13ff0 20 70 61 67 65 20 31 2c 20 74 68 65 20 74 72 61   page 1, the tra
14000 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  nsaction cannot 
14010 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20  be opened. */.  
14020 72 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64  rc = queryShared
14030 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
14040 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52  , MASTER_ROOT, R
14050 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28  EAD_LOCK);.  if(
14060 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
14070 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
14080 6e 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f  n;..  do {.    /
14090 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65  * Call lockBtree
140a0 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20  () until either 
140b0 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70  pBt->pPage1 is p
140c0 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20  opulated or.    
140d0 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72  ** lockBtree() r
140e0 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67  eturns something
140f0 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
14100 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65  TE_OK. lockBtree
14110 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65  ().    ** may re
14120 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62  turn SQLITE_OK b
14130 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  ut leave pBt->pP
14140 61 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66  age1 set to 0 if
14150 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65   after.    ** re
14160 61 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20  ading page 1 it 
14170 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74  discovers that t
14180 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20  he page-size of 
14190 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
141a0 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74    ** file is not
141b0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20   pBt->pageSize. 
141c0 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63  In this case loc
141d0 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70  kBtree() will up
141e0 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d  date.    ** pBt-
141f0 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65  >pageSize to the
14200 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
14210 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a  e file on disk..
14220 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65      */.    while
14230 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
14240 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28   && SQLITE_OK==(
14250 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70  rc = lockBtree(p
14260 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  Bt)) );..    if(
14270 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
14280 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
14290 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f    if( pBt->readO
142a0 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72  nly ){.        r
142b0 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
142c0 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NLY;.      }else
142d0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
142e0 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
142f0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66  (pBt->pPager,wrf
14300 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d  lag>1,sqlite3Tem
14310 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29  pInMemory(p->db)
14320 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
14330 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
14340 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e            rc = n
14350 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
14360 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14370 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
14380 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14390 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63  K ){.      unloc
143a0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
143b0 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  Bt);.    }.  }wh
143c0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
143d0 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54  BUSY && pBt->inT
143e0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
143f0 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20  S_NONE &&.      
14400 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42      btreeInvokeB
14410 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20  usyHandler(pBt) 
14420 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
14430 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
14440 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
14450 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
14460 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
14470 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20  tion++;.#ifndef 
14480 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
14490 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69  ED_CACHE.      i
144a0 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
144b0 7b 0a 09 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f  {..assert( p->lo
144c0 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20  ck.pBtree==p && 
144d0 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d  p->lock.iTable==
144e0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
144f0 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41  lock.eLock = REA
14500 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  D_LOCK;.        
14510 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20  p->lock.pNext = 
14520 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
14530 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d      pBt->pLock =
14540 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20   &p->lock;.     
14550 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
14560 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
14570 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57   (wrflag?TRANS_W
14580 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29  RITE:TRANS_READ)
14590 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  ;.    if( p->inT
145a0 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  rans>pBt->inTran
145b0 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
145c0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
145d0 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73  ion = p->inTrans
145e0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
145f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
14600 45 44 5f 43 41 43 48 45 0a 20 20 20 20 69 66 28  ED_CACHE.    if(
14610 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
14620 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
14630 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20  Writer );.      
14640 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70  pBt->pWriter = p
14650 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 73 45  ;.      pBt->isE
14660 78 63 6c 75 73 69 76 65 20 3d 20 28 75 38 29 28  xclusive = (u8)(
14670 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 7d  wrflag>1);.    }
14680 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74 72  .#endif.  }...tr
14690 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28  ans_begun:.  if(
146a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
146b0 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
146c0 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b  /* This call mak
146d0 65 73 20 73 75 72 65 20 74 68 61 74 20 74 68 65  es sure that the
146e0 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 63   pager has the c
146f0 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66  orrect number of
14700 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76  .    ** open sav
14710 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20  epoints. If the 
14720 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
14730 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
14740 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68   0 and.    ** th
14750 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  e sub-journal is
14760 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
14770 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  n, then it will 
14780 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a  be opened here..
14790 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
147a0 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
147b0 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
147c0 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53  Pager, p->db->nS
147d0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a  avepoint);.  }..
147e0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
147f0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
14800 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
14810 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
14820 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14830 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a  _AUTOVACUUM../*.
14840 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74  ** Set the point
14850 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
14860 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  or all children 
14870 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41  of page pPage. A
14880 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65  lso, if.** pPage
14890 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20   contains cells 
148a0 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
148b0 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65  erflow pages, se
148c0 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  t the pointer.**
148d0 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
148e0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
148f0 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a  ges as well..*/.
14900 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68  static int setCh
14910 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61  ildPtrmaps(MemPa
14920 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
14930 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
14940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14950 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69   /* Counter vari
14960 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
14970 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
14980 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14990 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
149a0 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f  in page pPage */
149b0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
149c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149d0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
149e0 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  code */.  BtShar
149f0 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
14a00 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e 69  >pBt;.  u8 isIni
14a10 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69  tOrig = pPage->i
14a20 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67  sInit;.  Pgno pg
14a30 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
14a40 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
14a50 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
14a60 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
14a70 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  x) );.  rc = btr
14a80 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
14a90 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
14aa0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
14ab0 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  to set_child_ptr
14ac0 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  maps_out;.  }.  
14ad0 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
14ae0 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  Cell;..  for(i=0
14af0 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
14b00 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
14b10 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
14b20 20 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70   i);..    ptrmap
14b30 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
14b40 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a  , pCell, &rc);..
14b50 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
14b60 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67  leaf ){.      Pg
14b70 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
14b80 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a  et4byte(pCell);.
14b90 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
14ba0 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
14bb0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
14bc0 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a  no, &rc);.    }.
14bd0 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
14be0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  e->leaf ){.    P
14bf0 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
14c00 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
14c10 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
14c20 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
14c30 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
14c40 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
14c50 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26  P_BTREE, pgno, &
14c60 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68  rc);.  }..set_ch
14c70 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a  ild_ptrmaps_out:
14c80 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
14c90 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20   = isInitOrig;. 
14ca0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
14cb0 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f  *.** Somewhere o
14cc0 6e 20 70 50 61 67 65 20 69 73 20 61 20 70 6f 69  n pPage is a poi
14cd0 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72  nter to page iFr
14ce0 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73  om.  Modify this
14cf0 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74   pointer so.** t
14d00 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
14d10 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20   iTo. Parameter 
14d20 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20  eType describes 
14d30 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e  the type of poin
14d40 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64  ter to.** be mod
14d50 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f  ified, as  follo
14d60 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ws:.**.** PTRMAP
14d70 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67  _BTREE:     pPag
14d80 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
14d90 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
14da0 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64  oints at a child
14db0 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
14dc0 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70         page of p
14dd0 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
14de0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50  AP_OVERFLOW1: pP
14df0 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70  age is a btree-p
14e00 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
14e10 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76   points at an ov
14e20 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20  erflow.**       
14e30 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
14e40 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f   pointed to by o
14e50 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  ne of the cells 
14e60 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  on pPage..**.** 
14e70 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
14e80 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76  : pPage is an ov
14e90 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65  erflow-page. The
14ea0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
14eb0 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20  at the next.**  
14ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ed0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
14ee0 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73  n the list..*/.s
14ef0 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79  tatic int modify
14f00 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50  PagePointer(MemP
14f10 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f  age *pPage, Pgno
14f20 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f   iFrom, Pgno iTo
14f30 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61  , u8 eType){.  a
14f40 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
14f50 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
14f60 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
14f70 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
14f80 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
14f90 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
14fa0 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65  ) );.  if( eType
14fb0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
14fc0 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  W2 ){.    /* The
14fd0 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61   pointer is alwa
14fe0 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62  ys the first 4 b
14ff0 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65  ytes of the page
15000 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
15010 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62  */.    if( get4b
15020 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
15030 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )!=iFrom ){.    
15040 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15050 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
15060 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65    }.    put4byte
15070 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
15080 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  To);.  }else{.  
15090 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20    u8 isInitOrig 
150a0 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b  = pPage->isInit;
150b0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
150c0 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20  int nCell;..    
150d0 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
150e0 61 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20  age);.    nCell 
150f0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
15100 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
15110 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
15120 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
15130 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
15140 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  );.      if( eTy
15150 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
15160 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20  LOW1 ){.        
15170 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
15180 20 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73         btreePars
15190 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
151a0 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
151b0 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e         if( info.
151c0 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  iOverflow ){.   
151d0 20 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d         if( iFrom
151e0 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  ==get4byte(&pCel
151f0 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
15200 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
15210 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c    put4byte(&pCel
15220 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
15230 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  ], iTo);.       
15240 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15250 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15260 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
15270 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62         if( get4b
15280 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f  yte(pCell)==iFro
15290 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  m ){.          p
152a0 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
152b0 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
152c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
152d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
152e0 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c  .    if( i==nCel
152f0 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  l ){.      if( e
15300 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52  Type!=PTRMAP_BTR
15310 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  EE || .         
15320 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
15330 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
15340 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46  drOffset+8])!=iF
15350 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rom ){.        r
15360 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
15370 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
15380 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74   }.      put4byt
15390 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
153a0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
153b0 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d  +8], iTo);.    }
153c0 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ..    pPage->isI
153d0 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
153e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
153f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
15400 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65  .** Move the ope
15410 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
15420 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74  pDbPage to locat
15430 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e  ion iFreePage in
15440 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
15450 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72  e. The pDbPage r
15460 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73  eference remains
15470 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   valid..**.** Th
15480 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20  e isCommit flag 
15490 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
154a0 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
154b0 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
154c0 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
154d0 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
154e0 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61  ()ed before data
154f0 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
15500 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20  e->pgno .** can 
15510 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54  be written to. T
15520 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
15530 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e  ready promised n
15540 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ot to write to t
15550 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a  hat.** page..*/.
15560 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63  static int reloc
15570 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  atePage(.  BtSha
15580 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
15590 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a      /* Btree */.
155a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61    MemPage *pDbPa
155b0 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  ge,        /* Op
155c0 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  en page to move 
155d0 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20  */.  u8 eType,  
155e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
155f0 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79   Pointer map 'ty
15600 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  pe' entry for pD
15610 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
15620 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20  iPtrPage,       
15630 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
15640 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74  ap 'page-no' ent
15650 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
15660 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61  /.  Pgno iFreePa
15670 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge,          /* 
15680 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  The location to 
15690 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20  move pDbPage to 
156a0 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69  */.  int isCommi
156b0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t             /*
156c0 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70   isCommit flag p
156d0 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
156e0 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f  PagerMovepage */
156f0 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
15700 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  PtrPage;   /* Th
15710 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
15720 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
15730 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  o pDbPage */.  P
15740 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44  gno iDbPage = pD
15750 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50  bPage->pgno;.  P
15760 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
15770 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Bt->pPager;.  in
15780 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
15790 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
157a0 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70  VERFLOW2 || eTyp
157b0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
157c0 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54  OW1 || .      eT
157d0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
157e0 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
157f0 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20  AP_ROOTPAGE );. 
15800 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
15810 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
15820 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
15830 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42  ert( pDbPage->pB
15840 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20  t==pBt );..  /* 
15850 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67  Move page iDbPag
15860 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65  e from its curre
15870 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70  nt location to p
15880 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65  age number iFree
15890 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28  Page */.  TRACE(
158a0 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f  ("AUTOVACUUM: Mo
158b0 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20  ving %d to free 
158c0 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67  page %d (ptr pag
158d0 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22  e %d type %d)\n"
158e0 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65  , .      iDbPage
158f0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74  , iFreePage, iPt
15900 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a  rPage, eType));.
15910 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
15920 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67  gerMovepage(pPag
15930 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62  er, pDbPage->pDb
15940 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
15950 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66   isCommit);.  if
15960 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15970 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
15980 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d  ;.  }.  pDbPage-
15990 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67  >pgno = iFreePag
159a0 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50  e;..  /* If pDbP
159b0 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d  age was a btree-
159c0 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61  page, then it ma
159d0 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67  y have child pag
159e0 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a  es and/or cells.
159f0 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20    ** that point 
15a00 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
15a10 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  s. The pointer m
15a20 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
15a30 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61  ll these.  ** pa
15a40 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ges need to be c
15a50 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  hanged..  **.  *
15a60 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20  * If pDbPage is 
15a70 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
15a80 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
15a90 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f   4 bytes may sto
15aa0 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65  re a.  ** pointe
15ab0 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e  r to a subsequen
15ac0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
15ad0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
15ae0 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  case, then.  ** 
15af0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
15b00 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
15b10 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73  ted for the subs
15b20 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
15b30 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
15b40 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
15b50 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
15b60 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
15b70 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68  {.    rc = setCh
15b80 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61  ildPtrmaps(pDbPa
15b90 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
15ba0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15bb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
15bc0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
15bd0 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20    Pgno nextOvfl 
15be0 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61  = get4byte(pDbPa
15bf0 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
15c00 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20  if( nextOvfl!=0 
15c10 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
15c20 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c  ut(pBt, nextOvfl
15c30 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
15c40 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26  W2, iFreePage, &
15c50 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rc);.      if( r
15c60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15c70 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
15c80 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
15c90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74  .  }..  /* Fix t
15ca0 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e  he database poin
15cb0 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72  ter on page iPtr
15cc0 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65  Page that pointe
15cd0 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a  d at iDbPage so.
15ce0 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69    ** that it poi
15cf0 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65  nts at iFreePage
15d00 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70  . Also fix the p
15d10 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
15d20 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61   for.  ** iPtrPa
15d30 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
15d40 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type!=PTRMAP_ROO
15d50 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
15d60 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
15d70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70  Bt, iPtrPage, &p
15d80 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  PtrPage, 0);.   
15d90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15da0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
15db0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
15dc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
15dd0 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65  erWrite(pPtrPage
15de0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
15df0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15e00 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
15e10 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
15e20 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
15e30 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
15e40 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  = modifyPagePoin
15e50 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44  ter(pPtrPage, iD
15e60 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
15e70 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65  , eType);.    re
15e80 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
15e90 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
15ea0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15eb0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
15ec0 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  t, iFreePage, eT
15ed0 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26  ype, iPtrPage, &
15ee0 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rc);.    }.  }. 
15ef0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15f00 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
15f10 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62  ation required b
15f20 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  y incrVacuumStep
15f30 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  (). */.static in
15f40 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
15f50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20  age(BtShared *, 
15f60 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f  MemPage **, Pgno
15f70 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a   *, Pgno, u8);..
15f80 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20  /*.** Perform a 
15f90 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61  single step of a
15fa0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  n incremental-va
15fb0 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73  cuum. If success
15fc0 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53  ful,.** return S
15fd0 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65  QLITE_OK. If the
15fe0 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f  re is no work to
15ff0 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f   do (and therefo
16000 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69  re no.** point i
16010 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  n calling this f
16020 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20  unction again), 
16030 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
16040 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73  NE..**.** More s
16050 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69 73 20  pecificly, this 
16060 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
16070 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65  s to re-organize
16080 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
16090 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 6c 61  e so that the la
160a0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
160b0 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ile currently in
160c0 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f   use.** is no lo
160d0 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a  nger in use..**.
160e0 2a 2a 20 49 66 20 74 68 65 20 6e 46 69 6e 20 70  ** If the nFin p
160f0 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
16100 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74  zero, this funct
16110 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20 74  ion assumes.** t
16120 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 77  hat the caller w
16130 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67  ill keep calling
16140 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
16150 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72 65  ) until.** it re
16160 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
16170 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20 61  E or an error, a
16180 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73 20  nd that nFin is 
16190 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
161a0 20 70 61 67 65 73 20 74 68 65 20 64 61 74 61 62   pages the datab
161b0 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f  ase file will co
161c0 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68 69 73  ntain after this
161d0 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20   .** process is 
161e0 63 6f 6d 70 6c 65 74 65 2e 20 20 49 66 20 6e 46  complete.  If nF
161f0 69 6e 20 69 73 20 7a 65 72 6f 2c 20 69 74 20 69  in is zero, it i
16200 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
16210 2a 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  * incrVacuumStep
16220 28 29 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  () will be calle
16230 64 20 61 20 66 69 6e 69 74 65 20 61 6d 6f 75 6e  d a finite amoun
16240 74 20 6f 66 20 74 69 6d 65 73 0a 2a 2a 20 77 68  t of times.** wh
16250 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ich may or may n
16260 6f 74 20 65 6d 70 74 79 20 74 68 65 20 66 72 65  ot empty the fre
16270 65 6c 69 73 74 2e 20 20 41 20 66 75 6c 6c 20 61  elist.  A full a
16280 75 74 6f 76 61 63 75 75 6d 0a 2a 2a 20 68 61 73  utovacuum.** has
16290 20 6e 46 69 6e 3e 30 2e 20 20 41 20 22 50 52 41   nFin>0.  A "PRA
162a0 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f  GMA incremental_
162b0 76 61 63 75 75 6d 22 20 68 61 73 20 6e 46 69 6e  vacuum" has nFin
162c0 3d 3d 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ==0..*/.static i
162d0 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  nt incrVacuumSte
162e0 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
162f0 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f   Pgno nFin, Pgno
16300 20 69 4c 61 73 74 50 67 29 7b 0a 20 20 50 67 6e   iLastPg){.  Pgn
16310 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20  o nFreeList;    
16320 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
16330 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20   of pages still 
16340 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
16350 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
16360 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
16370 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
16380 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73 74  .  assert( iLast
16390 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66  Pg>nFin );..  if
163a0 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45  ( !PTRMAP_ISPAGE
163b0 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26  (pBt, iLastPg) &
163c0 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49  & iLastPg!=PENDI
163d0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
163e0 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  ) ){.    int rc;
163f0 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20  .    u8 eType;. 
16400 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65     Pgno iPtrPage
16410 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74  ;..    nFreeList
16420 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
16430 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
16440 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46  36]);.    if( nF
16450 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  reeList==0 ){.  
16460 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16470 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
16480 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
16490 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  t(pBt, iLastPg, 
164a0 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67  &eType, &iPtrPag
164b0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
164c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
164d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
164e0 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70    }.    if( eTyp
164f0 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
16500 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  GE ){.      retu
16510 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
16520 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
16530 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
16540 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
16550 0a 20 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d  .      if( nFin=
16560 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
16570 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65   Remove the page
16580 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20   from the files 
16590 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
165a0 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a  is not required.
165b0 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46          ** if nF
165c0 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  in is non-zero. 
165d0 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
165e0 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c  e free-list will
165f0 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   be.        ** t
16600 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
16610 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
16620 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f  tion returns, so
16630 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20   it doesn't .   
16640 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69       ** matter i
16650 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61  f it still conta
16660 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ins some garbage
16670 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20   entries..      
16680 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e    */.        Pgn
16690 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20  o iFreePg;.     
166a0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
166b0 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
166c0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
166d0 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
166e0 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61  g, &iFreePg, iLa
166f0 73 74 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20  stPg, 1);.      
16700 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16710 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
16720 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16730 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
16740 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69  sert( iFreePg==i
16750 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
16760 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
16770 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  reePg);.      }.
16780 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
16790 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
167a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
167b0 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61  Index of free pa
167c0 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74  ge to move pLast
167d0 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d  Pg to */.      M
167e0 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b  emPage *pLastPg;
167f0 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  ..      rc = btr
16800 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
16810 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67  LastPg, &pLastPg
16820 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
16830 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16840 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
16850 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
16860 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73     /* If nFin is
16870 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70   zero, this loop
16880 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e   runs exactly on
16890 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73  ce and page pLas
168a0 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  tPg.      ** is 
168b0 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65  swapped with the
168c0 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65   first free page
168d0 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20   pulled off the 
168e0 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20  free list..     
168f0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20   **.      ** On 
16900 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
16910 69 66 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74  if nFin is great
16920 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  er than zero, th
16930 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a  en keep.      **
16940 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61   looping until a
16950 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74   free-page locat
16960 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  ed within the fi
16970 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20  rst nFin pages. 
16980 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66       ** of the f
16990 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20  ile is found..  
169a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20      */.      do 
169b0 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  {.        MemPag
169c0 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
169d0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
169e0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
169f0 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
16a00 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Pg, 0, 0);.     
16a10 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16a20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16a30 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
16a40 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20  astPg);.        
16a50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
16a60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
16a70 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
16a80 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  Pg);.      }whil
16a90 65 28 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46  e( nFin!=0 && iF
16aa0 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20  reePg>nFin );.  
16ab0 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
16ac0 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20  ePg<iLastPg );. 
16ad0 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d       .      rc =
16ae0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
16af0 74 65 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50  te(pLastPg->pDbP
16b00 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
16b10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16b20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
16b30 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
16b40 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20  pLastPg, eType, 
16b50 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50  iPtrPage, iFreeP
16b60 67 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20  g, nFin!=0);.   
16b70 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61     }.      relea
16b80 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
16b90 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
16ba0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16bb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16bc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
16bd0 0a 0a 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20  ..  if( nFin==0 
16be0 29 7b 0a 20 20 20 20 69 4c 61 73 74 50 67 2d 2d  ){.    iLastPg--
16bf0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 4c 61  ;.    while( iLa
16c00 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg==PENDING_BY
16c10 54 45 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54  TE_PAGE(pBt)||PT
16c20 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
16c30 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20   iLastPg) ){.   
16c40 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53     if( PTRMAP_IS
16c50 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
16c60 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65  g) ){.        Me
16c70 6d 50 61 67 65 20 2a 70 50 67 3b 0a 20 20 20 20  mPage *pPg;.    
16c80 20 20 20 20 69 6e 74 20 72 63 20 3d 20 62 74 72      int rc = btr
16c90 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
16ca0 4c 61 73 74 50 67 2c 20 26 70 50 67 2c 20 30 29  LastPg, &pPg, 0)
16cb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
16cc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16cd0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
16ce0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
16cf0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
16d00 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
16d10 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
16d20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
16d30 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pPg);.        if
16d40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16d50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
16d60 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
16d70 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
16d80 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d  iLastPg--;.    }
16d90 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
16da0 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70  rTruncateImage(p
16db0 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 4c 61 73  Bt->pPager, iLas
16dc0 74 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  tPg);.  }.  retu
16dd0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
16de0 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  ./*.** A write-t
16df0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
16e00 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  be opened before
16e10 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
16e20 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65  nction..** It pe
16e30 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20  rforms a single 
16e40 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77  unit of work tow
16e50 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ards an incremen
16e60 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a  tal vacuum..**.*
16e70 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65  * If the increme
16e80 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66  ntal vacuum is f
16e90 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68  inished after th
16ea0 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
16eb0 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  run,.** SQLITE_D
16ec0 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
16ed0 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69   If it is not fi
16ee0 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65  nished, but no e
16ef0 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a  rror occurred,.*
16f00 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
16f10 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
16f20 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  se an SQLite err
16f30 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74  or code. .*/.int
16f40 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63   sqlite3BtreeInc
16f50 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  rVacuum(Btree *p
16f60 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
16f70 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
16f80 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65  ->pBt;..  sqlite
16f90 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
16fa0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
16fb0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
16fc0 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e  ANS_WRITE && p->
16fd0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
16fe0 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70  RITE );.  if( !p
16ff0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
17000 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
17010 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b  E_DONE;.  }else{
17020 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41  .    invalidateA
17030 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
17040 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 69  pBt);.    rc = i
17050 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
17060 74 2c 20 30 2c 20 70 61 67 65 72 50 61 67 65 63  t, 0, pagerPagec
17070 6f 75 6e 74 28 70 42 74 29 29 3b 0a 20 20 7d 0a  ount(pBt));.  }.
17080 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
17090 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
170a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
170b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
170c0 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71  lled prior to sq
170d0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
170e0 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
170f0 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74  ion.** is commit
17100 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76  ed for an auto-v
17110 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a  acuum database..
17120 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
17130 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OK is returned, 
17140 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73  then *pnTrunc is
17150 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
17160 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74  er of pages.** t
17170 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17180 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63   should be trunc
17190 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74  ated to during t
171a0 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
171b0 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20  s. .** i.e. the 
171c0 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
171d0 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f  n reorganized so
171e0 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66   that only the f
171f0 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a  irst *pnTrunc.**
17200 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73   pages are in us
17210 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
17220 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
17230 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
17240 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
17250 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
17260 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
17270 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c  Pager;.  VVA_ONL
17280 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71  Y( int nRef = sq
17290 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
172a0 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  nt(pPager) );.. 
172b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
172c0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
172d0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76  >mutex) );.  inv
172e0 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
172f0 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
17300 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f  assert(pBt->auto
17310 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21  Vacuum);.  if( !
17320 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
17330 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  ){.    Pgno nFin
17340 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
17350 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
17360 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20 61  database after a
17370 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a  utovacuuming */.
17380 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20      Pgno nFree; 
17390 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
173a0 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
173b0 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61   freelist initia
173c0 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  lly */.    Pgno 
173d0 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a  nPtrmap;      /*
173e0 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61   Number of PtrMa
173f0 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66 72  p pages to be fr
17400 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  eed */.    Pgno 
17410 69 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a  iFree;        /*
17420 20 54 68 65 20 6e 65 78 74 20 70 61 67 65 20 74   The next page t
17430 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
17440 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20    int nEntry;   
17450 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
17460 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65  f entries on one
17470 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a   ptrmap page */.
17480 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20      Pgno nOrig; 
17490 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
174a0 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66  se size before f
174b0 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e  reeing */..    n
174c0 4f 72 69 67 20 3d 20 70 61 67 65 72 50 61 67 65  Orig = pagerPage
174d0 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
174e0 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  if( PTRMAP_ISPAG
174f0 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c  E(pBt, nOrig) ||
17500 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f   nOrig==PENDING_
17510 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
17520 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73  {.      /* It is
17530 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
17540 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61   create a databa
17550 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  se for which the
17560 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20   final page.    
17570 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61    ** is either a
17580 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
17590 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67  e or the pending
175a0 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f  -byte page. If o
175b0 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ne.      ** is e
175c0 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73  ncountered, this
175d0 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75   indicates corru
175e0 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ption..      */.
175f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
17600 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
17610 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72  ;.    }..    nFr
17620 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
17630 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
17640 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 45 6e 74  a[36]);.    nEnt
17650 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ry = pBt->usable
17660 53 69 7a 65 2f 35 3b 0a 20 20 20 20 6e 50 74 72  Size/5;.    nPtr
17670 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72  map = (nFree-nOr
17680 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  ig+PTRMAP_PAGENO
17690 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e  (pBt, nOrig)+nEn
176a0 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 20  try)/nEntry;.   
176b0 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20   nFin = nOrig - 
176c0 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b  nFree - nPtrmap;
176d0 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3e 50  .    if( nOrig>P
176e0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
176f0 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45  (pBt) && nFin<PE
17700 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
17710 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 46  pBt) ){.      nF
17720 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  in--;.    }.    
17730 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
17740 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20  PAGE(pBt, nFin) 
17750 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47  || nFin==PENDING
17760 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
17770 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b  ){.      nFin--;
17780 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
17790 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75  Fin>nOrig ) retu
177a0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
177b0 54 5f 42 4b 50 54 3b 0a 0a 20 20 20 20 66 6f 72  T_BKPT;..    for
177c0 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46  (iFree=nOrig; iF
177d0 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d  ree>nFin && rc==
177e0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65  SQLITE_OK; iFree
177f0 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  --){.      rc = 
17800 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
17810 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 29  Bt, nFin, iFree)
17820 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17830 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
17840 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
17850 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b  K) && nFree>0 ){
17860 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
17870 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 72 63 20  TE_OK;.      rc 
17880 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
17890 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
178a0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
178b0 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
178c0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
178d0 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74  ], 0);.      put
178e0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
178f0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30  e1->aData[36], 0
17900 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17910 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
17920 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ge(pBt->pPager, 
17930 6e 46 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  nFin);.    }.   
17940 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17950 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
17960 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
17970 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
17980 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e    }..  assert( n
17990 52 65 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  Ref==sqlite3Page
179a0 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
179b0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
179c0 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66  ;.}..#else /* if
179d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
179e0 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23  _AUTOVACUUM */.#
179f0 20 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64   define setChild
17a00 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54  Ptrmaps(x) SQLIT
17a10 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E_OK.#endif../*.
17a20 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17a30 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
17a40 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68  hase of a two-ph
17a50 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69  ase commit.  Thi
17a60 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75  s routine.** cau
17a70 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  ses a rollback j
17a80 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65  ournal to be cre
17a90 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73  ated (if it does
17aa0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
17ab0 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c  st).** and popul
17ac0 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68  ated with enough
17ad0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20   information so 
17ae0 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20  that if a power 
17af0 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74  loss occurs.** t
17b00 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  he database can 
17b10 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  be restored to i
17b20 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
17b30 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63  e by playing bac
17b40 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k.** the journal
17b50 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74  .  Then the cont
17b60 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ents of the jour
17b70 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20  nal are flushed 
17b80 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69  out to.** the di
17b90 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a  sk.  After the j
17ba0 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79  ournal is safely
17bb0 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63   on oxide, the c
17bc0 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a  hanges to the.**
17bd0 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72   database are wr
17be0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64  itten into the d
17bf0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
17c00 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64   flushed to oxid
17c10 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64  e..** At the end
17c20 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74   of this call, t
17c30 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
17c40 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73  nal still exists
17c50 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20   on the.** disk 
17c60 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c  and we are still
17c70 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63   holding all loc
17c80 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73  ks, so the trans
17c90 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a  action has not.*
17ca0 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65  * committed.  Se
17cb0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
17cc0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 66  mmitPhaseTwo() f
17cd0 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68  or the second ph
17ce0 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  ase of the.** co
17cf0 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  mmit process..**
17d00 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73  .** This call is
17d10 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77   a no-op if no w
17d20 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
17d30 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63   is currently ac
17d40 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a  tive on pBt..**.
17d50 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79  ** Otherwise, sy
17d60 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
17d70 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72  file for the btr
17d80 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20  ee pBt. zMaster 
17d90 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
17da0 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
17db0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
17dc0 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
17dd0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a  itten into the.*
17de0 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  * individual jou
17df0 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73  rnal file, or is
17e00 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e   NULL, indicatin
17e10 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  g no master jour
17e20 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69  nal file .** (si
17e30 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
17e40 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a  ansaction)..**.*
17e50 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
17e60 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65  alled, the maste
17e70 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64  r journal should
17e80 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65   already have be
17e90 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70  en.** created, p
17ea0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68  opulated with th
17eb0 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  is journal point
17ec0 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f  er and synced to
17ed0 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63   disk..**.** Onc
17ee0 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e  e this is routin
17ef0 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20  e has returned, 
17f00 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72  the only thing r
17f10 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69  equired to commi
17f20 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74  t.** the write-t
17f30 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74  ransaction for t
17f40 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c  his database fil
17f50 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74  e is to delete t
17f60 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69  he journal..*/.i
17f70 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
17f80 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74  ommitPhaseOne(Bt
17f90 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ree *p, const ch
17fa0 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
17fb0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
17fc0 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  OK;.  if( p->inT
17fd0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
17fe0 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  E ){.    BtShare
17ff0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
18000 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
18010 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64  eEnter(p);.#ifnd
18020 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
18030 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
18040 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
18050 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  m ){.      rc = 
18060 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
18070 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28  (pBt);.      if(
18080 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18090 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
180a0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
180b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
180c0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
180d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d  .#endif.    rc =
180e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
180f0 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d  mitPhaseOne(pBt-
18100 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  >pPager, zMaster
18110 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
18120 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
18130 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18140 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
18150 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
18160 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65  d from both Btre
18170 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
18180 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62  ) and BtreeRollb
18190 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20  ack().** at the 
181a0 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20  conclusion of a 
181b0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
181c0 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
181d0 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
181e0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
181f0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
18200 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
18210 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
18220 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 20 20 62  Mutex(p) );..  b
18230 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
18240 65 6e 74 28 70 42 74 29 3b 0a 20 20 69 66 28 20  ent(pBt);.  if( 
18250 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53  p->inTrans>TRANS
18260 5f 4e 4f 4e 45 20 26 26 20 70 2d 3e 64 62 2d 3e  _NONE && p->db->
18270 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e 31 20  activeVdbeCnt>1 
18280 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
18290 72 65 20 61 72 65 20 6f 74 68 65 72 20 61 63 74  re are other act
182a0 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ive statements t
182b0 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68  hat belong to th
182c0 69 73 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  is database.    
182d0 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67  ** handle, downg
182e0 72 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f  rade to a read-o
182f0 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  nly transaction.
18300 20 54 68 65 20 6f 74 68 65 72 20 73 74 61 74 65   The other state
18310 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79  ments.    ** may
18320 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e   still be readin
18330 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  g from the datab
18340 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77  ase.  */.    dow
18350 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
18360 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
18370 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  );.    p->inTran
18380 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  s = TRANS_READ;.
18390 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
183a0 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
183b0 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72  d any kind of tr
183c0 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
183d0 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20  decrement the . 
183e0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
183f0 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73  n count of the s
18400 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20  hared btree. If 
18410 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
18420 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65  count .    ** re
18430 61 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65  aches 0, set the
18440 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
18450 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65   TRANS_NONE. The
18460 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
18470 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61  used().    ** ca
18480 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e  ll below will un
18490 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20  lock the pager. 
184a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   */.    if( p->i
184b0 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f  nTrans!=TRANS_NO
184c0 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61  NE ){.      clea
184d0 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  rAllSharedCacheT
184e0 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
184f0 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
18500 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69  ction--;.      i
18510 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e  f( 0==pBt->nTran
18520 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
18530 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
18540 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f  ction = TRANS_NO
18550 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
18560 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  }..    /* Set th
18570 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
18580 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54  ction state to T
18590 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e  RANS_NONE and un
185a0 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a  lock the .    **
185b0 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63   pager if this c
185c0 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f  all closed the o
185d0 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74  nly read or writ
185e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
185f0 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  */.    p->inTran
18600 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
18610 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
18620 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
18630 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  }..  btreeIntegr
18640 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ity(p);.}../*.**
18650 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   Commit the tran
18660 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  saction currentl
18670 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a  y in progress..*
18680 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
18690 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  e implements the
186a0 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
186b0 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69   a 2-phase commi
186c0 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74  t.  The.** sqlit
186d0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
186e0 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20  seOne() routine 
186f0 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
18700 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a  hase and should.
18710 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72  ** be invoked pr
18720 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
18730 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68  his routine.  Th
18740 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
18750 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a  mmitPhaseOne().*
18760 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c  * routine did al
18770 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72  l the work of wr
18780 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iting informatio
18790 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e  n out to disk an
187a0 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a  d flushing the.*
187b0 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68  * contents so th
187c0 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74  at they are writ
187d0 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73  ten onto the dis
187e0 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20  k platter.  All 
187f0 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
18800 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c  has to do is del
18810 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ete or truncate 
18820 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64  or zero the head
18830 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65  er in the.** the
18840 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
18850 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20  l (which causes 
18860 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
18870 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a  to commit) and.*
18880 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a  * drop locks..**
18890 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
188a0 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
188b0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
188c0 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
188d0 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
188e0 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
188f0 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
18900 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
18910 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
18920 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
18930 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
18940 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
18950 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >pBt;..  sqlite3
18960 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
18970 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
18980 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
18990 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72   handle has a wr
189a0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
189b0 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65  open, commit the
189c0 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a   shared-btrees .
189d0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
189e0 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61   and set the sha
189f0 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41  red state to TRA
18a00 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20  NS_READ..  */.  
18a10 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
18a20 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
18a30 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61     int rc;.    a
18a40 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
18a50 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
18a60 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73  _WRITE );.    as
18a70 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e  sert( pBt->nTran
18a80 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20  saction>0 );.   
18a90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
18aa0 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  erCommitPhaseTwo
18ab0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
18ac0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18ad0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
18ae0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
18af0 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
18b00 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
18b10 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
18b20 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
18b30 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
18b40 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
18b50 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
18b60 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
18b70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
18b80 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73  .** Do both phas
18b90 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a  es of a commit..
18ba0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
18bb0 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20  reeCommit(Btree 
18bc0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
18bd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
18be0 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71  er(p);.  rc = sq
18bf0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
18c00 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a  PhaseOne(p, 0);.
18c10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18c20 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
18c30 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
18c40 69 74 50 68 61 73 65 54 77 6f 28 70 29 3b 0a 20  itPhaseTwo(p);. 
18c50 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
18c60 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
18c70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
18c80 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ef NDEBUG./*.** 
18c90 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
18ca0 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73 6f  r of write-curso
18cb0 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20  rs open on this 
18cc0 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20  handle. This is 
18cd0 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73  for use.** in as
18ce0 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f  sert() expressio
18cf0 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c  ns, so it is onl
18d00 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44  y compiled if ND
18d10 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64  EBUG is not.** d
18d20 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  efined..**.** Fo
18d30 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
18d40 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  f this routine, 
18d50 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69  a write-cursor i
18d60 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61  s any cursor tha
18d70 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20  t.** is capable 
18d80 6f 66 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  of writing to th
18d90 65 20 64 61 74 61 62 73 65 2e 20 20 54 68 61 74  e databse.  That
18da0 20 6d 65 61 6e 73 20 74 68 65 20 63 75 72 73 6f   means the curso
18db0 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e 61  r was.** origina
18dc0 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 77  lly opened for w
18dd0 72 69 74 69 6e 67 20 61 6e 64 20 74 68 65 20 63  riting and the c
18de0 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 62 65  ursor has not be
18df0 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79 20   disabled.** by 
18e00 68 61 76 69 6e 67 20 69 74 73 20 73 74 61 74 65  having its state
18e10 20 63 68 61 6e 67 65 64 20 74 6f 20 43 55 52 53   changed to CURS
18e20 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61  OR_FAULT..*/.sta
18e30 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69  tic int countWri
18e40 74 65 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  teCursors(BtShar
18e50 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
18e60 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e  rsor *pCur;.  in
18e70 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  t r = 0;.  for(p
18e80 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  Cur=pBt->pCursor
18e90 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75  ; pCur; pCur=pCu
18ea0 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  r->pNext){.    i
18eb0 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  f( pCur->wrFlag 
18ec0 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  && pCur->eState!
18ed0 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20  =CURSOR_FAULT ) 
18ee0 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75  r++; .  }.  retu
18ef0 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn r;.}.#endif..
18f00 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
18f10 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61 74  ne sets the stat
18f20 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c  e to CURSOR_FAUL
18f30 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a  T and the error.
18f40 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f  ** code to errCo
18f50 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75 72  de for every cur
18f60 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64 20  sor on BtShared 
18f70 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72  that pBtree.** r
18f80 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a  eferences..**.**
18f90 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73   Every cursor is
18fa0 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64   tripped, includ
18fb0 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61 74  ing cursors that
18fc0 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74   belong.** to ot
18fd0 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
18fe0 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  nections that ha
18ff0 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72 69  ppen to be shari
19000 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20  ng.** the cache 
19010 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a  with pBtree..**.
19020 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19030 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  gets called when
19040 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
19050 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f  rs..** All curso
19060 72 73 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  rs using the sam
19070 65 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20  e cache must be 
19080 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72  tripped.** to pr
19090 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20  event them from 
190a0 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68  trying to use th
190b0 65 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a 2a  e btree after.**
190c0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20   the rollback.  
190d0 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  The rollback may
190e0 20 68 61 76 65 20 64 65 6c 65 74 65 64 20 74 61   have deleted ta
190f0 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64  bles.** or moved
19100 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20   root pages, so 
19110 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63  it is not suffic
19120 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20  ient to.** save 
19130 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
19140 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75   cursor.  The cu
19150 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20  rsor must be.** 
19160 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a  invalidated..*/.
19170 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
19180 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
19190 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69  Btree *pBtree, i
191a0 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20 42  nt errCode){.  B
191b0 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73 71  tCursor *p;.  sq
191c0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
191d0 70 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28 70  pBtree);.  for(p
191e0 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
191f0 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
19200 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69  Next){.    int i
19210 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
19220 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29  eeClearCursor(p)
19230 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20  ;.    p->eState 
19240 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a  = CURSOR_FAULT;.
19250 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20      p->skipNext 
19260 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 66  = errCode;.    f
19270 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50  or(i=0; i<=p->iP
19280 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
19290 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e   releasePage(p->
192a0 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
192b0 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d    p->apPage[i] =
192c0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
192d0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
192e0 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a  e(pBtree);.}../*
192f0 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65  .** Rollback the
19300 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
19310 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63  progress.  All c
19320 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a  ursors will be.*
19330 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74  * invalided by t
19340 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  his operation.  
19350 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
19360 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74  se a cursor.** t
19370 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20  hat was open at 
19380 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
19390 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
193a0 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69  will result.** i
193b0 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n an error..**.*
193c0 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
193d0 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
193e0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
193f0 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
19400 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
19410 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
19420 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
19430 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
19440 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
19450 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a  Rollback(Btree *
19460 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
19470 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
19480 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  p->pBt;.  MemPag
19490 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73 71  e *pPage1;..  sq
194a0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
194b0 70 29 3b 0a 20 20 72 63 20 3d 20 73 61 76 65 41  p);.  rc = saveA
194c0 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
194d0 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
194e0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
194f0 5f 43 41 43 48 45 0a 20 20 69 66 28 20 72 63 21  _CACHE.  if( rc!
19500 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19510 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 68    /* This is a h
19520 6f 72 72 69 62 6c 65 20 73 69 74 75 61 74 69 6f  orrible situatio
19530 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c  n. An IO or mall
19540 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72  oc() error occur
19550 72 65 64 20 77 68 69 6c 73 74 0a 20 20 20 20 2a  red whilst.    *
19560 2a 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65  * trying to save
19570 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
19580 73 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  s. If this is an
19590 20 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62   automatic rollb
195a0 61 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20 74  ack (as.    ** t
195b0 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20 63  he result of a c
195c0 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f  onstraint, mallo
195d0 63 28 29 20 66 61 69 6c 75 72 65 20 6f 72 20 49  c() failure or I
195e0 4f 20 65 72 72 6f 72 29 20 74 68 65 6e 20 0a 20  O error) then . 
195f0 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68 65 20     ** the cache 
19600 6d 61 79 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c  may be internall
19610 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28  y inconsistent (
19620 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69  not contain vali
19630 64 20 74 72 65 65 73 29 20 73 6f 0a 20 20 20 20  d trees) so.    
19640 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d  ** we cannot sim
19650 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 65  ply return the e
19660 72 72 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c  rror to the call
19670 65 72 2e 20 49 6e 73 74 65 61 64 2c 20 61 62 6f  er. Instead, abo
19680 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71  rt .    ** all q
19690 75 65 72 69 65 73 20 74 68 61 74 20 6d 61 79 20  ueries that may 
196a0 62 65 20 75 73 69 6e 67 20 61 6e 79 20 6f 66 20  be using any of 
196b0 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  the cursors that
196c0 20 66 61 69 6c 65 64 20 74 6f 20 73 61 76 65 2e   failed to save.
196d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
196e0 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
196f0 75 72 73 6f 72 73 28 70 2c 20 72 63 29 3b 0a 20  ursors(p, rc);. 
19700 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74 72 65   }.#endif.  btre
19710 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
19720 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
19730 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
19740 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20  .    int rc2;.. 
19750 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53     assert( TRANS
19760 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54  _WRITE==pBt->inT
19770 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20  ransaction );.  
19780 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50    rc2 = sqlite3P
19790 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74  agerRollback(pBt
197a0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
197b0 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f  f( rc2!=SQLITE_O
197c0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
197d0 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rc2;.    }..    
197e0 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20  /* The rollback 
197f0 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79  may have destroy
19800 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61  ed the pPage1->a
19810 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a  Data value.  So.
19820 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65      ** call btre
19830 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61  eGetPage() on pa
19840 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61  ge 1 again to ma
19850 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70  ke.    ** sure p
19860 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20  Page1->aData is 
19870 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a  set correctly. *
19880 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65 65 47  /.    if( btreeG
19890 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
198a0 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49  pPage1, 0)==SQLI
198b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
198c0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
198d0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
198e0 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65  sert( countWrite
198f0 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20  Cursors(pBt)==0 
19900 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  );.    pBt->inTr
19910 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
19920 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 62  S_READ;.  }..  b
19930 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
19940 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  on(p);.  sqlite3
19950 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
19960 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19970 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61  *.** Start a sta
19980 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
19990 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72  ction. The subtr
199a0 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 63 61  ansaction can ca
199b0 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62  n be rolled.** b
199c0 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c  ack independentl
199d0 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72  y of the main tr
199e0 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d  ansaction. You m
199f0 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e  ust start a tran
19a00 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f  saction .** befo
19a10 72 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75  re starting a su
19a20 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68  btransaction. Th
19a30 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
19a40 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61   is ended automa
19a50 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74  tically .** if t
19a60 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
19a70 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72  ion commits or r
19a80 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  olls back..**.**
19a90 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   Statement subtr
19aa0 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75  ansactions are u
19ab0 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76  sed around indiv
19ac0 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  idual SQL statem
19ad0 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65  ents.** that are
19ae0 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
19af0 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d  n a BEGIN...COMM
19b00 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20  IT block.  If a 
19b10 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72  constraint.** er
19b20 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69  ror occurs withi
19b30 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c  n the statement,
19b40 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74   the effect of t
19b50 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e  hat one statemen
19b60 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c  t.** can be roll
19b70 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ed back without 
19b80 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  having to rollba
19b90 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  ck the entire tr
19ba0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
19bb0 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   A statement sub
19bc0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
19bd0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
19be0 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  n anonymous save
19bf0 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61  point. The.** va
19c00 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
19c10 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
19c20 65 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20  er is the total 
19c30 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f  number of savepo
19c40 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69  ints,.** includi
19c50 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79  ng the new anony
19c60 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20  mous savepoint, 
19c70 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72  open on the B-Tr
19c80 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72  ee. i.e. if ther
19c90 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
19ca0 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
19cb0 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65  d no other state
19cc0 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e  ment-transaction
19cd0 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74  s open,.** iStat
19ce0 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73  ement is 1. This
19cf0 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
19d00 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65  oint can be rele
19d10 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  ased or rolled b
19d20 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ack.** using the
19d30 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
19d40 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f  epoint() functio
19d50 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
19d60 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28  3BtreeBeginStmt(
19d70 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53  Btree *p, int iS
19d80 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74  tatement){.  int
19d90 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
19da0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
19db0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
19dc0 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
19dd0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
19de0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
19df0 73 65 72 74 28 20 70 42 74 2d 3e 72 65 61 64 4f  sert( pBt->readO
19e00 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  nly==0 );.  asse
19e10 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30  rt( iStatement>0
19e20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
19e30 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e  tatement>p->db->
19e40 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20  nSavepoint );.  
19e50 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 69 6e 54  if( NEVER(p->inT
19e60 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
19e70 45 20 7c 7c 20 70 42 74 2d 3e 72 65 61 64 4f 6e  E || pBt->readOn
19e80 6c 79 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ly) ){.    rc = 
19e90 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b  SQLITE_INTERNAL;
19ea0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
19eb0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
19ec0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
19ed0 57 52 49 54 45 20 29 3b 0a 20 20 20 20 2f 2a 20  WRITE );.    /* 
19ee0 41 74 20 74 68 65 20 70 61 67 65 72 20 6c 65 76  At the pager lev
19ef0 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  el, a statement 
19f00 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
19f10 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a   savepoint with.
19f20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20      ** an index 
19f30 67 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c  greater than all
19f40 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61   savepoints crea
19f50 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75  ted explicitly u
19f60 73 69 6e 67 0a 20 20 20 20 2a 2a 20 53 51 4c 20  sing.    ** SQL 
19f70 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69  statements. It i
19f80 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65  s illegal to ope
19f90 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f  n, release or ro
19fa0 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 20 20 2a  llback any.    *
19fb0 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74  * such savepoint
19fc0 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74  s while the stat
19fd0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
19fe0 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  n savepoint is a
19ff0 63 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ctive..    */.  
1a000 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1a010 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
1a020 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53  (pBt->pPager, iS
1a030 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20  tatement);.  }. 
1a040 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1a050 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1a060 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
1a070 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1a080 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1a090 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73  n, op, is always
1a0a0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
1a0b0 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f  ACK.** or SAVEPO
1a0c0 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69  INT_RELEASE. Thi
1a0d0 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65  s function eithe
1a0e0 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f  r releases or ro
1a0f0 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20  lls back the.** 
1a100 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69  savepoint identi
1a110 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
1a120 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65  r iSavepoint, de
1a130 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76  pending on the v
1a140 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a  alue .** of op..
1a150 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
1a160 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72  iSavepoint is gr
1a170 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
1a180 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77  ual to zero. How
1a190 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a  ever, if op is.*
1a1a0 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  * SAVEPOINT_ROLL
1a1b0 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65  BACK, then iSave
1a1c0 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62  point may also b
1a1d0 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61  e -1. In this ca
1a1e0 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  se the .** conte
1a1f0 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72  nts of the entir
1a200 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e transaction ar
1a210 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54  e rolled back. T
1a220 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74  his is different
1a230 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61  .** from a norma
1a240 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  l transaction ro
1a250 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f  llback, as no lo
1a260 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64  cks are released
1a270 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e   and the.** tran
1a280 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20  saction remains 
1a290 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  open..*/.int sql
1a2a0 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
1a2b0 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
1a2c0 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f   op, int iSavepo
1a2d0 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
1a2e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
1a2f0 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ( p && p->inTran
1a300 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1a310 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
1a320 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1a330 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41    assert( op==SA
1a340 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
1a350 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  || op==SAVEPOINT
1a360 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20  _ROLLBACK );.   
1a370 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f   assert( iSavepo
1a380 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65  int>=0 || (iSave
1a390 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d  point==-1 && op=
1a3a0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
1a3b0 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ACK) );.    sqli
1a3c0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1a3d0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1a3e0 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e3PagerSavepoint
1a3f0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70  (pBt->pPager, op
1a400 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
1a410 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1a420 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1a430 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
1a440 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  Bt);.    }.    s
1a450 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1a460 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
1a470 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
1a480 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73  reate a new curs
1a490 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65  or for the BTree
1a4a0 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f   whose root is o
1a4b0 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54  n the page.** iT
1a4c0 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d  able. If a read-
1a4d0 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72  only cursor is r
1a4e0 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20  equested, it is 
1a4f0 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
1a500 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61  the caller alrea
1a510 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74 20  dy has at least 
1a520 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e  a read-only tran
1a530 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20  saction open.** 
1a540 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1a550 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77 72  already. If a wr
1a560 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65  ite-cursor is re
1a570 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a  quested, then.**
1a580 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61   the caller is a
1a590 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61  ssumed to have a
1a5a0 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
1a5b0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
1a5c0 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68  If wrFlag==0, th
1a5d0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
1a5e0 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66  n only be used f
1a5f0 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49  or reading..** I
1a600 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65  f wrFlag==1, the
1a610 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
1a620 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
1a630 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77  ding or for.** w
1a640 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20  riting if other 
1a650 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77  conditions for w
1a660 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20  riting are also 
1a670 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61  met.  These.** a
1a680 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  re the condition
1a690 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d  s that must be m
1a6a0 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20  et in order for 
1a6b0 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65  writing to.** be
1a6c0 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20   allowed:.**.** 
1a6d0 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  1:  The cursor m
1a6e0 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  ust have been op
1a6f0 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67  ened with wrFlag
1a700 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74  ==1.**.** 2:  Ot
1a710 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
1a720 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68  nections that sh
1a730 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67  are the same pag
1a740 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20  er cache.**     
1a750 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f  but which are no
1a760 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e  t in the READ_UN
1a770 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20  COMMITTED state 
1a780 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20  may not have.** 
1a790 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e      cursors open
1a7a0 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20   with wrFlag==0 
1a7b0 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c  on the same tabl
1a7c0 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a  e.  Otherwise.**
1a7d0 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73       the changes
1a7e0 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72   made by this wr
1a7f0 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64  ite cursor would
1a800 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a   be visible to.*
1a810 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63  *     the read c
1a820 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74  ursors in the ot
1a830 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
1a840 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33  nection..**.** 3
1a850 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  :  The database 
1a860 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65  must be writable
1a870 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e   (not on read-on
1a880 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20  ly media).**.** 
1a890 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62  4:  There must b
1a8a0 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e  e an active tran
1a8b0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e  saction..**.** N
1a8c0 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f  o checking is do
1a8d0 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ne to make sure 
1a8e0 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65  that page iTable
1a8f0 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a   really is the.*
1a900 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  * root page of a
1a910 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20   b-tree.  If it 
1a920 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65  is not, then the
1a930 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64   cursor acquired
1a940 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  .** will not wor
1a950 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a  k correctly..**.
1a960 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
1a970 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
1a980 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f  3BtreeCursorZero
1a990 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  () has been call
1a9a0 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f  ed.** on pCur to
1a9b0 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
1a9c0 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69  memory space pri
1a9d0 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74  or to invoking t
1a9e0 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
1a9f0 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
1aa00 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
1aa10 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa30 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
1aa40 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1aa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
1aa70 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
1aa80 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
1aa90 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
1aaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aab0 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
1aac0 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
1aad0 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
1aae0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
1aaf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1ab00 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61  rst arg to compa
1ab10 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a  rison function *
1ab20 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
1ab30 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
1ab40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
1ab50 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73  ace for new curs
1ab60 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  or */.){.  BtSha
1ab70 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1ab80 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1ab90 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72    /* Shared b-tr
1aba0 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20  ee handle */..  
1abb0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
1abc0 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
1abd0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  ) );.  assert( w
1abe0 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c  rFlag==0 || wrFl
1abf0 61 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  ag==1 );..  /* T
1ac00 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
1ac10 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76  ert statements v
1ac20 65 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68  erify that if th
1ac30 69 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65  is is a sharable
1ac40 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61   .  ** b-tree da
1ac50 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e  tabase, the conn
1ac60 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
1ac70 67 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  g the required t
1ac80 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a  able locks, .  *
1ac90 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74  * and that no ot
1aca0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  her connection h
1acb0 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73  as any open curs
1acc0 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74  or that conflict
1acd0 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69  s with .  ** thi
1ace0 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73  s lock.  */.  as
1acf0 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43  sert( hasSharedC
1ad00 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
1ad10 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66   iTable, pKeyInf
1ad20 6f 21 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29 20  o!=0, wrFlag+1) 
1ad30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
1ad40 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65  lag==0 || !hasRe
1ad50 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69  adConflicts(p, i
1ad60 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  Table) );..  /* 
1ad70 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
1ad80 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65  caller has opene
1ad90 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  d the required t
1ada0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20  ransaction. */. 
1adb0 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
1adc0 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ans>TRANS_NONE )
1add0 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
1ade0 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72  ag==0 || p->inTr
1adf0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1ae00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
1ae10 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74  t->pPage1 && pBt
1ae20 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
1ae30 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  );..  if( NEVER(
1ae40 77 72 46 6c 61 67 20 26 26 20 70 42 74 2d 3e 72  wrFlag && pBt->r
1ae50 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  eadOnly) ){.    
1ae60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
1ae70 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  ADONLY;.  }.  if
1ae80 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 70  ( iTable==1 && p
1ae90 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
1aea0 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  t)==0 ){.    ret
1aeb0 75 72 6e 20 53 51 4c 49 54 45 5f 45 4d 50 54 59  urn SQLITE_EMPTY
1aec0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
1aed0 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72  that no other er
1aee0 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20  rors can occur, 
1aef0 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69  finish filling i
1af00 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20  n the BtCursor. 
1af10 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e   ** variables an
1af20 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f  d link the curso
1af30 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61  r into the BtSha
1af40 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20  red list.  */.  
1af50 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d  pCur->pgnoRoot =
1af60 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20   (Pgno)iTable;. 
1af70 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
1af80 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49  1;.  pCur->pKeyI
1af90 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
1afa0 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d    pCur->pBtree =
1afb0 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20   p;.  pCur->pBt 
1afc0 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77  = pBt;.  pCur->w
1afd0 72 46 6c 61 67 20 3d 20 28 75 38 29 77 72 46 6c  rFlag = (u8)wrFl
1afe0 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78  ag;.  pCur->pNex
1aff0 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  t = pBt->pCursor
1b000 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e  ;.  if( pCur->pN
1b010 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ext ){.    pCur-
1b020 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
1b030 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d  pCur;.  }.  pBt-
1b040 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b  >pCursor = pCur;
1b050 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
1b060 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
1b070 3b 0a 20 20 70 43 75 72 2d 3e 63 61 63 68 65 64  ;.  pCur->cached
1b080 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 72 65 74  Rowid = 0;.  ret
1b090 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1b0a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1b0b0 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
1b0c0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1b0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
1b0f0 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
1b100 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
1b110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b120 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1b130 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
1b140 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
1b150 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
1b160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b170 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
1b180 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
1b190 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
1b1a0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
1b1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1c0 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
1b1d0 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20  xCompare() */.  
1b1e0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20  BtCursor *pCur  
1b1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1b210 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20  rite new cursor 
1b220 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
1b230 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
1b240 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
1b250 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28  c = btreeCursor(
1b260 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61  p, iTable, wrFla
1b270 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75  g, pKeyInfo, pCu
1b280 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  r);.  sqlite3Btr
1b290 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1b2a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1b2b0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
1b2c0 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20  e of a BtCursor 
1b2d0 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e  object in bytes.
1b2e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65  .**.** This inte
1b2f0 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65 64  rfaces is needed
1b300 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f   so that users o
1b310 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72  f cursors can pr
1b320 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66  eallocate.** suf
1b330 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20  ficient storage 
1b340 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72  to hold a cursor
1b350 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72 20  .  The BtCursor 
1b360 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65  object is opaque
1b370 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20  .** to users so 
1b380 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74  they cannot do t
1b390 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d  he sizeof() them
1b3a0 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75  selves - they mu
1b3b0 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20  st call.** this 
1b3c0 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20  routine..*/.int 
1b3d0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1b3e0 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20  orSize(void){.  
1b3f0 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69  return ROUND8(si
1b400 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b  zeof(BtCursor));
1b410 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
1b420 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74  lize memory that
1b430 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74   will be convert
1b440 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73  ed into a BtCurs
1b450 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  or object..**.**
1b460 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72   The simple appr
1b470 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20  oach here would 
1b480 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74  be to memset() t
1b490 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74  he entire object
1b4a0 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75  .** to zero.  Bu
1b4b0 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74  t it turns out t
1b4c0 68 61 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d  hat the apPage[]
1b4d0 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72   and aiIdx[] arr
1b4e0 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65  ays.** do not ne
1b4f0 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20  ed to be zeroed 
1b500 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61 72  and they are lar
1b510 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61  ge, so we can sa
1b520 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72  ve a lot.** of r
1b530 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70  un-time by skipp
1b540 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69  ing the initiali
1b550 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20  zation of those 
1b560 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69  elements..*/.voi
1b570 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  d sqlite3BtreeCu
1b580 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f  rsorZero(BtCurso
1b590 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28  r *p){.  memset(
1b5a0 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42  p, 0, offsetof(B
1b5b0 74 43 75 72 73 6f 72 2c 20 69 50 61 67 65 29 29  tCursor, iPage))
1b5c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
1b5d0 68 65 20 63 61 63 68 65 64 20 72 6f 77 69 64 20  he cached rowid 
1b5e0 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 63  value of every c
1b5f0 75 72 73 6f 72 20 69 6e 20 74 68 65 20 73 61 6d  ursor in the sam
1b600 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
1b610 2a 2a 20 61 73 20 70 43 75 72 20 61 6e 64 20 68  ** as pCur and h
1b620 61 76 69 6e 67 20 74 68 65 20 73 61 6d 65 20 72  aving the same r
1b630 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
1b640 61 73 20 70 43 75 72 2e 20 20 54 68 65 20 76 61  as pCur.  The va
1b650 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  lue is.** set to
1b660 20 69 52 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f   iRowid..**.** O
1b670 6e 6c 79 20 70 6f 73 69 74 69 76 65 20 72 6f 77  nly positive row
1b680 69 64 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f  id values are co
1b690 6e 73 69 64 65 72 65 64 20 76 61 6c 69 64 20 66  nsidered valid f
1b6a0 6f 72 20 74 68 69 73 20 63 61 63 68 65 2e 0a 2a  or this cache..*
1b6b0 2a 20 54 68 65 20 63 61 63 68 65 20 69 73 20 69  * The cache is i
1b6c0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
1b6d0 72 6f 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61  ro, indicating a
1b6e0 6e 20 69 6e 76 61 6c 69 64 20 63 61 63 68 65 2e  n invalid cache.
1b6f0 0a 2a 2a 20 41 20 62 74 72 65 65 20 77 69 6c 6c  .** A btree will
1b700 20 77 6f 72 6b 20 66 69 6e 65 20 77 69 74 68 20   work fine with 
1b710 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
1b720 20 72 6f 77 69 64 73 2e 20 20 57 65 20 6a 75 73   rowids.  We jus
1b730 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20 63 61 63 68  t cannot.** cach
1b740 65 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  e zero or negati
1b750 76 65 20 72 6f 77 69 64 73 2c 20 77 68 69 63 68  ve rowids, which
1b760 20 6d 65 61 6e 73 20 74 61 62 6c 65 73 20 74 68   means tables th
1b770 61 74 20 75 73 65 20 7a 65 72 6f 20 6f 72 0a 2a  at use zero or.*
1b780 2a 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64  * negative rowid
1b790 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69  s might run a li
1b7a0 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 42 75  ttle slower.  Bu
1b7b0 74 20 69 6e 20 70 72 61 63 74 69 63 65 2c 20 7a  t in practice, z
1b7c0 65 72 6f 0a 2a 2a 20 6f 72 20 6e 65 67 61 74 69  ero.** or negati
1b7d0 76 65 20 72 6f 77 69 64 73 20 61 72 65 20 76 65  ve rowids are ve
1b7e0 72 79 20 75 6e 63 6f 6d 6d 6f 6e 20 73 6f 20 74  ry uncommon so t
1b7f0 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  his should not b
1b800 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a  e a problem..*/.
1b810 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
1b820 65 53 65 74 43 61 63 68 65 64 52 6f 77 69 64 28  eSetCachedRowid(
1b830 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1b840 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 52  sqlite3_int64 iR
1b850 6f 77 69 64 29 7b 0a 20 20 42 74 43 75 72 73 6f  owid){.  BtCurso
1b860 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 43  r *p;.  for(p=pC
1b870 75 72 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ur->pBt->pCursor
1b880 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
1b890 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e  {.    if( p->pgn
1b8a0 6f 52 6f 6f 74 3d 3d 70 43 75 72 2d 3e 70 67 6e  oRoot==pCur->pgn
1b8b0 6f 52 6f 6f 74 20 29 20 70 2d 3e 63 61 63 68 65  oRoot ) p->cache
1b8c0 64 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b  dRowid = iRowid;
1b8d0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1b8e0 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  Cur->cachedRowid
1b8f0 3d 3d 69 52 6f 77 69 64 20 29 3b 0a 7d 0a 0a 2f  ==iRowid );.}../
1b900 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1b910 63 61 63 68 65 64 20 72 6f 77 69 64 20 66 6f 72  cached rowid for
1b920 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
1b930 72 2e 20 20 41 20 6e 65 67 61 74 69 76 65 20 6f  r.  A negative o
1b940 72 20 7a 65 72 6f 0a 2a 2a 20 72 65 74 75 72 6e  r zero.** return
1b950 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73   value indicates
1b960 20 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20   that the rowid 
1b970 63 61 63 68 65 20 69 73 20 69 6e 76 61 6c 69 64  cache is invalid
1b980 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 0a 2a   and should be.*
1b990 2a 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 74  * ignored.  If t
1b9a0 68 65 20 72 6f 77 69 64 20 63 61 63 68 65 20 68  he rowid cache h
1b9b0 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20  as never before 
1b9c0 62 65 65 6e 20 73 65 74 2c 20 74 68 65 6e 20 61  been set, then a
1b9d0 0a 2a 2a 20 7a 65 72 6f 20 69 73 20 72 65 74 75  .** zero is retu
1b9e0 72 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  rned..*/.sqlite3
1b9f0 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 42 74  _int64 sqlite3Bt
1ba00 72 65 65 47 65 74 43 61 63 68 65 64 52 6f 77 69  reeGetCachedRowi
1ba10 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
1ba20 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
1ba30 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 3b 0a 7d  ->cachedRowid;.}
1ba40 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
1ba50 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61  cursor.  The rea
1ba60 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
1ba70 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72  tabase file is r
1ba80 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20  eleased.** when 
1ba90 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20  the last cursor 
1baa0 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e  is closed..*/.in
1bab0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
1bac0 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73  oseCursor(BtCurs
1bad0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72  or *pCur){.  Btr
1bae0 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75  ee *pBtree = pCu
1baf0 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28  r->pBtree;.  if(
1bb00 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69   pBtree ){.    i
1bb10 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72  nt i;.    BtShar
1bb20 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
1bb30 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBt;.    sqlite3
1bb40 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
1bb50 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  e);.    sqlite3B
1bb60 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
1bb70 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70  pCur);.    if( p
1bb80 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  Cur->pPrev ){.  
1bb90 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d      pCur->pPrev-
1bba0 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70  >pNext = pCur->p
1bbb0 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
1bbc0 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72  .      pBt->pCur
1bbd0 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  sor = pCur->pNex
1bbe0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
1bbf0 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a   pCur->pNext ){.
1bc00 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78        pCur->pNex
1bc10 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d  t->pPrev = pCur-
1bc20 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20  >pPrev;.    }.  
1bc30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
1bc40 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
1bc50 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1bc60 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
1bc70 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75  i]);.    }.    u
1bc80 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
1bc90 65 64 28 70 42 74 29 3b 0a 20 20 20 20 69 6e 76  ed(pBt);.    inv
1bca0 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
1bcb0 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 20 20  ache(pCur);.    
1bcc0 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  /* sqlite3_free(
1bcd0 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71  pCur); */.    sq
1bce0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1bcf0 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  pBtree);.  }.  r
1bd00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1bd10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
1bd20 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72  ure the BtCursor
1bd30 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  * given in the a
1bd40 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61  rgument has a va
1bd50 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  lid.** BtCursor.
1bd60 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  info structure. 
1bd70 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   If it is not al
1bd80 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c  ready valid, cal
1bd90 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  l.** btreeParseC
1bda0 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74  ell() to fill it
1bdb0 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72   in..**.** BtCur
1bdc0 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61  sor.info is a ca
1bdd0 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72  che of the infor
1bde0 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75  mation in the cu
1bdf0 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55  rrent cell..** U
1be00 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20  sing this cache 
1be10 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62  reduces the numb
1be20 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62  er of calls to b
1be30 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e  treeParseCell().
1be40 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32  .**.** 2007-06-2
1be50 35 3a 20 20 54 68 65 72 65 20 69 73 20 61 20 62  5:  There is a b
1be60 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69  ug in some versi
1be70 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74  ons of MSVC that
1be80 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f   cause the.** co
1be90 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20  mpiler to crash 
1bea0 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f  when getCellInfo
1beb0 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  () is implemente
1bec0 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a  d as a macro..**
1bed0 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20   But there is a 
1bee0 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70 65 65  measureable spee
1bef0 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75  d advantage to u
1bf00 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f  sing the macro o
1bf10 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c  n gcc.** (when l
1bf20 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74  ess compiler opt
1bf30 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20  imizations like 
1bf40 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75  -Os or -O0 are u
1bf50 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  sed and the.** c
1bf60 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64  ompiler is not d
1bf70 6f 69 6e 67 20 61 67 72 65 73 73 69 76 65 20 69  oing agressive i
1bf80 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65  nlining.)  So we
1bf90 20 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63   use a real func
1bfa0 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43  tion.** for MSVC
1bfb0 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72   and a macro for
1bfc0 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65   everything else
1bfd0 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e  .  Ticket #2457.
1bfe0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
1bff0 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  UG.  static void
1c000 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1c010 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1c020 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
1c030 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67  fo;.    int iPag
1c040 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
1c050 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66  .    memset(&inf
1c060 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66  o, 0, sizeof(inf
1c070 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61  o));.    btreePa
1c080 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
1c090 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75  Page[iPage], pCu
1c0a0 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
1c0b0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
1c0c0 65 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66  ert( memcmp(&inf
1c0d0 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20  o, &pCur->info, 
1c0e0 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30  sizeof(info))==0
1c0f0 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20   );.  }.#else.  
1c100 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65  #define assertCe
1c110 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66  llInfo(x).#endif
1c120 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52  .#ifdef _MSC_VER
1c130 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c  .  /* Use a real
1c140 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56   function in MSV
1c150 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  C to work around
1c160 20 62 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f   bugs in that co
1c170 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61  mpiler. */.  sta
1c180 74 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c  tic void getCell
1c190 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
1c1a0 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43  Cur){.    if( pC
1c1b0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
1c1c0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
1c1d0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
1c1e0 67 65 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50  ge;.      btreeP
1c1f0 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
1c200 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75  pPage[iPage],pCu
1c210 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
1c220 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
1c230 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
1c240 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Key = 1;.    }el
1c250 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1c260 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1c270 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20      }.  }.#else 
1c280 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56  /* if not _MSC_V
1c290 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61  ER */.  /* Use a
1c2a0 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74   macro in all ot
1c2b0 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f  her compilers so
1c2c0 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69   that the functi
1c2d0 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f  on is inlined */
1c2e0 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c  .#define getCell
1c2f0 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20 20 20  Info(pCur)      
1c300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c330 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e  \.  if( pCur->in
1c340 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20  fo.nSize==0 ){  
1c350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c380 20 5c 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65   \.    int iPage
1c390 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 20   = pCur->iPage; 
1c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3d0 20 20 5c 0a 20 20 20 20 62 74 72 65 65 50 61 72    \.    btreePar
1c3e0 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
1c3f0 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d  age[iPage],pCur-
1c400 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70  >aiIdx[iPage],&p
1c410 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20  Cur->info); \.  
1c420 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1c430 79 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  y = 1;          
1c440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c460 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1c470 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20   }else{         
1c480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1c4c0 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
1c4d0 66 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20 20  fo(pCur);       
1c4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1c510 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f  .  }.#endif /* _
1c520 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 23 69 66 6e  MSC_VER */..#ifn
1c530 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54  def NDEBUG  /* T
1c540 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20  he next routine 
1c550 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
1c560 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
1c570 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65  ents */./*.** Re
1c580 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
1c590 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20   given BtCursor 
1c5a0 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c  is valid.  A val
1c5b0 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65  id cursor is one
1c5c0 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72 72  .** that is curr
1c5d0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
1c5e0 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f  o a row in a (no
1c5f0 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a  n-empty) table..
1c600 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 65 72  ** This is a ver
1c610 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e  ification routin
1c620 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77  e is used only w
1c630 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73  ithin assert() s
1c640 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e  tatements..*/.in
1c650 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
1c660 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75  rsorIsValid(BtCu
1c670 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72  rsor *pCur){.  r
1c680 65 74 75 72 6e 20 70 43 75 72 20 26 26 20 70 43  eturn pCur && pC
1c690 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1c6a0 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64  OR_VALID;.}.#end
1c6b0 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a  if /* NDEBUG */.
1c6c0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
1c6d0 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  e to the size of
1c6e0 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65 64   the buffer need
1c6f0 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76  ed to hold the v
1c700 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b  alue of.** the k
1c710 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ey for the curre
1c720 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68  nt entry.  If th
1c730 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
1c740 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61  pointing.** to a
1c750 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70   valid entry, *p
1c760 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30  Size is set to 0
1c770 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74  . .**.** For a t
1c780 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e  able with the IN
1c790 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74  TKEY flag set, t
1c7a0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1c7b0 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69  rns the key.** i
1c7c0 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e  tself, not the n
1c7d0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
1c7e0 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  n the key..**.**
1c7f0 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
1c800 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 75   position the cu
1c810 72 73 6f 72 20 70 72 69 6f 72 20 74 6f 20 69 6e  rsor prior to in
1c820 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74  voking this rout
1c830 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  ine..** .** This
1c840 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20   routine cannot 
1c850 66 61 69 6c 2e 20 20 49 74 20 61 6c 77 61 79 73  fail.  It always
1c860 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1c870 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  OK.  .*/.int sql
1c880 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
1c890 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1c8a0 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20   i64 *pSize){.  
1c8b0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1c8c0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1c8d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1c8e0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1c8f0 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
1c900 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1c910 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20  _VALID );.  if( 
1c920 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
1c930 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
1c940 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20    *pSize = 0;.  
1c950 7d 65 6c 73 65 7b 0a 20 20 20 20 67 65 74 43 65  }else{.    getCe
1c960 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1c970 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
1c980 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a  >info.nKey;.  }.
1c990 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c9a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
1c9b0 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e   *pSize to the n
1c9c0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
1c9d0 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e  f data in the en
1c9e0 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  try the.** curso
1c9f0 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
1ca00 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ts to..**.** The
1ca10 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61   caller must gua
1ca20 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
1ca30 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
1ca40 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ng to a non-NULL
1ca50 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e  .** valid entry.
1ca60 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1ca70 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72  , the calling pr
1ca80 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75 61  ocedure must gua
1ca90 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74  rantee.** that t
1caa0 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43 75  he cursor has Cu
1cab0 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52  rsor.eState==CUR
1cac0 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a  SOR_VALID..**.**
1cad0 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20   Failure is not 
1cae0 70 6f 73 73 69 62 6c 65 2e 20 20 54 68 69 73 20  possible.  This 
1caf0 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  function always 
1cb00 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
1cb10 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a  K..** It might j
1cb20 75 73 74 20 61 73 20 77 65 6c 6c 20 62 65 20 61  ust as well be a
1cb30 20 70 72 6f 63 65 64 75 72 65 20 28 72 65 74 75   procedure (retu
1cb40 72 6e 69 6e 67 20 76 6f 69 64 29 20 62 75 74 20  rning void) but 
1cb50 77 65 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74  we continue.** t
1cb60 6f 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  o return an inte
1cb70 67 65 72 20 72 65 73 75 6c 74 20 63 6f 64 65 20  ger result code 
1cb80 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 72  for historical r
1cb90 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73  easons..*/.int s
1cba0 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53  qlite3BtreeDataS
1cbb0 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
1cbc0 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b  ur, u32 *pSize){
1cbd0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1cbe0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1cbf0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1cc00 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1cc10 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67  SOR_VALID );.  g
1cc20 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1cc30 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75  ;.  *pSize = pCu
1cc40 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20  r->info.nData;. 
1cc50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1cc60 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  K;.}../*.** Give
1cc70 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
1cc80 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r of an overflow
1cc90 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
1cca0 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72  abase (parameter
1ccb0 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20  .** ovfl), this 
1ccc0 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74  function finds t
1ccd0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
1cce0 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  f the next page 
1ccf0 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65  in the .** linke
1cd00 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c  d list of overfl
1cd10 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73  ow pages. If pos
1cd20 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74  sible, it uses t
1cd30 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  he auto-vacuum.*
1cd40 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61  * pointer-map da
1cd50 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65  ta instead of re
1cd60 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  ading the conten
1cd70 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74  t of page ovfl t
1cd80 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20  o do so. .**.** 
1cd90 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1cda0 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rs an SQLite err
1cdb0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1cdc0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a  ned. Otherwise:.
1cdd0 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e  **.** The page n
1cde0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
1cdf0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
1ce00 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  in the linked li
1ce10 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65  st is .** writte
1ce20 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e  n to *pPgnoNext.
1ce30 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73   If page ovfl is
1ce40 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
1ce50 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a  n its linked .**
1ce60 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78   list, *pPgnoNex
1ce70 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
1ce80 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61  . .**.** If ppPa
1ce90 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ge is not NULL, 
1cea0 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65 20  and a reference 
1ceb0 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
1cec0 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64  bject correspond
1ced0 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e  ing.** to page n
1cee0 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20  umber pOvfl was 
1cef0 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a  obtained, then *
1cf00 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
1cf10 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a   point to that.*
1cf20 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20  * reference. It 
1cf30 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
1cf40 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
1cf50 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65  ler to call rele
1cf60 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20  asePage().** on 
1cf70 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65 65 20  *ppPage to free 
1cf80 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49  the reference. I
1cf90 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77  n no reference w
1cfa0 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63  as obtained (bec
1cfb0 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e  ause.** the poin
1cfc0 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64  ter-map was used
1cfd0 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76   to obtain the v
1cfe0 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e  alue for *pPgnoN
1cff0 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70  ext), then.** *p
1d000 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
1d010 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
1d020 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  int getOverflowP
1d030 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
1d040 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
1d050 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1d060 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
1d070 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20  no ovfl,        
1d080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
1d090 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  rrent overflow p
1d0a0 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
1d0b0 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
1d0c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1d0d0 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e  OUT: MemPage han
1d0e0 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c  dle (may be NULL
1d0f0 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67  ) */.  Pgno *pPg
1d100 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20  noNext          
1d110 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74      /* OUT: Next
1d120 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
1d130 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67  umber */.){.  Pg
1d140 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d  no next = 0;.  M
1d150 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
1d160 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
1d170 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
1d180 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1d190 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1d1a0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70  x) );.  assert(p
1d1b0 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e  PgnoNext);..#ifn
1d1c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d1d0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20  AUTOVACUUM.  /* 
1d1e0 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20  Try to find the 
1d1f0 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
1d200 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75   overflow list u
1d210 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75  sing the.  ** au
1d220 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72  tovacuum pointer
1d230 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73  -map pages. Gues
1d240 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  s that the next 
1d250 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68  page in .  ** th
1d260 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
1d270 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28  is page number (
1d280 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74  ovfl+1). If that
1d290 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20   guess turns .  
1d2a0 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f  ** out to be wro
1d2b0 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ng, fall back to
1d2c0 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74   loading the dat
1d2d0 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20  a of page .  ** 
1d2e0 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64  number ovfl to d
1d2f0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78  etermine the nex
1d300 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20  t page number.. 
1d310 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61   */.  if( pBt->a
1d320 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
1d330 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20   Pgno pgno;.    
1d340 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76  Pgno iGuess = ov
1d350 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79  fl+1;.    u8 eTy
1d360 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  pe;..    while( 
1d370 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1d380 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47  t, iGuess) || iG
1d390 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  uess==PENDING_BY
1d3a0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1d3b0 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a        iGuess++;.
1d3c0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69      }..    if( i
1d3d0 47 75 65 73 73 3c 3d 70 61 67 65 72 50 61 67 65  Guess<=pagerPage
1d3e0 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
1d3f0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
1d400 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20  et(pBt, iGuess, 
1d410 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a  &eType, &pgno);.
1d420 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1d430 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65  LITE_OK && eType
1d440 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1d450 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c  W2 && pgno==ovfl
1d460 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74   ){.        next
1d470 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20   = iGuess;.     
1d480 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
1d490 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
1d4a0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1d4b0 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30   assert( next==0
1d4c0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44   || rc==SQLITE_D
1d4d0 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  ONE );.  if( rc=
1d4e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d4f0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
1d500 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26  age(pBt, ovfl, &
1d510 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 61  pPage, 0);.    a
1d520 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
1d530 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30  E_OK || pPage==0
1d540 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
1d550 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d560 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79     next = get4by
1d570 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
1d580 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
1d590 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74  pPgnoNext = next
1d5a0 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65 20 29  ;.  if( ppPage )
1d5b0 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
1d5c0 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pPage;.  }else{.
1d5d0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1d5e0 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pPage);.  }.  re
1d5f0 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
1d600 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f  _DONE ? SQLITE_O
1d610 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  K : rc);.}../*.*
1d620 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
1d630 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70   a buffer to a p
1d640 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70  age, or from a p
1d650 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e  age to a buffer.
1d660 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20  .**.** pPayload 
1d670 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1d680 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64  data stored on d
1d690 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
1d6a0 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75  Page..** If argu
1d6b0 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73  ment eOp is fals
1d6c0 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79  e, then nByte by
1d6d0 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20  tes of data are 
1d6e0 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70  copied.** from p
1d6f0 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62  Payload to the b
1d700 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74  uffer pointed at
1d710 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70   by pBuf. If eOp
1d720 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65   is true,.** the
1d730 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
1d740 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
1d750 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e  on pDbPage and n
1d760 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Byte bytes.** of
1d770 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
1d780 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
1d790 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61   pBuf to pPayloa
1d7a0 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  d..**.** SQLITE_
1d7b0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
1d7c0 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72  n success, other
1d7d0 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  wise an error co
1d7e0 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
1d7f0 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20  t copyPayload(. 
1d800 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c   void *pPayload,
1d810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1d820 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61  inter to page da
1d830 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  ta */.  void *pB
1d840 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
1d850 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1d860 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
1d870 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20  nByte,          
1d880 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1d890 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79  of bytes to copy
1d8a0 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20   */.  int eOp,  
1d8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8c0 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f  /* 0 -> copy fro
1d8d0 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70  m page, 1 -> cop
1d8e0 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44  y to page */.  D
1d8f0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20  bPage *pDbPage  
1d900 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
1d910 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79   containing pPay
1d920 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  load */.){.  if(
1d930 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43   eOp ){.    /* C
1d940 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75  opy data from bu
1d950 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20  ffer to page (a 
1d960 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29  write operation)
1d970 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   */.    int rc =
1d980 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1d990 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
1d9a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1d9b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1d9c0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1d9d0 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
1d9e0 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a  , pBuf, nByte);.
1d9f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1da00 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70  Copy data from p
1da10 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61  age to buffer (a
1da20 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29   read operation)
1da30 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   */.    memcpy(p
1da40 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e  Buf, pPayload, n
1da50 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Byte);.  }.  ret
1da60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1da70 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1da80 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
1da90 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69   read or overwri
1daa0 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  te payload infor
1dab0 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68  mation.** for th
1dac0 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
1dad0 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
1dae0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20  pointing to. If 
1daf0 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d  the eOp.** param
1db00 65 74 65 72 20 69 73 20 30 2c 20 74 68 69 73 20  eter is 0, this 
1db10 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61 74  is a read operat
1db20 69 6f 6e 20 28 64 61 74 61 20 63 6f 70 69 65 64  ion (data copied
1db30 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20   into.** buffer 
1db40 70 42 75 66 29 2e 20 49 66 20 69 74 20 69 73 20  pBuf). If it is 
1db50 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74  non-zero, a writ
1db60 65 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 66  e (data copied f
1db70 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72 20 70 42  rom.** buffer pB
1db80 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74  uf)..**.** A tot
1db90 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65  al of "amt" byte
1dba0 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77 72  s are read or wr
1dbb0 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20  itten beginning 
1dbc0 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20  at "offset"..** 
1dbd0 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f 20  Data is read to 
1dbe0 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  or from the buff
1dbf0 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54  er pBuf..**.** T
1dc00 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67  he content being
1dc10 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
1dc20 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e   might appear on
1dc30 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a   the main page.*
1dc40 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65  * or be scattere
1dc50 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c  d out on multipl
1dc60 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
1dc70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42  ..**.** If the B
1dc80 74 43 75 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c  tCursor.isIncrbl
1dc90 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73  obHandle flag is
1dca0 20 73 65 74 2c 20 61 6e 64 20 74 68 65 20 63 75   set, and the cu
1dcb0 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20  rrent.** cursor 
1dcc0 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f  entry uses one o
1dcd0 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
1dce0 70 61 67 65 73 2c 20 74 68 69 73 20 66 75 6e 63  pages, this func
1dcf0 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  tion.** allocate
1dd00 73 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20  s space for and 
1dd10 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65 73  lazily popluates
1dd20 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
1dd30 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68  ge-list .** cach
1dd40 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f  e array (BtCurso
1dd50 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75  r.aOverflow). Su
1dd60 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75  bsequent calls u
1dd70 73 65 20 74 68 69 73 0a 2a 2a 20 63 61 63 68 65  se this.** cache
1dd80 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67   to make seeking
1dd90 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
1dda0 20 6f 66 66 73 65 74 20 6d 6f 72 65 20 65 66 66   offset more eff
1ddb0 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  icient..**.** On
1ddc0 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce an overflow p
1ddd0 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68  age-list cache h
1dde0 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
1ddf0 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20  d, it may be.** 
1de00 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73  invalidated if s
1de10 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72  ome other cursor
1de20 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73   writes to the s
1de30 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66  ame table, or if
1de40 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69  .** the cursor i
1de50 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66  s moved to a dif
1de60 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69  ferent row. Addi
1de70 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74  tionally, in aut
1de80 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65  o-vacuum.** mode
1de90 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
1dea0 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c  events may inval
1deb0 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f  idate an overflo
1dec0 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
1ded0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20  e..**.**   * An 
1dee0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
1def0 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d  um,.**   * A com
1df00 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75  mit in auto_vacu
1df10 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a  um="full" mode,.
1df20 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20  **   * Creating 
1df30 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71  a table (may req
1df40 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f  uire moving an o
1df50 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a  verflow page)..*
1df60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63  /.static int acc
1df70 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  essPayload(.  Bt
1df80 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
1df90 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
1dfa0 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
1dfb0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
1dfc0 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20   u32 offset,    
1dfd0 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72        /* Begin r
1dfe0 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20  eading this far 
1dff0 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  into payload */.
1e000 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20    u32 amt,      
1e010 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74         /* Read t
1e020 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a  his many bytes *
1e030 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1e040 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74  r *pBuf, /* Writ
1e050 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f  e the bytes into
1e060 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20   this buffer */ 
1e070 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20  .  int eOp      
1e080 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20          /* zero 
1e090 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72  to read. non-zer
1e0a0 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29  o to write. */.)
1e0b0 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
1e0c0 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69  r *aPayload;.  i
1e0d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1e0e0 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20  K;.  u32 nKey;. 
1e0f0 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20   int iIdx = 0;. 
1e100 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
1e110 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
1e120 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20  Cur->iPage]; /* 
1e130 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75  Btree page of cu
1e140 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20  rrent entry */. 
1e150 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1e160 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20   pCur->pBt;     
1e170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e180 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f  Btree this curso
1e190 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  r belongs to */.
1e1a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1e1b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1e1c0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1e1d0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
1e1e0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
1e1f0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
1e200 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
1e210 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1e220 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1e230 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66  );..  getCellInf
1e240 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c  o(pCur);.  aPayl
1e250 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
1e260 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69  .pCell + pCur->i
1e270 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e  nfo.nHeader;.  n
1e280 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e  Key = (pPage->in
1e290 74 4b 65 79 20 3f 20 30 20 3a 20 28 69 6e 74 29  tKey ? 0 : (int)
1e2a0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29  pCur->info.nKey)
1e2b0 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 6f  ;..  if( NEVER(o
1e2c0 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79  ffset+amt > nKey
1e2d0 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74  +pCur->info.nDat
1e2e0 61 29 20 0a 20 20 20 7c 7c 20 26 61 50 61 79 6c  a) .   || &aPayl
1e2f0 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
1e300 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d  Local] > &pPage-
1e310 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62  >aData[pBt->usab
1e320 6c 65 53 69 7a 65 5d 0a 20 20 29 7b 0a 20 20 20  leSize].  ){.   
1e330 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65   /* Trying to re
1e340 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74  ad or write past
1e350 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1e360 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72  data is an error
1e370 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
1e380 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1e390 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  PT;.  }..  /* Ch
1e3a0 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74  eck if data must
1e3b0 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e   be read/written
1e3c0 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72   to/from the btr
1e3d0 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20  ee page itself. 
1e3e0 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
1e3f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1e400 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d  l ){.    int a =
1e410 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b   amt;.    if( a+
1e420 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66  offset>pCur->inf
1e430 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
1e440 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f    a = pCur->info
1e450 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74  .nLocal - offset
1e460 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1e470 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
1e480 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20  ayload[offset], 
1e490 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50  pBuf, a, eOp, pP
1e4a0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
1e4b0 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
1e4c0 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
1e4d0 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65    amt -= a;.  }e
1e4e0 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  lse{.    offset 
1e4f0 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  -= pCur->info.nL
1e500 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ocal;.  }..  if(
1e510 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1e520 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63  & amt>0 ){.    c
1e530 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a  onst u32 ovflSiz
1e540 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
1e550 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74  ize - 4;  /* Byt
1e560 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f  es content per o
1e570 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  vfl page */.    
1e580 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a  Pgno nextPage;..
1e590 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
1e5a0 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61  et4byte(&aPayloa
1e5b0 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
1e5c0 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20  cal]);..#ifndef 
1e5d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
1e5e0 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20 74  BLOB.    /* If t
1e5f0 68 65 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  he isIncrblobHan
1e600 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 20  dle flag is set 
1e610 61 6e 64 20 74 68 65 20 42 74 43 75 72 73 6f 72  and the BtCursor
1e620 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20  .aOverflow[].   
1e630 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e   ** has not been
1e640 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f   allocated, allo
1e650 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65  cate it now. The
1e660 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20   array is sized 
1e670 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e  at.    ** one en
1e680 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65  try for each ove
1e690 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
1e6a0 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
1e6b0 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  . The.    ** pag
1e6c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1e6d0 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
1e6e0 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
1e6f0 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20   aOverflow[0],. 
1e700 20 20 20 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c     ** etc. A val
1e710 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61  ue of 0 in the a
1e720 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
1e730 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20   means "not yet 
1e740 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74  known".    ** (t
1e750 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69  he cache is lazi
1e760 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20  ly populated).. 
1e770 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43     */.    if( pC
1e780 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61  ur->isIncrblobHa
1e790 6e 64 6c 65 20 26 26 20 21 70 43 75 72 2d 3e 61  ndle && !pCur->a
1e7a0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
1e7b0 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70    int nOvfl = (p
1e7c0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
1e7d0 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad-pCur->info.nL
1e7e0 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29  ocal+ovflSize-1)
1e7f0 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20  /ovflSize;.     
1e800 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1e810 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74   = (Pgno *)sqlit
1e820 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
1e830 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29  eof(Pgno)*nOvfl)
1e840 3b 0a 20 20 20 20 20 20 2f 2a 20 6e 4f 76 66 6c  ;.      /* nOvfl
1e850 20 69 73 20 61 6c 77 61 79 73 20 70 6f 73 69 74   is always posit
1e860 69 76 65 2e 20 20 49 66 20 69 74 20 77 65 72 65  ive.  If it were
1e870 20 7a 65 72 6f 2c 20 66 65 74 63 68 50 61 79 6c   zero, fetchPayl
1e880 6f 61 64 20 77 6f 75 6c 64 20 68 61 76 65 0a 20  oad would have. 
1e890 20 20 20 20 20 2a 2a 20 62 65 65 6e 20 75 73 65       ** been use
1e8a0 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 69  d instead of thi
1e8b0 73 20 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20  s routine. */.  
1e8c0 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 6e      if( ALWAYS(n
1e8d0 4f 76 66 6c 29 20 26 26 20 21 70 43 75 72 2d 3e  Ovfl) && !pCur->
1e8e0 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  aOverflow ){.   
1e8f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1e900 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
1e910 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1e920 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
1e930 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61  ge-list cache ha
1e940 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
1e950 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
1e960 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
1e970 72 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65  rst required ove
1e980 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61  rflow page is va
1e990 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a  lid, skip.    **
1e9a0 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e   directly to it.
1e9b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1e9c0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
1e9d0 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  && pCur->aOverfl
1e9e0 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  ow[offset/ovflSi
1e9f0 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64  ze] ){.      iId
1ea00 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c  x = (offset/ovfl
1ea10 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78  Size);.      nex
1ea20 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
1ea30 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20  verflow[iIdx];. 
1ea40 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f       offset = (o
1ea50 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b  ffset%ovflSize);
1ea60 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1ea70 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51     for( ; rc==SQ
1ea80 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
1ea90 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49   && nextPage; iI
1eaa0 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20  dx++){..#ifndef 
1eab0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
1eac0 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49 66  BLOB.      /* If
1ead0 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c   required, popul
1eae0 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
1eaf0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
1eb00 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
1eb10 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
1eb20 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1eb30 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  (!pCur->aOverflo
1eb40 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d  w[iIdx] || pCur-
1eb50 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
1eb60 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20  ==nextPage);.   
1eb70 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
1eb80 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78  flow[iIdx] = nex
1eb90 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23  tPage;.      }.#
1eba0 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28  endif..      if(
1ebb0 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a   offset>=ovflSiz
1ebc0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
1ebd0 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
1ebe0 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67  to read this pag
1ebf0 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74  e is to obtain t
1ec00 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
1ec10 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
1ec20 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
1ec30 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  he overflow chai
1ec40 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20  n. The page.    
1ec50 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e      ** data is n
1ec60 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20  ot required. So 
1ec70 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f  first try to loo
1ec80 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  kup the overflow
1ec90 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
1eca0 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20  -list cache, if 
1ecb0 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62  any, then fall b
1ecc0 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76  ack to the getOv
1ecd0 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20  erflowPage().   
1ece0 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
1ecf0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66  ..        */.#if
1ed00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ed10 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20  _INCRBLOB.      
1ed20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
1ed30 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61  rflow && pCur->a
1ed40 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
1ed50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
1ed60 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  xtPage = pCur->a
1ed70 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
1ed80 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ;.        } else
1ed90 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20   .#endif.       
1eda0 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
1edb0 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78  lowPage(pBt, nex
1edc0 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50  tPage, 0, &nextP
1edd0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6f 66  age);.        of
1ede0 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65  fset -= ovflSize
1edf0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1ee00 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74         /* Need t
1ee10 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
1ee20 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f   properly. It co
1ee30 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74  ntains some of t
1ee40 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61  he.        ** ra
1ee50 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74  nge of data that
1ee60 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28   is being read (
1ee70 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74  eOp==0) or writt
1ee80 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20  en (eOp!=0)..   
1ee90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1eea0 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
1eeb0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d  .        int a =
1eec0 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 72 63   amt;.        rc
1eed0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
1eee0 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
1eef0 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61  nextPage, &pDbPa
1ef00 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
1ef10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ef20 7b 0a 20 20 20 20 20 20 20 20 20 20 61 50 61 79  {.          aPay
1ef30 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61  load = sqlite3Pa
1ef40 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
1ef50 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  ge);.          n
1ef60 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
1ef70 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20  te(aPayload);.  
1ef80 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20          if( a + 
1ef90 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a  offset > ovflSiz
1efa0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
1efb0 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20   a = ovflSize - 
1efc0 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  offset;.        
1efd0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
1efe0 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26   = copyPayload(&
1eff0 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b  aPayload[offset+
1f000 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70  4], pBuf, a, eOp
1f010 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  , pDbPage);.    
1f020 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1f030 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
1f040 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 66 66 73  ;.          offs
1f050 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
1f060 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20    amt -= a;.    
1f070 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b        pBuf += a;
1f080 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f090 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1f0a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f0b0 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
1f0c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f0d0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1f0e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1f0f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
1f100 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73  t of the key ass
1f110 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
1f120 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
1f130 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
1f140 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
1f150 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d  ered into pBuf[]
1f160 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a  .  The transfer.
1f170 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66  ** begins at "of
1f180 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  fset"..**.** The
1f190 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
1f1a0 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69 73  ure that pCur is
1f1b0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76   pointing to a v
1f1c0 61 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74  alid row.** in t
1f1d0 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
1f1e0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1f1f0 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
1f200 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
1f210 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
1f220 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
1f230 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
1f240 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
1f250 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
1f260 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
1f270 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
1f280 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74  lite3BtreeKey(Bt
1f290 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1f2a0 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
1f2b0 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
1f2c0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1f2d0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1f2e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1f2f0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1f300 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
1f310 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
1f320 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70  e>=0 && pCur->ap
1f330 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1f340 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
1f350 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1f360 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
1f370 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1f380 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65  ]->nCell );.  re
1f390 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  turn accessPaylo
1f3a0 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
1f3b0 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20   amt, (unsigned 
1f3c0 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a  char*)pBuf, 0);.
1f3d0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
1f3e0 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
1f3f0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
1f400 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
1f410 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
1f420 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
1f430 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
1f440 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
1f450 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
1f460 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52  offset"..**.** R
1f470 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1f480 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
1f490 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
1f4a0 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
1f4b0 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
1f4c0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1f4d0 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
1f4e0 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
1f4f0 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
1f500 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
1f510 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74  ite3BtreeData(Bt
1f520 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1f530 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
1f540 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
1f550 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64    int rc;..#ifnd
1f560 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1f570 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70  NCRBLOB.  if ( p
1f580 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1f590 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
1f5a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f5b0 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64  _ABORT;.  }.#end
1f5c0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  if..  assert( cu
1f5d0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1f5e0 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
1f5f0 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
1f600 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1f610 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f620 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1f630 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1f640 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
1f650 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1f660 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
1f670 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1f680 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65  age] );.    asse
1f690 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
1f6a0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
1f6b0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1f6c0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
1f6d0 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73  .    rc = access
1f6e0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
1f6f0 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c  fset, amt, pBuf,
1f700 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
1f710 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1f720 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1f730 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  to payload infor
1f740 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
1f750 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a  entry that the .
1f760 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  ** pCur cursor i
1f770 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20  s pointing to.  
1f780 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74  The pointer is t
1f790 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
1f7a0 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66  of.** the key if
1f7b0 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20   skipKey==0 and 
1f7c0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
1f7d0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61   beginning of da
1f7e0 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79  ta if.** skipKey
1f7f0 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ==1.  The number
1f800 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61   of bytes of ava
1f810 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20  ilable key/data 
1f820 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
1f830 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70  to *pAmt.  If *p
1f840 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  Amt==0, then the
1f850 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
1f860 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61  will not be.** a
1f870 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a   valid pointer..
1f880 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1f890 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ne is an optimiz
1f8a0 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f  ation.  It is co
1f8b0 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74  mmon for the ent
1f8c0 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64  ire key.** and d
1f8d0 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68  ata to fit on th
1f8e0 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64  e local page and
1f8f0 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65   for there to be
1f900 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   no overflow.** 
1f910 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61  pages.  When tha
1f920 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f  t is so, this ro
1f930 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65  utine can be use
1f940 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a  d to access the.
1f950 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20  ** key and data 
1f960 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61  without making a
1f970 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b   copy.  If the k
1f980 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73  ey and/or data s
1f990 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76  pills.** onto ov
1f9a0 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
1f9b0 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  en accessPayload
1f9c0 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  () must be used 
1f9d0 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a  to reassemble.**
1f9e0 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e   the key/data an
1f9f0 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61  d copy it into a
1fa00 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75   preallocated bu
1fa10 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ffer..**.** The 
1fa20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
1fa30 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
1fa40 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20   looks directly 
1fa50 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a  into the cached.
1fa60 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  ** page of the d
1fa70 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61  atabase.  The da
1fa80 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ta might change 
1fa90 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74  or move the next
1faa0 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72   time.** any btr
1fab0 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ee routine is ca
1fac0 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
1fad0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1fae0 68 61 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61  har *fetchPayloa
1faf0 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
1fb00 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
1fb10 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
1fb20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
1fb30 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d  om */.  int *pAm
1fb40 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
1fb50 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
1fb60 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
1fb70 74 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tes here */.  in
1fb80 74 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20  t skipKey       
1fb90 20 20 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e     /* read begin
1fba0 6e 69 6e 67 20 61 74 20 64 61 74 61 20 69 66 20  ning at data if 
1fbb0 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a  this is true */.
1fbc0 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
1fbd0 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *aPayload;.  
1fbe0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
1fbf0 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 75 33    u32 nKey;.  u3
1fc00 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73  2 nLocal;..  ass
1fc10 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20  ert( pCur!=0 && 
1fc20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
1fc30 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
1fc40 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20  Cur->iPage]);.  
1fc50 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1fc60 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1fc70 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
1fc80 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1fc90 28 70 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67  (pCur) );.  pPag
1fca0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
1fcb0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
1fcc0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1fcd0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1fce0 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
1fcf0 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43  ;.  if( NEVER(pC
1fd00 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
1fd10 30 29 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50  0) ){.    btreeP
1fd20 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
1fd30 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1fd40 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  e], pCur->aiIdx[
1fd50 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20  pCur->iPage],.  
1fd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd70 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20   &pCur->info);. 
1fd80 20 7d 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20   }.  aPayload = 
1fd90 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c  pCur->info.pCell
1fda0 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20  ;.  aPayload += 
1fdb0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64  pCur->info.nHead
1fdc0 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  er;.  if( pPage-
1fdd0 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e  >intKey ){.    n
1fde0 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Key = 0;.  }else
1fdf0 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 28 69 6e  {.    nKey = (in
1fe00 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  t)pCur->info.nKe
1fe10 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b 69  y;.  }.  if( ski
1fe20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50 61 79  pKey ){.    aPay
1fe30 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20  load += nKey;.  
1fe40 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d    nLocal = pCur-
1fe50 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e  >info.nLocal - n
1fe60 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Key;.  }else{.  
1fe70 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d    nLocal = pCur-
1fe80 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  >info.nLocal;.  
1fe90 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 63 61 6c    assert( nLocal
1fea0 3c 3d 6e 4b 65 79 20 29 3b 0a 20 20 7d 0a 20 20  <=nKey );.  }.  
1feb0 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a  *pAmt = nLocal;.
1fec0 20 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f 61    return aPayloa
1fed0 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  d;.}.../*.** For
1fee0 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
1fef0 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70  cursor pCur is p
1ff00 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20  oint to, return 
1ff10 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73  as.** many bytes
1ff20 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64   of the key or d
1ff30 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c  ata as are avail
1ff40 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61  able on the loca
1ff50 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65  l.** b-tree page
1ff60 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  .  Write the num
1ff70 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
1ff80 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d   bytes into *pAm
1ff90 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  t..**.** The poi
1ffa0 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73  nter returned is
1ffb0 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65   ephemeral.  The
1ffc0 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f   key/data may mo
1ffd0 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74  ve.** or be dest
1ffe0 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78  royed on the nex
1fff0 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74  t call to any Bt
20000 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20  ree routine,.** 
20010 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20  including calls 
20020 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61  from other threa
20030 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73  ds against the s
20040 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65  ame cache..** He
20050 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20  nce, a mutex on 
20060 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f  the BtShared sho
20070 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f  uld be held prio
20080 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20  r to calling.** 
20090 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
200a0 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
200b0 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65  es is used to ge
200c0 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74  t quick access t
200d0 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a  o key and data.*
200e0 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  * in the common 
200f0 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76  case where no ov
20100 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
20110 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   used..*/.const 
20120 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
20130 65 65 4b 65 79 46 65 74 63 68 28 42 74 43 75 72  eeKeyFetch(BtCur
20140 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
20150 70 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 76  pAmt){.  const v
20160 6f 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61 73  oid *p = 0;.  as
20170 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
20180 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
20190 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
201a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ) );.  assert( c
201b0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
201c0 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 41  pCur) );.  if( A
201d0 4c 57 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61  LWAYS(pCur->eSta
201e0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
201f0 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 63 6f  ) ){.    p = (co
20200 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50  nst void*)fetchP
20210 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
20220 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t, 0);.  }.  ret
20230 75 72 6e 20 70 3b 0a 7d 0a 63 6f 6e 73 74 20 76  urn p;.}.const v
20240 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
20250 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72  eDataFetch(BtCur
20260 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
20270 70 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 76  pAmt){.  const v
20280 6f 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61 73  oid *p = 0;.  as
20290 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
202a0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
202b0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
202c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ) );.  assert( c
202d0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
202e0 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 41  pCur) );.  if( A
202f0 4c 57 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61  LWAYS(pCur->eSta
20300 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
20310 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 63 6f  ) ){.    p = (co
20320 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50  nst void*)fetchP
20330 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
20340 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t, 1);.  }.  ret
20350 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn p;.}.../*.**
20360 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
20370 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63   down to a new c
20380 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20  hild page.  The 
20390 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74  newPgno argument
203a0 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   is the.** page 
203b0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68  number of the ch
203c0 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ild page to move
203d0 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   to..**.** This 
203e0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
203f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
20400 69 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64  if the page-head
20410 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f  er flags field o
20420 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69  f.** the new chi
20430 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74  ld page does not
20440 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67 73   match the flags
20450 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61   field of the pa
20460 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66  rent (i.e..** if
20470 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20   an intkey page 
20480 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 74 68  appears to be th
20490 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f  e parent of a no
204a0 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f  n-intkey page, o
204b0 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29  r.** vice-versa)
204c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
204d0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75  moveToChild(BtCu
204e0 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
204f0 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  newPgno){.  int 
20500 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 43  rc;.  int i = pC
20510 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d  ur->iPage;.  Mem
20520 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a  Page *pNewPage;.
20530 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
20540 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20  = pCur->pBt;..  
20550 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
20560 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
20570 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
20580 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
20590 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
205a0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c  rt( pCur->iPage<
205b0 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
205c0 54 48 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  TH );.  if( pCur
205d0 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53  ->iPage>=(BTCURS
205e0 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20  OR_MAX_DEPTH-1) 
205f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
20600 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
20610 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65  T;.  }.  rc = ge
20620 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
20630 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77  , newPgno, &pNew
20640 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
20650 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
20660 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d  Cur->apPage[i+1]
20670 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70   = pNewPage;.  p
20680 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20  Cur->aiIdx[i+1] 
20690 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  = 0;.  pCur->iPa
206a0 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69  ge++;..  pCur->i
206b0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
206c0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
206d0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77   = 0;.  if( pNew
206e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c  Page->nCell<1 ||
206f0 20 70 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65   pNewPage->intKe
20700 79 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  y!=pCur->apPage[
20710 69 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  i]->intKey ){.  
20720 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20730 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
20740 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
20750 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
20760 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61   NDEBUG./*.** Pa
20770 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e  ge pParent is an
20780 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c   internal (non-l
20790 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20  eaf) tree page. 
207a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  This function .*
207b0 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70  * asserts that p
207c0 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
207d0 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68  d is the left-ch
207e0 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27  ild if the iIdx'
207f0 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61  th.** cell in pa
20800 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20  ge pParent. Or, 
20810 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c  if iIdx is equal
20820 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   to the total nu
20830 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73  mber of.** cells
20840 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61   in pParent, tha
20850 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
20860 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68  hild is the righ
20870 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68  t-child of.** th
20880 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
20890 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72  c void assertPar
208a0 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65  entIndex(MemPage
208b0 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69   *pParent, int i
208c0 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64  Idx, Pgno iChild
208d0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 49 64  ){.  assert( iId
208e0 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  x<=pParent->nCel
208f0 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d  l );.  if( iIdx=
20900 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
20910 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  ){.    assert( g
20920 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
20930 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
20940 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d  >hdrOffset+8])==
20950 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73  iChild );.  }els
20960 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  e{.    assert( g
20970 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
20980 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29  (pParent, iIdx))
20990 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a  ==iChild );.  }.
209a0 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  }.#else.#  defin
209b0 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  e assertParentIn
209c0 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64  dex(x,y,z) .#end
209d0 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  if../*.** Move t
209e0 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20  he cursor up to 
209f0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
20a00 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78  .**.** pCur->idx
20a10 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
20a20 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63  ell index that c
20a30 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e  ontains the poin
20a40 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61  ter.** to the pa
20a50 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  ge we are coming
20a60 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72   from.  If we ar
20a70 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68  e coming from th
20a80 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20  e.** right-most 
20a90 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20  child page then 
20aa0 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
20ab0 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   to one more tha
20ac0 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74  n.** the largest
20ad0 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a   cell index..*/.
20ae0 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65  static void move
20af0 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f  ToParent(BtCurso
20b00 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
20b10 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
20b20 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
20b30 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
20b40 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
20b50 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
20b60 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
20b70 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
20b80 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
20b90 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
20ba0 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20  ParentIndex(.   
20bb0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
20bc0 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
20bd0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
20be0 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a  Cur->iPage-1], .
20bf0 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
20c00 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70  [pCur->iPage]->p
20c10 67 6e 6f 0a 20 20 29 3b 0a 20 20 72 65 6c 65 61  gno.  );.  relea
20c20 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
20c30 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
20c40 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  );.  pCur->iPage
20c50 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  --;.  pCur->info
20c60 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
20c70 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
20c80 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  0;.}../*.** Move
20c90 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70   the cursor to p
20ca0 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74  oint to the root
20cb0 20 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74   page of its b-t
20cc0 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ree structure..*
20cd0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c  *.** If the tabl
20ce0 65 20 68 61 73 20 61 20 76 69 72 74 75 61 6c 20  e has a virtual 
20cf0 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20  root page, then 
20d00 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f  the cursor is mo
20d10 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20  ved to point.** 
20d20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20 72  to the virtual r
20d30 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61 64  oot page instead
20d40 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20 72   of the actual r
20d50 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c  oot page. A tabl
20d60 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75  e has a.** virtu
20d70 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65  al root page whe
20d80 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f  n the actual roo
20d90 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  t page contains 
20da0 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a  no cells and a .
20db0 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20  ** single child 
20dc0 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f  page. This can o
20dd0 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68 20  nly happen with 
20de0 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64  the table rooted
20df0 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a   at page 1..**.*
20e00 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20  * If the b-tree 
20e10 73 74 72 75 63 74 75 72 65 20 69 73 20 65 6d 70  structure is emp
20e20 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73  ty, the cursor s
20e30 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a  tate is set to .
20e40 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  ** CURSOR_INVALI
20e50 44 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  D. Otherwise, th
20e60 65 20 63 75 72 73 6f 72 20 69 73 20 73 65 74 20  e cursor is set 
20e70 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
20e80 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f  first.** cell lo
20e90 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f  cated on the roo
20ea0 74 20 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f  t (or virtual ro
20eb0 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74 68 65  ot) page and the
20ec0 20 63 75 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a   cursor state.**
20ed0 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f   is set to CURSO
20ee0 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49  R_VALID..**.** I
20ef0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
20f00 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 66  returns successf
20f10 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20  ully, it may be 
20f20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
20f30 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20  .** page-header 
20f40 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65 20 74  flags indicate t
20f50 68 61 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c  hat the [virtual
20f60 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74  ] root-page is t
20f70 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20  he expected .** 
20f80 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70  kind of b-tree p
20f90 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65  age (i.e. if whe
20fa0 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75  n opening the cu
20fb0 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20  rsor the caller 
20fc0 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69  did not.** speci
20fd0 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  fy a KeyInfo str
20fe0 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73  ucture the flags
20ff0 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20   byte is set to 
21000 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a  0x05 or 0x0D,.**
21010 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61   indicating a ta
21020 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69  ble b-tree, or i
21030 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64  f the caller did
21040 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e   specify a KeyIn
21050 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  fo .** structure
21060 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
21070 69 73 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f  is set to 0x02 o
21080 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69  r 0x0A, indicati
21090 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62  ng an index.** b
210a0 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  -tree)..*/.stati
210b0 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74  c int moveToRoot
210c0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
210d0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f  {.  MemPage *pRo
210e0 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ot;.  int rc = S
210f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65  QLITE_OK;.  Btre
21100 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74  e *p = pCur->pBt
21110 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ree;.  BtShared 
21120 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
21130 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
21140 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
21150 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
21160 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43  RSOR_INVALID < C
21170 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
21180 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
21190 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20  URSOR_VALID   < 
211a0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
211b0 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EK );.  assert( 
211c0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e  CURSOR_FAULT   >
211d0 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
211e0 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75  EEK );.  if( pCu
211f0 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  r->eState>=CURSO
21200 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b  R_REQUIRESEEK ){
21210 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
21220 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
21230 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ULT ){.      ass
21240 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
21250 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ext!=SQLITE_OK )
21260 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
21270 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20  Cur->skipNext;. 
21280 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
21290 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
212a0 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  (pCur);.  }..  i
212b0 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
212c0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
212d0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d      for(i=1; i<=
212e0 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
212f0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
21300 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
21310 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e[i]);.    }.   
21320 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30   pCur->iPage = 0
21330 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
21340 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
21350 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  ge(pBt, pCur->pg
21360 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61  noRoot, &pCur->a
21370 70 50 61 67 65 5b 30 5d 29 3b 0a 20 20 20 20 69  pPage[0]);.    i
21380 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21390 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
213a0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
213b0 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72  INVALID;.      r
213c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
213d0 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20      pCur->iPage 
213e0 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  = 0;..    /* If 
213f0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69  pCur->pKeyInfo i
21400 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
21410 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74   the caller that
21420 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75 72   opened this cur
21430 73 6f 72 0a 20 20 20 20 2a 2a 20 65 78 70 65 63  sor.    ** expec
21440 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f  ted to open it o
21450 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  n an index b-tre
21460 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
21470 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 20   pKeyInfo is.   
21480 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61   ** NULL, the ca
21490 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74  ller expects a t
214a0 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20  able b-tree. If 
214b0 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
214c0 63 61 73 65 2c 0a 20 20 20 20 2a 2a 20 72 65 74  case,.    ** ret
214d0 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f  urn an SQLITE_CO
214e0 52 52 55 50 54 20 65 72 72 6f 72 2e 20 20 2a 2f  RRUPT error.  */
214f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
21500 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
21510 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 43 75 72 2d  tKey==1 || pCur-
21520 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
21530 65 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ey==0 );.    if(
21540 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f   (pCur->pKeyInfo
21550 3d 3d 30 29 21 3d 70 43 75 72 2d 3e 61 70 50 61  ==0)!=pCur->apPa
21560 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b  ge[0]->intKey ){
21570 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
21580 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
21590 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  T;.    }.  }..  
215a0 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
215b0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
215c0 6f 66 20 74 68 65 20 63 6f 72 72 65 63 74 20 74  of the correct t
215d0 79 70 65 2e 20 54 68 69 73 20 6d 75 73 74 20 62  ype. This must b
215e0 65 20 74 68 65 0a 20 20 2a 2a 20 63 61 73 65 20  e the.  ** case 
215f0 61 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 74  as the call to t
21600 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  his function tha
21610 74 20 6c 6f 61 64 65 64 20 74 68 65 20 72 6f 6f  t loaded the roo
21620 74 2d 70 61 67 65 20 28 65 69 74 68 65 72 0a 20  t-page (either. 
21630 20 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 6f 72   ** this call or
21640 20 61 20 70 72 65 76 69 6f 75 73 20 69 6e 76 6f   a previous invo
21650 63 61 74 69 6f 6e 29 20 77 6f 75 6c 64 20 68 61  cation) would ha
21660 76 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72  ve detected corr
21670 75 70 74 69 6f 6e 20 0a 20 20 2a 2a 20 69 66 20  uption .  ** if 
21680 74 68 65 20 61 73 73 75 6d 70 74 69 6f 6e 20 77  the assumption w
21690 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e  ere not true, an
216a0 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  d it is not poss
216b0 69 62 6c 65 20 66 6f 72 20 74 68 65 20 66 6c 61  ible for the fla
216c0 67 73 20 0a 20 20 2a 2a 20 62 79 74 65 20 74 6f  gs .  ** byte to
216d0 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
216e0 69 65 64 20 77 68 69 6c 65 20 74 68 69 73 20 63  ied while this c
216f0 75 72 73 6f 72 20 69 73 20 68 6f 6c 64 69 6e 67  ursor is holding
21700 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 2a   a reference.  *
21710 2a 20 74 6f 20 74 68 65 20 70 61 67 65 2e 20 20  * to the page.  
21720 2a 2f 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75  */.  pRoot = pCu
21730 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20  r->apPage[0];.  
21740 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70  assert( pRoot->p
21750 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52  gno==pCur->pgnoR
21760 6f 6f 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  oot );.  assert(
21770 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 26   pRoot->isInit &
21780 26 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  & (pCur->pKeyInf
21790 6f 3d 3d 30 29 3d 3d 70 52 6f 6f 74 2d 3e 69 6e  o==0)==pRoot->in
217a0 74 4b 65 79 20 29 3b 0a 0a 20 20 70 43 75 72 2d  tKey );..  pCur-
217b0 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20  >aiIdx[0] = 0;. 
217c0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
217d0 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61  e = 0;.  pCur->a
217e0 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43 75  tLast = 0;.  pCu
217f0 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
21800 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  ;..  if( pRoot->
21810 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f  nCell==0 && !pRo
21820 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ot->leaf ){.    
21830 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20  Pgno subpage;.  
21840 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e    if( pRoot->pgn
21850 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51  o!=1 ) return SQ
21860 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
21870 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d  T;.    subpage =
21880 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74   get4byte(&pRoot
21890 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68  ->aData[pRoot->h
218a0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
218b0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
218c0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
218d0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
218e0 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67  ild(pCur, subpag
218f0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
21900 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
21910 28 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30  ((pRoot->nCell>0
21920 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43  )?CURSOR_VALID:C
21930 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a  URSOR_INVALID);.
21940 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
21950 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
21960 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
21970 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  o the left-most 
21980 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
21990 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20  th the.** entry 
219a0 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
219b0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
219c0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  g..**.** The lef
219d0 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74  t-most leaf is t
219e0 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
219f0 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74  smallest key - t
21a00 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61  he first.** in a
21a10 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
21a20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
21a30 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43  veToLeftmost(BtC
21a40 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
21a50 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
21a60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21a70 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
21a80 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
21a90 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
21aa0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
21ab0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
21ac0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
21ad0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
21ae0 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
21af0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
21b00 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e  [pCur->iPage])->
21b10 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65  leaf ){.    asse
21b20 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
21b30 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
21b40 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
21b50 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
21b60 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
21b70 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
21b80 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20  r->iPage]));.   
21b90 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
21ba0 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
21bb0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
21bc0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
21bd0 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
21be0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
21bf0 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
21c00 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  th the.** page t
21c10 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
21c20 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
21c30 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69  .  Notice the di
21c40 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77  fference.** betw
21c50 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  een moveToLeftmo
21c60 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52  st() and moveToR
21c70 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76  ightmost().  mov
21c80 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a  eToLeftmost().**
21c90 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d   finds the left-
21ca0 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
21cb0 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77  th the *entry* w
21cc0 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67  hereas moveToRig
21cd0 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  htmost().** find
21ce0 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
21cf0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
21d00 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a  he *page*..**.**
21d10 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
21d20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65  entry is the one
21d30 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73   with the larges
21d40 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74  t key - the last
21d50 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e  .** key in ascen
21d60 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
21d70 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
21d80 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73  Rightmost(BtCurs
21d90 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
21da0 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
21db0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
21dc0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
21dd0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63   0;..  assert( c
21de0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
21df0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
21e00 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
21e10 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
21e20 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
21e30 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61  LITE_OK && !(pPa
21e40 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
21e50 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
21e60 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
21e70 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
21e80 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
21e90 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
21ea0 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
21eb0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
21ec0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
21ed0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
21ee0 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
21ef0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
21f00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
21f10 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
21f20 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d  >iPage] = pPage-
21f30 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43  >nCell-1;.    pC
21f40 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
21f50 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61   0;.    pCur->va
21f60 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d  lidNKey = 0;.  }
21f70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21f80 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
21f90 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  sor to the first
21fa0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
21fb0 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
21fc0 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
21fd0 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
21fe0 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
21ff0 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
22000 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
22010 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
22020 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
22030 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
22040 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
22050 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a  First(BtCursor *
22060 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
22070 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
22080 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
22090 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
220a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
220b0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
220c0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
220d0 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
220e0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
220f0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
22100 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
22110 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
22120 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
22130 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
22140 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
22150 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
22160 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
22170 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63  es = 1;.      rc
22180 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
22190 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
221a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
221b0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
221c0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
221d0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
221e0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
221f0 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
22200 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
22210 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
22220 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
22230 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
22240 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
22250 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
22260 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
22270 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
22280 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
22290 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
222a0 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
222b0 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
222c0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
222d0 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
222e0 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75  e3BtreeLast(BtCu
222f0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
22300 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
22310 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75  ;. .  assert( cu
22320 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
22330 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
22340 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
22350 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
22360 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
22370 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
22380 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69  rsor already poi
22390 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20  nts to the last 
223a0 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61  entry, this is a
223b0 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28   no-op. */.  if(
223c0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
223d0 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 70  Cur->eState && p
223e0 43 75 72 2d 3e 61 74 4c 61 73 74 20 29 7b 0a 23  Cur->atLast ){.#
223f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
22400 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62  UG.    /* This b
22410 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61  lock serves to a
22420 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65  ssert() that the
22430 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64   cursor really d
22440 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a  oes point .    *
22450 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  * to the last en
22460 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65  try in the b-tre
22470 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  e. */.    int ii
22480 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
22490 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  ii<pCur->iPage; 
224a0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  ii++){.      ass
224b0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
224c0 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61  [ii]==pCur->apPa
224d0 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  ge[ii]->nCell );
224e0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
224f0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
22500 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75  Cur->iPage]==pCu
22510 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
22520 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20  iPage]->nCell-1 
22530 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
22540 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
22550 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29  ->iPage]->leaf )
22560 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
22570 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
22580 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
22590 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
225a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
225b0 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53   ){.    if( CURS
225c0 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
225d0 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
225e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
225f0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
22600 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
22610 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
22620 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
22630 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
22640 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
22650 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a  VALID );.      *
22660 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
22670 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
22680 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
22690 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d    pCur->atLast =
226a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
226b0 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  1:0;.    }.  }. 
226c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
226d0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
226e0 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
226f0 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  nts to an entry 
22700 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a  near the key .**
22710 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 49   specified by pI
22720 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e  dxKey or intKey.
22730 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63     Return a succ
22740 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ess code..**.** 
22750 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65  For INTKEY table
22760 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61  s, the intKey pa
22770 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e  rameter is used.
22780 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75    pIdxKey .** mu
22790 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72  st be NULL.  For
227a0 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70   index tables, p
227b0 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20 61  IdxKey is used a
227c0 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20  nd intKey.** is 
227d0 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ignored..**.** I
227e0 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68  f an exact match
227f0 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74   is not found, t
22800 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
22810 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74  s always.** left
22820 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c   pointing at a l
22830 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77  eaf page which w
22840 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e  ould hold the en
22850 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72  try if it.** wer
22860 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20  e present.  The 
22870 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69  cursor might poi
22880 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74  nt to an entry t
22890 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66  hat comes.** bef
228a0 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65  ore or after the
228b0 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69   key..**.** An i
228c0 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74 65  nteger is writte
228d0 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69  n into *pRes whi
228e0 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  ch is the result
228f0 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67   of.** comparing
22900 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68   the key with th
22910 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  e entry to which
22920 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a   the cursor is .
22930 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68  ** pointing.  Th
22940 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65  e meaning of the
22950 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e   integer written
22960 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69   into.** *pRes i
22970 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
22980 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20  .**     *pRes<0 
22990 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
229a0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
229b0 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
229c0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
229d0 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72        is smaller
229e0 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64   than intKey/pId
229f0 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74  xKey or if the t
22a00 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a  able is empty.**
22a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72    and the cursor
22a30 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65   is therefore le
22a40 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68  ft point to noth
22a50 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ing..**.**     *
22a60 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20  pRes==0     The 
22a70 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
22a80 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
22a90 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
22aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61               exa
22ab0 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74  ctly matches int
22ac0 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
22ad0 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20  **     *pRes>0  
22ae0 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
22af0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
22b00 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
22b10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
22b20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74       is larger t
22b30 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
22b40 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71  ey..**.*/.int sq
22b50 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
22b60 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75  Unpacked(.  BtCu
22b70 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
22b80 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
22b90 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a  or to be moved *
22ba0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
22bb0 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20  rd *pIdxKey, /* 
22bc0 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  Unpacked index k
22bd0 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b  ey */.  i64 intK
22be0 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
22bf0 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65   /* The table ke
22c00 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52  y */.  int biasR
22c10 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
22c20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73  /* If true, bias
22c30 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74   the search to t
22c40 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20  he high end */. 
22c50 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20   int *pRes      
22c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
22c70 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  te search result
22c80 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
22c90 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
22ca0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
22cb0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
22cc0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
22cd0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
22ce0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
22cf0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
22d00 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Res );.  assert(
22d10 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28   (pIdxKey==0)==(
22d20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
22d30 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  0) );..  /* If t
22d40 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
22d50 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20  eady positioned 
22d60 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20  at the point we 
22d70 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20  are trying.  ** 
22d80 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e  to move to, then
22d90 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69 74   just return wit
22da0 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77  hout doing any w
22db0 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75  ork */.  if( pCu
22dc0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
22dd0 52 5f 56 41 4c 49 44 20 26 26 20 70 43 75 72 2d  R_VALID && pCur-
22de0 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20 20 20 26  >validNKey .   &
22df0 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  & pCur->apPage[0
22e00 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a  ]->intKey .  ){.
22e10 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
22e20 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  fo.nKey==intKey 
22e30 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
22e40 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
22e50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
22e60 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
22e70 61 74 4c 61 73 74 20 26 26 20 70 43 75 72 2d 3e  atLast && pCur->
22e80 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79  info.nKey<intKey
22e90 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
22ea0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  = -1;.      retu
22eb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
22ec0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20    }.  }..  rc = 
22ed0 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
22ee0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
22ef0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
22f00 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
22f10 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
22f20 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
22f30 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
22f40 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49  Cur->iPage]->isI
22f50 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
22f60 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
22f70 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
22f80 6c 3e 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  l>0 || pCur->eSt
22f90 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
22fa0 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43 75  LID );.  if( pCu
22fb0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
22fc0 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
22fd0 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
22fe0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
22ff0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
23000 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
23010 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23020 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
23030 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
23040 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70  [0]->intKey || p
23050 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28  IdxKey );.  for(
23060 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72  ;;){.    int lwr
23070 2c 20 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20  , upr;.    Pgno 
23080 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50  chldPg;.    MemP
23090 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
230a0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
230b0 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20  iPage];.    int 
230c0 63 3b 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65  c;..    /* pPage
230d0 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20  ->nCell must be 
230e0 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
230f0 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  o. If this is th
23100 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  e root-page.    
23110 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f  ** the cursor wo
23120 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e  uld have been IN
23130 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20  VALID above and 
23140 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f  this for(;;) loo
23150 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e  p.    ** not run
23160 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  . If this is not
23170 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20   the root-page, 
23180 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43  then the moveToC
23190 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20  hild() routine. 
231a0 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65     ** would have
231b0 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65   already detecte
231c0 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d db corruption.
231d0 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67   Similarly, pPag
231e0 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  e must.    ** be
231f0 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20   the right kind 
23200 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29  (index or table)
23210 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e   of b-tree page.
23220 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a   Otherwise.    *
23230 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  * a moveToChild(
23240 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  ) or moveToRoot(
23250 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76  ) call would hav
23260 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75  e detected corru
23270 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61  ption.  */.    a
23280 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
23290 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ell>0 );.    ass
232a0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
232b0 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29  ey==(pIdxKey==0)
232c0 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   );.    lwr = 0;
232d0 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
232e0 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69  ->nCell-1;.    i
232f0 66 28 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a  f( biasRight ){.
23300 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
23310 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
23320 20 28 75 31 36 29 75 70 72 3b 0a 20 20 20 20 7d   (u16)upr;.    }
23330 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72  else{.      pCur
23340 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
23350 61 67 65 5d 20 3d 20 28 75 31 36 29 28 28 75 70  age] = (u16)((up
23360 72 2b 6c 77 72 29 2f 32 29 3b 0a 20 20 20 20 7d  r+lwr)/2);.    }
23370 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  .    for(;;){.  
23380 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43      int idx = pC
23390 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
233a0 69 50 61 67 65 5d 3b 20 2f 2a 20 49 6e 64 65 78  iPage]; /* Index
233b0 20 6f 66 20 63 75 72 72 65 6e 74 20 63 65 6c 6c   of current cell
233c0 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 20   in pPage */.   
233d0 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20     u8 *pCell;   
233e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233f0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
23400 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c  r to current cel
23410 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20  l in pPage */.. 
23420 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
23430 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20  nSize = 0;.     
23440 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
23450 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20  l(pPage, idx) + 
23460 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
23470 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ize;.      if( p
23480 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
23490 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c          i64 nCel
234a0 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66  lKey;.        if
234b0 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
234c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
234d0 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20  2 dummy;.       
234e0 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56     pCell += getV
234f0 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 64  arint32(pCell, d
23500 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  ummy);.        }
23510 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69  .        getVari
23520 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29  nt(pCell, (u64*)
23530 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  &nCellKey);.    
23540 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79      if( nCellKey
23550 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
23560 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20        c = 0;.   
23570 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
23580 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29  CellKey<intKey )
23590 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
235a0 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
235b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
235c0 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e  ert( nCellKey>in
235d0 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20  tKey );.        
235e0 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20    c = +1;.      
235f0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 43 75 72    }.        pCur
23600 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b  ->validNKey = 1;
23610 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69  .        pCur->i
23620 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c  nfo.nKey = nCell
23630 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Key;.      }else
23640 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
23650 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74   maximum support
23660 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20  ed page-size is 
23670 33 32 37 36 38 20 62 79 74 65 73 2e 20 54 68 69  32768 bytes. Thi
23680 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20  s means that.   
23690 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69       ** the maxi
236a0 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  mum number of re
236b0 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65  cord bytes store
236c0 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d  d on an index B-
236d0 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  Tree.        ** 
236e0 70 61 67 65 20 69 73 20 61 74 20 6d 6f 73 74 20  page is at most 
236f0 38 31 39 38 20 62 79 74 65 73 2c 20 77 68 69 63  8198 bytes, whic
23700 68 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20  h may be stored 
23710 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20  as a 2-byte.    
23720 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54      ** varint. T
23730 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
23740 69 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d  is used to attem
23750 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73  pt to avoid pars
23760 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ing .        ** 
23770 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20  the entire cell 
23780 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  by checking for 
23790 74 68 65 20 63 61 73 65 73 20 77 68 65 72 65 20  the cases where 
237a0 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20  the record is . 
237b0 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64         ** stored
237c0 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e   entirely within
237d0 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65   the b-tree page
237e0 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74   by inspecting t
237f0 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 20 20  he first .      
23800 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20    ** 2 bytes of 
23810 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20  the cell..      
23820 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
23830 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30   nCell = pCell[0
23840 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ];.        if( !
23850 28 6e 43 65 6c 6c 20 26 20 30 78 38 30 29 20 26  (nCell & 0x80) &
23860 26 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e  & nCell<=pPage->
23870 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
23880 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
23890 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65  anch runs if the
238a0 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65   record-size fie
238b0 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69  ld of the cell i
238c0 73 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  s a.          **
238d0 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72   single byte var
238e0 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f  int and the reco
238f0 72 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79  rd fits entirely
23900 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20   on the main.   
23910 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65         ** b-tree
23920 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
23930 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
23940 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
23950 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29  e(nCell, (void*)
23960 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b  &pCell[1], pIdxK
23970 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ey);.        }el
23980 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31  se if( !(pCell[1
23990 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20 20 20  ] & 0x80) .     
239a0 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d       && (nCell =
239b0 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c   ((nCell&0x7f)<<
239c0 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d  7) + pCell[1])<=
239d0 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a  pPage->maxLocal.
239e0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
239f0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f       /* The reco
23a00 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73  rd-size field is
23a10 20 61 20 32 20 62 79 74 65 20 76 61 72 69 6e 74   a 2 byte varint
23a20 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
23a30 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69  .          ** fi
23a40 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74  ts entirely on t
23a50 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70  he main b-tree p
23a60 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
23a70 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64     c = sqlite3Vd
23a80 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
23a90 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70  nCell, (void*)&p
23aa0 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79  Cell[2], pIdxKey
23ab0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
23ac0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
23ad0 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20  he record flows 
23ae0 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72  over onto one or
23af0 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
23b00 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20  ages. In.       
23b10 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20     ** this case 
23b20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e  the whole cell n
23b30 65 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65  eeds to be parse
23b40 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f  d, a buffer allo
23b50 63 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20  cated.          
23b60 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79  ** and accessPay
23b70 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72  load() used to r
23b80 65 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f  etrieve the reco
23b90 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  rd into the.    
23ba0 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20        ** buffer 
23bb0 62 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72  before VdbeRecor
23bc0 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62  dCompare() can b
23bd0 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20  e called. */.   
23be0 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65         void *pCe
23bf0 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  llKey;.         
23c00 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c   u8 * const pCel
23c10 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20  lBody = pCell - 
23c20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
23c30 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ize;.          b
23c40 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
23c50 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64  (pPage, pCellBod
23c60 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  y, &pCur->info);
23c70 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  .          nCell
23c80 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e   = (int)pCur->in
23c90 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20  fo.nKey;.       
23ca0 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71     pCellKey = sq
23cb0 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65  lite3Malloc( nCe
23cc0 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ll );.          
23cd0 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20  if( pCellKey==0 
23ce0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
23cf0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
23d00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
23d10 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
23d20 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
23d30 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63 63          rc = acc
23d40 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
23d50 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69   0, nCell, (unsi
23d60 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c  gned char*)pCell
23d70 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Key, 0);.       
23d80 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
23d90 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23da0 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  _free(pCellKey);
23db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
23dc0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
23dd0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
23de0 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
23df0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
23e00 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c  are(nCell, pCell
23e10 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  Key, pIdxKey);. 
23e20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23e30 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  _free(pCellKey);
23e40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23e50 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
23e60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
23e70 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
23e80 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
23e90 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20  {.          lwr 
23ea0 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  = idx;.         
23eb0 20 75 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a   upr = lwr - 1;.
23ec0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
23ed0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
23ee0 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20            *pRes 
23ef0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
23f00 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
23f10 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
23f20 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
23f30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
23f40 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a       if( c<0 ){.
23f50 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
23f60 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  x+1;.      }else
23f70 7b 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d 20  {.        upr = 
23f80 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20  idx-1;.      }. 
23f90 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
23fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
23fb0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
23fc0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
23fd0 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
23fe0 29 28 28 6c 77 72 2b 75 70 72 29 2f 32 29 3b 0a  )((lwr+upr)/2);.
23ff0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
24000 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a  ( lwr==upr+1 );.
24010 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
24020 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  e->isInit );.   
24030 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
24040 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67   ){.      chldPg
24050 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
24060 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e  if( lwr>=pPage->
24070 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63  nCell ){.      c
24080 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
24090 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
240a0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
240b0 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  8]);.    }else{.
240c0 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
240d0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
240e0 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20  (pPage, lwr));. 
240f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c     }.    if( chl
24100 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dPg==0 ){.      
24110 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
24120 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
24130 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
24140 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
24150 6c 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  l );.      *pRes
24160 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d   = c;.      rc =
24170 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
24180 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
24190 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nish;.    }.    
241a0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
241b0 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
241c0 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  lwr;.    pCur->i
241d0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
241e0 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
241f0 65 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  ey = 0;.    rc =
24200 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
24210 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20  r, chldPg);.    
24220 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f  if( rc ) goto mo
24230 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d  veto_finish;.  }
24240 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a  .moveto_finish:.
24250 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24260 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
24270 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  UE if the cursor
24280 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
24290 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   at an entry of 
242a0 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
242b0 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65   TRUE will be re
242c0 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63  turned after a c
242d0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
242e0 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a  reeNext() moves.
242f0 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  ** past the last
24300 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
24310 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74  ble or sqlite3Bt
24320 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20  reePrev() moves 
24330 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73  past.** the firs
24340 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69  t entry.  TRUE i
24350 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
24360 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
24370 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
24380 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74  lite3BtreeEof(Bt
24390 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
243a0 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69   /* TODO: What i
243b0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
243c0 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  in CURSOR_REQUIR
243d0 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61  ESEEK but all ta
243e0 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a  ble entries.  **
243f0 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74   have been delet
24400 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c  ed? This API wil
24410 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65  l need to change
24420 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
24430 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73  ror code.  ** as
24440 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f   well as the boo
24450 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75  lean result valu
24460 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
24470 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d   (CURSOR_VALID!=
24480 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d  pCur->eState);.}
24490 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
244a0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
244b0 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20  e next entry in 
244c0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
244d0 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
244e0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
244f0 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
24500 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
24510 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
24520 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
24530 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
24540 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
24550 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
24560 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
24570 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
24580 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
24590 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
245a0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
245b0 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61  int idx;.  MemPa
245c0 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
245d0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
245e0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
245f0 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
24600 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
24610 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
24620 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
24630 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
24640 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20  assert( pRes!=0 
24650 29 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  );.  if( CURSOR_
24660 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
24670 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52  State ){.    *pR
24680 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  es = 1;.    retu
24690 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
246a0 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b  }.  if( pCur->sk
246b0 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20  ipNext>0 ){.    
246c0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
246d0 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   0;.    *pRes = 
246e0 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
246f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
24700 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
24710 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43  0;..  pPage = pC
24720 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24730 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d  >iPage];.  idx =
24740 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   ++pCur->aiIdx[p
24750 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
24760 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
24770 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
24780 28 20 69 64 78 3c 3d 70 50 61 67 65 2d 3e 6e 43  ( idx<=pPage->nC
24790 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e  ell );..  pCur->
247a0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
247b0 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
247c0 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 64 78  y = 0;.  if( idx
247d0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
247e0 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
247f0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
24800 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
24810 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
24820 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
24830 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
24840 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ]));.      if( r
24850 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
24860 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
24870 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
24880 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
24890 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
248a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
248b0 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
248c0 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
248d0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
248e0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
248f0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
24900 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65  ALID;.        re
24910 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24920 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
24930 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
24940 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20  ;.      pPage = 
24950 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
24960 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d  r->iPage];.    }
24970 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49  while( pCur->aiI
24980 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e  dx[pCur->iPage]>
24990 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
249a0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
249b0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
249c0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  ntKey ){.      r
249d0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
249e0 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29  Next(pCur, pRes)
249f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
24a00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
24a10 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  K;.    }.    ret
24a20 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70  urn rc;.  }.  *p
24a30 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Res = 0;.  if( p
24a40 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
24a50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24a60 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d  OK;.  }.  rc = m
24a70 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
24a80 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ur);.  return rc
24a90 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70  ;.}.../*.** Step
24aa0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
24ab0 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70  he back to the p
24ac0 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e  revious entry in
24ad0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
24ae0 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
24af0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
24b00 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
24b10 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
24b20 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
24b30 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
24b40 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
24b50 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
24b60 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
24b70 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
24b80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24b90 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74  BtreePrevious(Bt
24ba0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
24bb0 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
24bc0 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
24bd0 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
24be0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
24bf0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
24c00 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
24c10 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
24c20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
24c30 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
24c40 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d   rc;.  }.  pCur-
24c50 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69  >atLast = 0;.  i
24c60 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
24c70 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
24c80 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31  ){.    *pRes = 1
24c90 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
24ca0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
24cb0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
24cc0 3c 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  <0 ){.    pCur->
24cd0 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
24ce0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
24cf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
24d00 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73  K;.  }.  pCur->s
24d10 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20  kipNext = 0;..  
24d20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
24d30 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
24d40 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
24d50 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
24d60 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
24d70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20   ){.    int idx 
24d80 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  = pCur->aiIdx[pC
24d90 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
24da0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
24db0 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
24dc0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
24dd0 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20  idx)));.    if( 
24de0 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
24df0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
24e00 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
24e10 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
24e20 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
24e30 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
24e40 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a  r->iPage]==0 ){.
24e50 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
24e60 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
24e70 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
24e80 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
24e90 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  D;.        *pRes
24ea0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
24eb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24ec0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
24ed0 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
24ee0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
24ef0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
24f00 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
24f10 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 20 20  dNKey = 0;..    
24f20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
24f30 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20  ->iPage]--;.    
24f40 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
24f50 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
24f60 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ];.    if( pPage
24f70 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
24f80 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
24f90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
24fa0 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
24fb0 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
24fc0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
24fd0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
24fe0 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b    }.  *pRes = 0;
24ff0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25000 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
25010 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20  a new page from 
25020 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
25030 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  e..**.** The new
25040 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
25050 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f  as dirty.  (In o
25060 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69  ther words, sqli
25070 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a  te3PagerWrite().
25080 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
25090 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  een called on th
250a0 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68  e new page.)  Th
250b0 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61  e new page has a
250c0 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65  lso.** been refe
250d0 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63  renced and the c
250e0 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69  alling routine i
250f0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
25100 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c  r calling.** sql
25110 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
25120 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
25130 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65   when it is done
25140 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
25150 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
25160 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f   success.  Any o
25170 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  ther return valu
25180 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61  e indicates.** a
25190 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67  n error.  *ppPag
251a0 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65  e and *pPgno are
251b0 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
251c0 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72  e event of an er
251d0 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69  ror..** Do not i
251e0 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67  nvoke sqlite3Pag
251f0 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70  erUnref() on *pp
25200 50 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72  Page if an error
25210 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
25220 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72  .** If the "near
25230 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  by" parameter is
25240 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 20 28   not 0, then a (
25250 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74 20 69  feeble) effort i
25260 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f  s made to .** lo
25270 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73  cate a page clos
25280 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75  e to the page nu
25290 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20  mber "nearby".  
252a0 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
252b0 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70   in an.** attemp
252c0 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65  t to keep relate
252d0 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f  d pages close to
252e0 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74   each other in t
252f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25300 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75  ,.** which in tu
25310 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61  rn can make data
25320 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74  base access fast
25330 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
25340 20 22 65 78 61 63 74 22 20 70 61 72 61 6d 65 74   "exact" paramet
25350 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64  er is not 0, and
25360 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
25370 20 6e 65 61 72 62 79 20 65 78 69 73 74 73 20 0a   nearby exists .
25380 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  ** anywhere on t
25390 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
253a0 65 6e 20 69 74 20 69 73 20 67 75 61 72 65 6e 74  en it is guarent
253b0 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e  eed to be return
253c0 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f  ed. This.** is o
253d0 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75 74 6f  nly used by auto
253e0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
253f0 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e  s when allocatin
25400 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a  g a new table..*
25410 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
25420 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a  ocateBtreePage(.
25430 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
25440 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70   .  MemPage **pp
25450 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70  Page, .  Pgno *p
25460 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65  Pgno, .  Pgno ne
25470 61 72 62 79 2c 0a 20 20 75 38 20 65 78 61 63 74  arby,.  u8 exact
25480 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
25490 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b  Page1;.  int rc;
254a0 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a  .  u32 n;     /*
254b0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
254c0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
254d0 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20   */.  u32 k;    
254e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
254f0 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e  aves on the trun
25500 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  k of the freelis
25510 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
25520 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65  pTrunk = 0;.  Me
25530 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e  mPage *pPrevTrun
25540 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78  k = 0;.  Pgno mx
25550 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74  Page;     /* Tot
25560 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  al size of the d
25570 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
25580 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
25590 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
255a0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
255b0 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
255c0 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20  ge1;.  mxPage = 
255d0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
255e0 42 74 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62  Bt);.  n = get4b
255f0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
25600 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63  ta[36]);.  testc
25610 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31  ase( n==mxPage-1
25620 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50   );.  if( n>=mxP
25630 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
25640 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
25650 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
25660 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54   n>0 ){.    /* T
25670 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f  here are pages o
25680 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
25690 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68   Reuse one of th
256a0 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20  ose pages. */.  
256b0 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20    Pgno iTrunk;. 
256c0 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74     u8 searchList
256d0 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20   = 0; /* If the 
256e0 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62  free-list must b
256f0 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27  e searched for '
25700 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a  nearby' */.    .
25710 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65      /* If the 'e
25720 78 61 63 74 27 20 70 61 72 61 6d 65 74 65 72 20  xact' parameter 
25730 77 61 73 20 74 72 75 65 20 61 6e 64 20 61 20 71  was true and a q
25740 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e  uery of the poin
25750 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73  ter-map.    ** s
25760 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61  hows that the pa
25770 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73  ge 'nearby' is s
25780 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20  omewhere on the 
25790 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a  free-list, then.
257a0 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
257b0 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73  e-list will be s
257c0 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74  earched for that
257d0 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69   page..    */.#i
257e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
257f0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
25800 20 69 66 28 20 65 78 61 63 74 20 26 26 20 6e 65   if( exact && ne
25810 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a  arby<=mxPage ){.
25820 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
25830 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65        assert( ne
25840 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20  arby>0 );.      
25850 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
25860 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20  oVacuum );.     
25870 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
25880 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54  pBt, nearby, &eT
25890 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ype, 0);.      i
258a0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
258b0 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  c;.      if( eTy
258c0 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
258d0 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73  AGE ){.        s
258e0 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
258f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 50       }.      *pP
25900 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20  gno = nearby;.  
25910 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
25920 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
25930 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74   free-list count
25940 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e   by 1. Set iTrun
25950 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  k to the index o
25960 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  f the.    ** fir
25970 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  st free-list tru
25980 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72  nk page. iPrevTr
25990 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  unk is initially
259a0 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72   1..    */.    r
259b0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
259c0 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
259d0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
259e0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
259f0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
25a00 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
25a10 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54   n-1);..    /* T
25a20 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74  he code within t
25a30 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20  his loop is run 
25a40 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65  only once if the
25a50 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61   'searchList' va
25a60 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73  riable.    ** is
25a70 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72   not true. Other
25a80 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e  wise, it runs on
25a90 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e  ce for each trun
25aa0 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20  k-page on the.  
25ab0 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75    ** free-list u
25ac0 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e  ntil the page 'n
25ad0 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
25ae0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  d..    */.    do
25af0 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72   {.      pPrevTr
25b00 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  unk = pTrunk;.  
25b10 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75      if( pPrevTru
25b20 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54  nk ){.        iT
25b30 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
25b40 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
25b50 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65  ta[0]);.      }e
25b60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72  lse{.        iTr
25b70 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
25b80 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
25b90 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
25ba0 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75    testcase( iTru
25bb0 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
25bc0 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d      if( iTrunk>m
25bd0 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
25be0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
25bf0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
25c00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25c10 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
25c20 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
25c30 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
25c40 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
25c50 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75   ){.        pTru
25c60 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
25c70 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
25c80 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a  e_page;.      }.
25c90 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62  .      k = get4b
25ca0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
25cb0 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66  ta[4]);.      if
25cc0 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63  ( k==0 && !searc
25cd0 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  hList ){.       
25ce0 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61   /* The trunk ha
25cf0 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20  s no leaves and 
25d00 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20  the list is not 
25d10 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20  being searched. 
25d20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65  .        ** So e
25d30 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b  xtract the trunk
25d40 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64   page itself and
25d50 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e   use it as the n
25d60 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  ewly .        **
25d70 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
25d80 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
25d90 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30  t( pPrevTrunk==0
25da0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
25db0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
25dc0 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
25dd0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
25de0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
25df0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
25e00 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
25e10 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e   }.        *pPgn
25e20 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  o = iTrunk;.    
25e30 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
25e40 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
25e50 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
25e60 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  , 4);.        *p
25e70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
25e80 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
25e90 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
25ea0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
25eb0 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
25ec0 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
25ed0 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  *pPgno, n-1));. 
25ee0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
25ef0 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62  >(u32)(pBt->usab
25f00 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b  leSize/4 - 2) ){
25f10 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  .        /* Valu
25f20 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66  e of k is out of
25f30 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73   range.  Databas
25f40 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  e corruption */.
25f50 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
25f60 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
25f70 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
25f80 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
25f90 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
25fa0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
25fb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
25fc0 20 73 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e   searchList && n
25fd0 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b  earby==iTrunk ){
25fe0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
25ff0 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65  list is being se
26000 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20  arched and this 
26010 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68  trunk page is th
26020 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
26030 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72  * to allocate, r
26040 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
26050 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76  ther it has leav
26060 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
26070 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a         assert( *
26080 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b  pPgno==iTrunk );
26090 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
260a0 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
260b0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
260c0 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
260d0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
260e0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
260f0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
26100 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
26110 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
26120 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
26130 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d  }.        if( k=
26140 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
26150 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
26160 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
26170 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
26180 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
26190 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
261a0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
261b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
261c0 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b  mcpy(&pPrevTrunk
261d0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
261e0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
261f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
26200 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
26210 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
26220 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71  runk page is req
26230 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c  uired by the cal
26240 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61  ler but it conta
26250 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ins .          *
26260 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72  * pointers to fr
26270 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20  ee-list leaves. 
26280 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62  The first leaf b
26290 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20  ecomes a trunk. 
262a0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65           ** page
262b0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
262c0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
262d0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
262e0 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  NewTrunk;.      
262f0 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75      Pgno iNewTru
26300 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
26310 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29  Trunk->aData[8])
26320 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
26330 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65  iNewTrunk>mxPage
26340 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
26350 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
26360 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
26370 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
26380 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
26390 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
263a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
263b0 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  NewTrunk==mxPage
263c0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
263d0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
263e0 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20  pBt, iNewTrunk, 
263f0 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a  &pNewTrunk, 0);.
26400 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
26410 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26420 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
26430 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
26440 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
26450 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
26460 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
26470 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61  pNewTrunk->pDbPa
26480 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
26490 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
264a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
264b0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
264c0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
264d0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
264e0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
264f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26500 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
26510 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
26520 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
26530 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
26540 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72  put4byte(&pNewTr
26550 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b  unk->aData[4], k
26560 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  -1);.          m
26570 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
26580 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72  ->aData[8], &pTr
26590 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20  unk->aData[12], 
265a0 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20  (k-1)*4);.      
265b0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
265c0 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
265d0 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
265e0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
265f0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
26600 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
26610 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62  able(pPage1->pDb
26620 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20  Page) );.       
26630 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
26640 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
26650 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
26660 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
26670 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
26680 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
26690 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
266a0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
266b0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
266c0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
266d0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
266e0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
266f0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  }.            pu
26700 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
26710 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e  nk->aData[0], iN
26720 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
26730 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
26740 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
26750 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
26760 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
26770 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
26780 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
26790 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23  *pPgno, n-1));.#
267a0 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
267b0 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20  e if( k>0 ){.   
267c0 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
267d0 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20  a leaf from the 
267e0 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20  trunk */.       
267f0 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20   u32 closest;.  
26800 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65        Pgno iPage
26810 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
26820 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d  ed char *aData =
26830 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a   pTrunk->aData;.
26840 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
26850 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
26860 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
26870 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
26880 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
26890 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
268a0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
268b0 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62         if( nearb
268c0 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  y>0 ){.         
268d0 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20   u32 i;.        
268e0 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20    int dist;.    
268f0 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
26900 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69 73  0;.          dis
26910 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  t = get4byte(&aD
26920 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79  ata[8]) - nearby
26930 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
26940 64 69 73 74 3c 30 20 29 20 64 69 73 74 20 3d 20  dist<0 ) dist = 
26950 2d 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20  -dist;.         
26960 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69   for(i=1; i<k; i
26970 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
26980 20 69 6e 74 20 64 32 20 3d 20 67 65 74 34 62 79   int d2 = get4by
26990 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d  te(&aData[8+i*4]
269a0 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20  ) - nearby;.    
269b0 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 30          if( d2<0
269c0 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20   ) d2 = -d2;.   
269d0 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c           if( d2<
269e0 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  dist ){.        
269f0 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
26a00 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i;.             
26a10 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20   dist = d2;.    
26a20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26a30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
26a40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
26a50 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
26a60 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
26a70 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
26a80 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
26a90 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  *4]);.        te
26aa0 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d  stcase( iPage==m
26ab0 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
26ac0 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67   if( iPage>mxPag
26ad0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
26ae0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
26af0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
26b00 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
26b10 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
26b20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73     }.        tes
26b30 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
26b40 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
26b50 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20  if( !searchList 
26b60 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  || iPage==nearby
26b70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
26b80 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20  t noContent;.   
26b90 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
26ba0 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  iPage;.         
26bb0 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
26bc0 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25  E: %d was leaf %
26bd0 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b  d of %d on trunk
26be0 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20   %d".           
26bf0 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65        ": %d more
26c00 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a   free pages\n",.
26c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74   *pPgno, closest
26c30 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70  +1, k, pTrunk->p
26c40 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
26c50 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73        if( closes
26c60 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  t<k-1 ){.       
26c70 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61       memcpy(&aDa
26c80 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c  ta[8+closest*4],
26c90 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20   &aData[4+k*4], 
26ca0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
26cb0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
26cc0 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  te(&aData[4], k-
26cd0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  1);.          as
26ce0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
26cf0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
26d00 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 20 29  runk->pDbPage) )
26d10 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f  ;.          noCo
26d20 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65  ntent = !btreeGe
26d30 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c  tHasContent(pBt,
26d40 20 2a 70 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20   *pPgno);.      
26d50 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
26d60 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
26d70 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e  o, ppPage, noCon
26d80 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  tent);.         
26d90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26da0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
26db0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
26dc0 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
26dd0 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
26de0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
26df0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26e00 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c               rel
26e10 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
26e20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
26e30 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26e40 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
26e50 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
26e60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
26e70 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
26e80 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50  Trunk);.      pP
26e90 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
26ea0 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68    }while( search
26eb0 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  List );.  }else{
26ec0 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
26ed0 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68  e no pages on th
26ee0 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 63  e freelist, so c
26ef0 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  reate a new page
26f00 20 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65   at the.    ** e
26f10 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a  nd of the file *
26f20 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20  /.    int nPage 
26f30 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
26f40 28 70 42 74 29 3b 0a 20 20 20 20 2a 70 50 67 6e  (pBt);.    *pPgn
26f50 6f 20 3d 20 6e 50 61 67 65 20 2b 20 31 3b 0a 0a  o = nPage + 1;..
26f60 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d      if( *pPgno==
26f70 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
26f80 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
26f90 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20  (*pPgno)++;.    
26fa0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
26fb0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
26fc0 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
26fd0 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52  utoVacuum && PTR
26fe0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
26ff0 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  *pPgno) ){.     
27000 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65   /* If *pPgno re
27010 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65  fers to a pointe
27020 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f  r-map page, allo
27030 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67  cate two new pag
27040 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74  es.      ** at t
27050 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
27060 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e  le instead of on
27070 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c  e. The first all
27080 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20  ocated page.    
27090 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e    ** becomes a n
270a0 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  ew pointer-map p
270b0 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  age, the second 
270c0 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63  is used by the c
270d0 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  aller..      */.
270e0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
270f0 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52  Pg = 0;.      TR
27100 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
27110 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
27120 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70  ile (pointer-map
27130 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67 6e   page)\n", *pPgn
27140 6f 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  o));.      asser
27150 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
27160 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
27170 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
27180 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
27190 2c 20 2a 70 50 67 6e 6f 2c 20 26 70 50 67 2c 20  , *pPgno, &pPg, 
271a0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
271b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
271c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
271d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
271e0 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
271f0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
27200 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
27210 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
27220 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 28  turn rc;.      (
27230 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20  *pPgno)++;.     
27240 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e   if( *pPgno==PEN
27250 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
27260 42 74 29 20 29 7b 20 28 2a 70 50 67 6e 6f 29 2b  Bt) ){ (*pPgno)+
27270 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69  +; }.    }.#endi
27280 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  f..    assert( *
27290 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
272a0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
272b0 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
272c0 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  etPage(pBt, *pPg
272d0 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a  no, ppPage, 0);.
272e0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
272f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
27300 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
27310 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
27320 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
27330 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
27340 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
27350 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
27360 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41   }.    TRACE(("A
27370 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
27380 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c   end of file\n",
27390 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a   *pPgno));.  }..
273a0 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
273b0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
273c0 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64  AGE(pBt) );..end
273d0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a  _allocate_page:.
273e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
273f0 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65  runk);.  release
27400 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
27410 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
27420 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
27430 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
27440 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61  eRefcount((*ppPa
27450 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20  ge)->pDbPage)>1 
27460 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
27470 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
27480 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
27490 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
274a0 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50  .    }.    (*ppP
274b0 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30  age)->isInit = 0
274c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
274d0 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  ppPage = 0;.  }.
274e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
274f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
27500 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61  ion is used to a
27510 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74 6f  dd page iPage to
27520 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
27530 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a  le free-list. .*
27540 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  * It is assumed 
27550 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
27560 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70   not already a p
27570 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d  art of the free-
27580 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  list..**.** The 
27590 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
275a0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
275b0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
275c0 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c  tion is optional
275d0 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c  ..** If the call
275e0 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61  er happens to ha
275f0 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ve a pointer to 
27600 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
27610 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ct .** correspon
27620 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61  ding to page iPa
27630 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79  ge handy, it may
27640 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65 20   pass it as the 
27650 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a  second value. .*
27660 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  * Otherwise, it 
27670 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a  may pass NULL..*
27680 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65  *.** If a pointe
27690 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f  r to a MemPage o
276a0 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64 20  bject is passed 
276b0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
276c0 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72  gument,.** its r
276d0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
276e0 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79  s not altered by
276f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
27700 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
27710 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65 64  eePage2(BtShared
27720 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a   *pBt, MemPage *
27730 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69  pMemPage, Pgno i
27740 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Page){.  MemPage
27750 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20   *pTrunk = 0;   
27760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27770 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  Free-list trunk 
27780 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  page */.  Pgno i
27790 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
277a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
277b0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
277c0 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
277d0 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61  page */ .  MemPa
277e0 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
277f0 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f  ->pPage1;      /
27800 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63  * Local referenc
27810 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20  e to page 1 */. 
27820 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
27830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27840 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69       /* Page bei
27850 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65  ng freed. May be
27860 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20   NULL. */.  int 
27870 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
27880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27890 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
278a0 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20  /.  int nFree;  
278b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
278c0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
278d0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
278e0 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20  es on free-list 
278f0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
27900 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
27910 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
27920 20 20 61 73 73 65 72 74 28 20 69 50 61 67 65 3e    assert( iPage>
27930 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  1 );.  assert( !
27940 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d  pMemPage || pMem
27950 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67  Page->pgno==iPag
27960 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d  e );..  if( pMem
27970 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Page ){.    pPag
27980 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20  e = pMemPage;.  
27990 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
279a0 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  f(pPage->pDbPage
279b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
279c0 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
279d0 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61  eLookup(pBt, iPa
279e0 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ge);.  }..  /* I
279f0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ncrement the fre
27a00 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20  e page count on 
27a10 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d  pPage1 */.  rc =
27a20 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
27a30 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
27a40 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
27a50 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
27a60 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74  t;.  nFree = get
27a70 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
27a80 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74  Data[36]);.  put
27a90 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
27aa0 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b  Data[36], nFree+
27ab0 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e  1);..  if( pBt->
27ac0 73 65 63 75 72 65 44 65 6c 65 74 65 20 29 7b 0a  secureDelete ){.
27ad0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65      /* If the se
27ae0 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69  cure_delete opti
27af0 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  on is enabled, t
27b00 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79  hen.    ** alway
27b10 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74  s fully overwrit
27b20 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
27b30 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
27b40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
27b50 20 28 21 70 50 61 67 65 20 26 26 20 28 72 63 20   (!pPage && (rc 
27b60 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
27b70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67  Bt, iPage, &pPag
27b80 65 2c 20 30 29 29 29 0a 20 20 20 20 20 7c 7c 20  e, 0))).     || 
27b90 20 20 20 20 20 20 20 20 20 20 20 28 72 63 20 3d             (rc =
27ba0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
27bb0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
27bc0 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  e)).    ){.     
27bd0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
27be0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  ut;.    }.    me
27bf0 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74  mset(pPage->aDat
27c00 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74  a, 0, pPage->pBt
27c10 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  ->pageSize);.  }
27c20 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
27c30 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
27c40 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69  auto-vacuum, wri
27c50 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  te an entry in t
27c60 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
27c70 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
27c80 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
27c90 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   free..  */.  if
27ca0 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
27cb0 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  {.    ptrmapPut(
27cc0 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d  pBt, iPage, PTRM
27cd0 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20  AP_FREEPAGE, 0, 
27ce0 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &rc);.    if( rc
27cf0 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
27d00 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
27d10 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74  Now manipulate t
27d20 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61  he actual databa
27d30 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72  se free-list str
27d40 75 63 74 75 72 65 2e 20 54 68 65 72 65 20 61 72  ucture. There ar
27d50 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69  e two.  ** possi
27d60 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65  bilities. If the
27d70 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75   free-list is cu
27d80 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f  rrently empty, o
27d90 72 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20  r if the first. 
27da0 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69   ** trunk page i
27db0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
27dc0 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68  is full, then th
27dd0 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63  is page will bec
27de0 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66  ome a.  ** new f
27df0 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
27e00 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  age. Otherwise, 
27e10 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  it will become a
27e20 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a   leaf of the.  *
27e30 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  * first trunk pa
27e40 67 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ge in the curren
27e50 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  t free-list. Thi
27e60 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66  s block tests if
27e70 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
27e80 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20  ible to add the 
27e90 70 61 67 65 20 61 73 20 61 20 6e 65 77 20 66 72  page as a new fr
27ea0 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20  ee-list leaf..  
27eb0 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d  */.  if( nFree!=
27ec0 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65  0 ){.    u32 nLe
27ed0 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  af;             
27ee0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75     /* Initial nu
27ef0 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c  mber of leaf cel
27f00 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  ls on trunk page
27f10 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20   */..    iTrunk 
27f20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
27f30 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
27f40 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
27f50 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e  tPage(pBt, iTrun
27f60 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  k, &pTrunk, 0);.
27f70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
27f80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
27f90 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
27fa0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65  ;.    }..    nLe
27fb0 61 66 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  af = get4byte(&p
27fc0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
27fd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
27fe0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32  t->usableSize>32
27ff0 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61   );.    if( nLea
28000 66 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73  f > (u32)pBt->us
28010 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29  ableSize/4 - 2 )
28020 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
28030 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
28040 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  ;.      goto fre
28050 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
28060 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c  .    if( nLeaf <
28070 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c   (u32)pBt->usabl
28080 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20  eSize/4 - 8 ){. 
28090 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20       /* In this 
280a0 63 61 73 65 20 74 68 65 72 65 20 69 73 20 72 6f  case there is ro
280b0 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  om on the trunk 
280c0 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74  page to insert t
280d0 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  he page.      **
280e0 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20   being freed as 
280f0 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20  a new leaf..    
28100 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
28110 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e  te that the trun
28120 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65  k page is not re
28130 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20  ally full until 
28140 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  it contains.    
28150 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
28160 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e  4 - 2 entries, n
28170 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ot usableSize/4 
28180 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77  - 8 entries as w
28190 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20  e have.      ** 
281a0 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20  coded.  But due 
281b0 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f  to a coding erro
281c0 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66  r in versions of
281d0 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
281e0 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c  .      ** 3.6.0,
281f0 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
28200 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
28210 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72  ages holding mor
28220 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20  e than.      ** 
28230 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
28240 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65   entries will be
28250 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72   reported as cor
28260 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a  rupt.  In order.
28270 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e        ** to main
28280 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63  tain backwards c
28290 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
282a0 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  h older versions
282b0 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20   of SQLite,.    
282c0 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e    ** we will con
282d0 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63  tinue to restric
282e0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
282f0 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c  entries to usabl
28300 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20  eSize/4 - 8.    
28310 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41    ** for now.  A
28320 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
28330 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65  the future (once
28340 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70   everyone has up
28350 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20  graded.      ** 
28360 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65  to 3.6.0 or late
28370 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e  r) we should con
28380 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65  sider fixing the
28390 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f   conditional abo
283a0 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72  ve.      ** to r
283b0 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f  ead "usableSize/
283c0 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20  4-2" instead of 
283d0 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22  "usableSize/4-8"
283e0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
283f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
28400 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
28410 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
28420 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28430 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74  K ){.        put
28440 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
28450 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31  Data[4], nLeaf+1
28460 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
28470 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
28480 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69  ta[8+nLeaf*4], i
28490 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
284a0 66 28 20 70 50 61 67 65 20 26 26 20 21 70 42 74  f( pPage && !pBt
284b0 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20 29  ->secureDelete )
284c0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
284d0 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
284e0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
284f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
28500 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 53       rc = btreeS
28510 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
28520 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
28530 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  }.      TRACE(("
28540 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65  FREE-PAGE: %d le
28550 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  af on trunk page
28560 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67   %d\n",pPage->pg
28570 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29  no,pTrunk->pgno)
28580 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  );.      goto fr
28590 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
285a0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63  }.  }..  /* If c
285b0 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20  ontrol flows to 
285c0 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
285d0 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73   it was not poss
285e0 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a  ible to add the.
285f0 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65    ** the page be
28600 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6c  ing freed as a l
28610 65 61 66 20 70 61 67 65 20 6f 66 20 74 68 65 20  eaf page of the 
28620 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74  first trunk in t
28630 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20  he free-list..  
28640 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61  ** Possibly beca
28650 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73  use the free-lis
28660 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70  t is empty, or p
28670 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
28680 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20  the .  ** first 
28690 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65  trunk in the fre
286a0 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20  e-list is full. 
286b0 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20  Either way, the 
286c0 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
286d0 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d  .  ** will becom
286e0 65 20 74 68 65 20 6e 65 77 20 66 69 72 73 74 20  e the new first 
286f0 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
28700 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a  e free-list..  *
28710 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30  /.  if( pPage==0
28720 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   && SQLITE_OK!=(
28730 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
28740 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70  e(pBt, iPage, &p
28750 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20  Page, 0)) ){.   
28760 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
28770 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  ut;.  }.  rc = s
28780 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
28790 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
287a0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
287b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
287c0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
287d0 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70    }.  put4byte(p
287e0 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72  Page->aData, iTr
287f0 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65  unk);.  put4byte
28800 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34  (&pPage->aData[4
28810 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74  ], 0);.  put4byt
28820 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
28830 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20  [32], iPage);.  
28840 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
28850 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20  E: %d new trunk 
28860 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25  page replacing %
28870 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
28880 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72  o, iTrunk));..fr
28890 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66  eepage_out:.  if
288a0 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70  ( pPage ){.    p
288b0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
288c0 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  ;.  }.  releaseP
288d0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65  age(pPage);.  re
288e0 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
288f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
28900 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  }.static void fr
28910 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  eePage(MemPage *
28920 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29  pPage, int *pRC)
28930 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d  {.  if( (*pRC)==
28940 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28950 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61 67 65   *pRC = freePage
28960 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50  2(pPage->pBt, pP
28970 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  age, pPage->pgno
28980 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
28990 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f  Free any overflo
289a0 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74  w pages associat
289b0 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
289c0 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  n Cell..*/.stati
289d0 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28  c int clearCell(
289e0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
289f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
28a00 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65  Cell){.  BtShare
28a10 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
28a20 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  pBt;.  CellInfo 
28a30 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66  info;.  Pgno ovf
28a40 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b  lPgno;.  int rc;
28a50 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20  .  int nOvfl;.  
28a60 75 31 36 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  u16 ovflPageSize
28a70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
28a80 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
28a90 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
28aa0 78 29 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72  x) );.  btreePar
28ab0 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
28ac0 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
28ad0 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
28ae0 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72  flow==0 ){.    r
28af0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28b00 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77    /* No overflow
28b10 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77   pages. Return w
28b20 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
28b30 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f  thing */.  }.  o
28b40 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  vflPgno = get4by
28b50 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
28b60 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73  Overflow]);.  as
28b70 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
28b80 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f  eSize > 4 );.  o
28b90 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42  vflPageSize = pB
28ba0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
28bb0 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e  4;.  nOvfl = (in
28bc0 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e  fo.nPayload - in
28bd0 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c  fo.nLocal + ovfl
28be0 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76  PageSize - 1)/ov
28bf0 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73  flPageSize;.  as
28c00 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d  sert( ovflPgno==
28c10 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a  0 || nOvfl>0 );.
28c20 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d    while( nOvfl--
28c30 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65   ){.    Pgno iNe
28c40 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50  xt = 0;.    MemP
28c50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a  age *pOvfl = 0;.
28c60 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f      if( ovflPgno
28c70 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 70  <2 || ovflPgno>p
28c80 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
28c90 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30  t) ){.      /* 0
28ca0 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20   is not a legal 
28cb0 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
28cc0 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65  page 1 cannot be
28cd0 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76   an .      ** ov
28ce0 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65  erflow page. The
28cf0 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67  refore if ovflPg
28d00 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65  no<2 or past the
28d10 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20   end of the .   
28d20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64     ** file the d
28d30 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
28d40 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20  corrupt. */.    
28d50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28d60 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
28d70 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66    }.    if( nOvf
28d80 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
28d90 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
28da0 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26  pBt, ovflPgno, &
28db0 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a  pOvfl, &iNext);.
28dc0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
28dd0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
28de0 0a 20 20 20 20 69 66 28 20 28 70 4f 76 66 6c 20  .    if( (pOvfl 
28df0 7c 7c 20 28 70 4f 76 66 6c 20 3d 20 62 74 72 65  || (pOvfl = btre
28e00 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c  ePageLookup(pBt,
28e10 20 6f 76 66 6c 50 67 6e 6f 29 29 29 0a 20 20 20   ovflPgno))).   
28e20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65    && sqlite3Page
28e30 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f  rPageRefcount(pO
28e40 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31  vfl->pDbPage)!=1
28e50 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
28e60 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61   There is no rea
28e70 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73  son any cursor s
28e80 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75  hould have an ou
28e90 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
28ea0 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f  nce .      ** to
28eb0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
28ec0 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61  e belonging to a
28ed0 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65   cell that is be
28ee0 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61  ing deleted/upda
28ef0 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f  ted..      ** So
28f00 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
28f10 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72   more than one r
28f20 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73  eference to this
28f30 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a   page, then it .
28f40 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f        ** must no
28f50 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f  t really be an o
28f60 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64  verflow page and
28f70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
28f80 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a  st be corrupt. .
28f90 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68        ** It is h
28fa0 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74  elpful to detect
28fb0 20 74 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c   this before cal
28fc0 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32 28 29  ling freePage2()
28fd0 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66  , as .      ** f
28fe0 72 65 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a  reePage2() may z
28ff0 65 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e  ero the page con
29000 74 65 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d  tents if secure-
29010 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20  delete mode is. 
29020 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e       ** enabled.
29030 20 49 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c   If this 'overfl
29040 6f 77 27 20 70 61 67 65 20 68 61 70 70 65 6e 73  ow' page happens
29050 20 74 6f 20 62 65 20 61 20 70 61 67 65 20 74 68   to be a page th
29060 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
29070 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74  caller is iterat
29080 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75  ing through or u
29090 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68  sing in some oth
290a0 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20  er way, this.   
290b0 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f     ** can be pro
290c0 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20  blematic..      
290d0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  */.      rc = SQ
290e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
290f0 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
29100 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
29110 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f  e2(pBt, pOvfl, o
29120 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a  vflPgno);.    }.
29130 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29  .    if( pOvfl )
29140 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
29150 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d  agerUnref(pOvfl-
29160 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d  >pDbPage);.    }
29170 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
29180 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66  turn rc;.    ovf
29190 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20  lPgno = iNext;. 
291a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
291b0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
291c0 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20  Create the byte 
291d0 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f  sequence used to
291e0 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c   represent a cel
291f0 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a  l on page pPage.
29200 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  ** and write tha
29210 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  t byte sequence 
29220 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f  into pCell[].  O
29230 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
29240 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  e.** allocated a
29250 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20  nd filled in as 
29260 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20  necessary.  The 
29270 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
29280 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69  e.** is responsi
29290 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73  ble for making s
292a0 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73  ure sufficient s
292b0 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c  pace has been al
292c0 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70  located.** for p
292d0 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  Cell[]..**.** No
292e0 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f  te that pCell do
292f0 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  es not necessary
29300 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74   need to point t
29310 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  o the pPage->aDa
29320 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65  ta.** area.  pCe
29330 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  ll might point t
29340 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79  o some temporary
29350 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63   storage.  The c
29360 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63  ell will.** be c
29370 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68  onstructed in th
29380 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65  is temporary are
29390 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e  a then copied in
293a0 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  to pPage->aData.
293b0 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61  ** later..*/.sta
293c0 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65  tic int fillInCe
293d0 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
293e0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
293f0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
29400 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
29410 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73  he cell */.  uns
29420 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
29430 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  l,          /* C
29440 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
29450 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f  the cell */.  co
29460 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
29470 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20  i64 nKey,    /* 
29480 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e  The key */.  con
29490 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69  st void *pData,i
294a0 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54  nt nData,   /* T
294b0 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  he data */.  int
294c0 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20   nZero,         
294d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
294e0 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20  xtra zero bytes 
294f0 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61  to append to pDa
29500 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53  ta */.  int *pnS
29510 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
29520 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
29530 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a  cell size here *
29540 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c  /.){.  int nPayl
29550 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  oad;.  const u8 
29560 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72  *pSrc;.  int nSr
29570 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20  c, n, rc;.  int 
29580 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d  spaceLeft;.  Mem
29590 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
295a0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52  .  MemPage *pToR
295b0 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e  elease = 0;.  un
295c0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72  signed char *pPr
295d0 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ior;.  unsigned 
295e0 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a  char *pPayload;.
295f0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
29600 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
29610 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20  Pgno pgnoOvfl = 
29620 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72  0;.  int nHeader
29630 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  ;.  CellInfo inf
29640 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  o;..  assert( sq
29650 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
29660 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
29670 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61  ex) );..  /* pPa
29680 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  ge is not necess
29690 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20  arily writeable 
296a0 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68  since pCell migh
296b0 74 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20  t be auxiliary. 
296c0 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63 65   ** buffer space
296d0 20 74 68 61 74 20 69 73 20 73 65 70 61 72 61 74   that is separat
296e0 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65  e from the pPage
296f0 20 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a   buffer area */.
29700 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c    assert( pCell<
29710 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
29720 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61  pCell>=&pPage->a
29730 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
29740 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
29750 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
29760 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
29770 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
29780 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
29790 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65  header. */.  nHe
297a0 61 64 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ader = 0;.  if( 
297b0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
297c0 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34      nHeader += 4
297d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
297e0 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
297f0 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
29800 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
29810 65 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a  eader], nData+nZ
29820 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ero);.  }else{. 
29830 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f     nData = nZero
29840 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61   = 0;.  }.  nHea
29850 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
29860 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
29870 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b  , *(u64*)&nKey);
29880 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  .  btreeParseCel
29890 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
298a0 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73  l, &info);.  ass
298b0 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65  ert( info.nHeade
298c0 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20  r==nHeader );.  
298d0 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65  assert( info.nKe
298e0 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73  y==nKey );.  ass
298f0 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d  ert( info.nData=
29900 3d 28 75 33 32 29 28 6e 44 61 74 61 2b 6e 5a 65  =(u32)(nData+nZe
29910 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46  ro) );.  .  /* F
29920 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f  ill in the paylo
29930 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64  ad */.  nPayload
29940 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f   = nData + nZero
29950 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
29960 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72  ntKey ){.    pSr
29970 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e  c = pData;.    n
29980 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
29990 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65   nData = 0;.  }e
299a0 6c 73 65 7b 20 0a 20 20 20 20 69 66 28 20 4e 45  lse{ .    if( NE
299b0 56 45 52 28 6e 4b 65 79 3e 30 78 37 66 66 66 66  VER(nKey>0x7ffff
299c0 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 29 20  fff || pKey==0) 
299d0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
299e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
299f0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  KPT;.    }.    n
29a00 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69 6e 74 29  Payload += (int)
29a10 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d  nKey;.    pSrc =
29a20 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20   pKey;.    nSrc 
29a30 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d  = (int)nKey;.  }
29a40 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66  .  *pnSize = inf
29a50 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65  o.nSize;.  space
29a60 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63  Left = info.nLoc
29a70 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d  al;.  pPayload =
29a80 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d   &pCell[nHeader]
29a90 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43  ;.  pPrior = &pC
29aa0 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
29ab0 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e  ow];..  while( n
29ac0 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20  Payload>0 ){.   
29ad0 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d   if( spaceLeft==
29ae0 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
29af0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
29b00 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  UUM.      Pgno p
29b10 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f  gnoPtrmap = pgno
29b20 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f  Ovfl; /* Overflo
29b30 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d  w page pointer-m
29b40 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f  ap entry page */
29b50 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
29b60 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
29b70 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
29b80 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a      pgnoOvfl++;.
29b90 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28          } while(
29ba0 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d   .          PTRM
29bb0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70  AP_ISPAGE(pBt, p
29bc0 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f  gnoOvfl) || pgno
29bd0 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Ovfl==PENDING_BY
29be0 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20  TE_PAGE(pBt) .  
29bf0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
29c00 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63  .#endif.      rc
29c10 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
29c20 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c  Page(pBt, &pOvfl
29c30 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e  , &pgnoOvfl, pgn
29c40 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64  oOvfl, 0);.#ifnd
29c50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
29c60 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
29c70 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
29c80 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
29c90 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65  -vacuum, and the
29ca0 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65   second or subse
29cb0 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f  quent.      ** o
29cc0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
29cd0 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c  being allocated,
29ce0 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   add an entry to
29cf0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
29d00 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
29d10 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20  at page now. .  
29d20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
29d30 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
29d40 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
29d50 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ge, then write a
29d60 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a   partial entry .
29d70 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20        ** to the 
29d80 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20  pointer-map. If 
29d90 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67  we write nothing
29da0 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72   to this pointer
29db0 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20  -map slot,.     
29dc0 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74   ** then the opt
29dd0 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77  imistic overflow
29de0 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e   chain processin
29df0 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29  g in clearCell()
29e00 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69  .      ** may mi
29e10 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 75  sinterpret the u
29e20 6e 69 6e 69 74 69 61 6c 69 73 65 64 20 76 61 6c  ninitialised val
29e30 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ues and delete t
29e40 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e  he.      ** wron
29e50 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  g pages from the
29e60 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
29e70 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
29e80 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
29e90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29ea0 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
29eb0 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70  pe = (pgnoPtrmap
29ec0 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  ?PTRMAP_OVERFLOW
29ed0 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  2:PTRMAP_OVERFLO
29ee0 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  W1);.        ptr
29ef0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
29f00 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e  Ovfl, eType, pgn
29f10 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20  oPtrmap, &rc);. 
29f20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
29f30 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
29f40 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20  sePage(pOvfl);. 
29f50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
29f60 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
29f70 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
29f80 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
29f90 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20  elease);.       
29fa0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
29fb0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
29fc0 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
29fd0 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72  ot zero than pPr
29fe0 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  ior points into 
29ff0 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
2a000 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
2a010 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
2a020 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
2a030 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
2a040 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
2a050 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c   pToRelease==0 |
2a060 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
2a070 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c  writeable(pToRel
2a080 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29  ease->pDbPage) )
2a090 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  ;..      /* If p
2a0a0 50 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66  Prior is part of
2a0b0 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f   the data area o
2a0c0 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61  f pPage, then ma
2a0d0 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20  ke sure pPage.  
2a0e0 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
2a0f0 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20  writeable */.   
2a100 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f     assert( pPrio
2a110 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  r<pPage->aData |
2a120 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65  | pPrior>=&pPage
2a130 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
2a140 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
2a150 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
2a160 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2a170 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
2a180 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ..      put4byte
2a190 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66  (pPrior, pgnoOvf
2a1a0 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  l);.      releas
2a1b0 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
2a1c0 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65  );.      pToRele
2a1d0 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20  ase = pOvfl;.   
2a1e0 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66     pPrior = pOvf
2a1f0 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  l->aData;.      
2a200 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
2a210 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c   0);.      pPayl
2a220 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44  oad = &pOvfl->aD
2a230 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70  ata[4];.      sp
2a240 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75  aceLeft = pBt->u
2a250 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
2a260 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61     }.    n = nPa
2a270 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e  yload;.    if( n
2a280 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d  >spaceLeft ) n =
2a290 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20   spaceLeft;..   
2a2a0 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
2a2b0 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
2a2c0 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e  an pPayload poin
2a2d0 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
2a2e0 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20   area.    ** of 
2a2f0 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
2a300 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
2a310 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
2a320 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  able. */.    ass
2a330 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d  ert( pToRelease=
2a340 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  =0 || sqlite3Pag
2a350 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
2a360 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67  oRelease->pDbPag
2a370 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  e) );..    /* If
2a380 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72   pPayload is par
2a390 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72  t of the data ar
2a3a0 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  ea of pPage, the
2a3b0 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67  n make sure pPag
2a3c0 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c  e.    ** is stil
2a3d0 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20  l writeable */. 
2a3e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79 6c     assert( pPayl
2a3f0 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  oad<pPage->aData
2a400 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70   || pPayload>=&p
2a410 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
2a420 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
2a430 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
2a440 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2a450 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2a460 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53  ) );..    if( nS
2a470 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66  rc>0 ){.      if
2a480 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e  ( n>nSrc ) n = n
2a490 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Src;.      asser
2a4a0 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20  t( pSrc );.     
2a4b0 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
2a4c0 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20  , pSrc, n);.    
2a4d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
2a4e0 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c  set(pPayload, 0,
2a4f0 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e   n);.    }.    n
2a500 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20  Payload -= n;.  
2a510 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b    pPayload += n;
2a520 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a  .    pSrc += n;.
2a530 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20      nSrc -= n;. 
2a540 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20     spaceLeft -= 
2a550 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d  n;.    if( nSrc=
2a560 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63  =0 ){.      nSrc
2a570 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20   = nData;.      
2a580 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
2a590 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73    }.  }.  releas
2a5a0 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
2a5b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
2a5c0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2a5d0 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20  Remove the i-th 
2a5e0 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
2a5f0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65    This routine e
2a600 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c  ffects pPage onl
2a610 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63  y..** The cell c
2a620 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72  ontent is not fr
2a630 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  eed or deallocat
2a640 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d  ed.  It is assum
2a650 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
2a660 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20  ell content has 
2a670 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65  been copied some
2a680 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69  place else.  Thi
2a690 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a  s routine just.*
2a6a0 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65  * removes the re
2a6b0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
2a6c0 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a  ell from pPage..
2a6d0 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20  **.** "sz" must 
2a6e0 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
2a6f0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65   bytes in the ce
2a700 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ll..*/.static vo
2a710 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50  id dropCell(MemP
2a720 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
2a730 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74  idx, int sz, int
2a740 20 2a 70 52 43 29 7b 0a 20 20 69 6e 74 20 69 3b   *pRC){.  int i;
2a750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2a760 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
2a770 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f  nt pc;         /
2a780 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c  * Offset to cell
2a790 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c   content of cell
2a7a0 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a   being deleted *
2a7b0 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
2a7c0 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44      /* pPage->aD
2a7d0 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72  ata */.  u8 *ptr
2a7e0 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64  ;        /* Used
2a7f0 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61   to move bytes a
2a800 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74  round within dat
2a810 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  a[] */.  int rc;
2a820 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2a830 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
2a840 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
2a850 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66   /* Beginning of
2a860 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 30 20   the header.  0 
2a870 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31 30 30  most pages.  100
2a880 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66   page 1 */..  if
2a890 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
2a8a0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ..  assert( idx>
2a8b0 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d  =0 && idx<pPage-
2a8c0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
2a8d0 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
2a8e0 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a  (pPage, idx) );.
2a8f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2a900 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2a910 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2a920 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2a930 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2a940 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2a950 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d  tex) );.  data =
2a960 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
2a970 20 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61   ptr = &data[pPa
2a980 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ge->cellOffset +
2a990 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20   2*idx];.  pc = 
2a9a0 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20  get2byte(ptr);. 
2a9b0 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
2a9c0 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63  rOffset;.  testc
2a9d0 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74  ase( pc==get2byt
2a9e0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
2a9f0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
2aa00 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74  c+sz==pPage->pBt
2aa10 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
2aa20 20 20 69 66 28 20 70 63 20 3c 20 67 65 74 32 62    if( pc < get2b
2aa30 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
2aa40 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61  ) || pc+sz > pPa
2aa50 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
2aa60 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  ize ){.    *pRC 
2aa70 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2aa80 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
2aa90 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72  n;.  }.  rc = fr
2aaa0 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70  eeSpace(pPage, p
2aab0 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63  c, sz);.  if( rc
2aac0 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
2aad0 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
2aae0 20 7d 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b 31   }.  for(i=idx+1
2aaf0 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
2ab00 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a  ; i++, ptr+=2){.
2ab10 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72      ptr[0] = ptr
2ab20 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d 20  [2];.    ptr[1] 
2ab30 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20  = ptr[3];.  }.  
2ab40 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a  pPage->nCell--;.
2ab50 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
2ab60 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  [hdr+3], pPage->
2ab70 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d  nCell);.  pPage-
2ab80 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 7d 0a 0a  >nFree += 2;.}..
2ab90 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
2aba0 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ew cell on pPage
2abb0 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22   at cell index "
2abc0 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74  i".  pCell point
2abd0 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  s to the.** cont
2abe0 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  ent of the cell.
2abf0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  .**.** If the ce
2ac00 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20  ll content will 
2ac10 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  fit on the page,
2ac20 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65   then put it the
2ac30 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69  re.  If it.** wi
2ac40 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e  ll not fit, then
2ac50 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
2ac60 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
2ac70 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a   into pTemp if.*
2ac80 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e  * pTemp is not n
2ac90 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73  ull.  Regardless
2aca0 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63   of pTemp, alloc
2acb0 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a  ate a new entry.
2acc0 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76  ** in pPage->aOv
2acd0 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74  fl[] and make it
2ace0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65   point to the ce
2acf0 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68  ll content (eith
2ad00 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f  er.** in pTemp o
2ad10 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  r the original p
2ad20 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72  Cell) and also r
2ad30 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e  ecord its index.
2ad40 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20   .** Allocating 
2ad50 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
2ad60 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d  Page->aCell[] im
2ad70 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70  plies that .** p
2ad80 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
2ad90 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a  is incremented..
2ada0 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69  **.** If nSkip i
2adb0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
2adc0 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65   do not copy the
2add0 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74   first nSkip byt
2ade0 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c  es of the.** cel
2adf0 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  l. The caller wi
2ae00 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65  ll overwrite the
2ae10 6d 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  m after this fun
2ae20 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49  ction returns. I
2ae30 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f  f.** nSkip is no
2ae40 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65  n-zero, then pCe
2ae50 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74  ll may not point
2ae60 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d   to an invalid m
2ae70 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a  emory location .
2ae80 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53  ** (but pCell+nS
2ae90 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20 76 61  kip is always va
2aea0 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lid)..*/.static 
2aeb0 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28  void insertCell(
2aec0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2aed0 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74  e,   /* Page int
2aee0 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63  o which we are c
2aef0 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  opying */.  int 
2af00 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i,            /*
2af10 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65   New cell become
2af20 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  s the i-th cell 
2af30 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
2af40 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
2af50 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
2af60 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f   the new cell */
2af70 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20  .  int sz,      
2af80 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
2af90 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c   content in pCel
2afa0 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70  l */.  u8 *pTemp
2afb0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  ,        /* Temp
2afc0 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66   storage space f
2afd0 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65  or pCell, if nee
2afe0 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43  ded */.  Pgno iC
2aff0 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66  hild,      /* If
2b000 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61   non-zero, repla
2b010 63 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  ce first 4 bytes
2b020 20 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65   with this value
2b030 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20   */.  int *pRC  
2b040 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
2b050 61 6e 64 20 77 72 69 74 65 20 72 65 74 75 72 6e  and write return
2b060 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20   code from here 
2b070 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 3b  */.){.  int idx;
2b080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65            /* Whe
2b090 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20  re to write new 
2b0a0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20  cell content in 
2b0b0 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
2b0c0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  j;            /*
2b0d0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
2b0e0 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20  .  int end;     
2b0f0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
2b100 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  te past the last
2b110 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
2b120 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
2b130 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f   ins;          /
2b140 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b  * Index in data[
2b150 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c  ] where new cell
2b160 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65   pointer is inse
2b170 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 65  rted */.  int ce
2b180 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41  llOffset;   /* A
2b190 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20  ddress of first 
2b1a0 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
2b1b0 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  data[] */.  u8 *
2b1c0 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
2b1d0 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   The content of 
2b1e0 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a  the whole page *
2b1f0 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
2b200 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f        /* Used fo
2b210 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61  r moving informa
2b220 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64  tion around in d
2b230 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 69 6e 74 20  ata[] */..  int 
2b240 6e 53 6b 69 70 20 3d 20 28 69 43 68 69 6c 64 20  nSkip = (iChild 
2b250 3f 20 34 20 3a 20 30 29 3b 0a 0a 20 20 69 66 28  ? 4 : 0);..  if(
2b260 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
2b270 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20  .  assert( i>=0 
2b280 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65  && i<=pPage->nCe
2b290 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ll+pPage->nOverf
2b2a0 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28  low );.  assert(
2b2b0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d   pPage->nCell<=M
2b2c0 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
2b2d0 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50  t) && MX_CELL(pP
2b2e0 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30 20  age->pBt)<=5460 
2b2f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2b300 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41  ge->nOverflow<=A
2b310 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
2b320 61 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65  aOvfl) );.  asse
2b330 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2b340 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2b350 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f  t->mutex) );.  /
2b360 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c  * The cell shoul
2b370 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69  d normally be si
2b380 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20  zed correctly.  
2b390 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f  However, when mo
2b3a0 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66  ving a.  ** malf
2b3b0 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20  ormed cell from 
2b3c0 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61  a leaf page to a
2b3d0 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c  n interior page,
2b3e0 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a   if the cell siz
2b3f0 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f  e.  ** wanted to
2b400 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20   be less than 4 
2b410 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20  but got rounded 
2b420 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c  up to 4 on the l
2b430 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20  eaf, then size. 
2b440 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73   ** might be les
2b450 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73  s than 8 (leaf-s
2b460 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f  ize + pointer) o
2b470 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e  n the interior n
2b480 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a  ode.  Hence.  **
2b490 20 74 68 65 20 74 65 72 6d 20 61 66 74 65 72 20   the term after 
2b4a0 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f  the || in the fo
2b4b0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29  llowing assert()
2b4c0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  . */.  assert( s
2b4d0 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  z==cellSizePtr(p
2b4e0 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20  Page, pCell) || 
2b4f0 28 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64  (sz==8 && iChild
2b500 3e 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  >0) );.  if( pPa
2b510 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c  ge->nOverflow ||
2b520 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72   sz+2>pPage->nFr
2b530 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54  ee ){.    if( pT
2b540 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  emp ){.      mem
2b550 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c  cpy(pTemp+nSkip,
2b560 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a   pCell+nSkip, sz
2b570 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70  -nSkip);.      p
2b580 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20  Cell = pTemp;.  
2b590 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69    }.    if( iChi
2b5a0 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34  ld ){.      put4
2b5b0 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69  byte(pCell, iChi
2b5c0 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  ld);.    }.    j
2b5d0 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66   = pPage->nOverf
2b5e0 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  low++;.    asser
2b5f0 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f  t( j<(int)(sizeo
2b600 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f  f(pPage->aOvfl)/
2b610 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f  sizeof(pPage->aO
2b620 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20  vfl[0])) );.    
2b630 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e  pPage->aOvfl[j].
2b640 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20  pCell = pCell;. 
2b650 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b     pPage->aOvfl[
2b660 6a 5d 2e 69 64 78 20 3d 20 28 75 31 36 29 69 3b  j].idx = (u16)i;
2b670 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
2b680 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
2b690 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
2b6a0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
2b6b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2b6c0 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20  ){.      *pRC = 
2b6d0 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
2b6e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2b6f0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2b700 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2b710 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
2b720 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d     data = pPage-
2b730 3e 61 44 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c  >aData;.    cell
2b740 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
2b750 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20  cellOffset;.    
2b760 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  end = cellOffset
2b770 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
2b780 6c 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c  l;.    ins = cel
2b790 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20  lOffset + 2*i;. 
2b7a0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
2b7b0 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c  Space(pPage, sz,
2b7c0 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20   &idx);.    if( 
2b7d0 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b  rc ){ *pRC = rc;
2b7e0 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f   return; }.    /
2b7f0 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70  * The allocateSp
2b800 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75  ace() routine gu
2b810 61 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c  arantees the fol
2b820 6c 6f 77 69 6e 67 20 74 77 6f 20 70 72 6f 70 65  lowing two prope
2b830 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20  rties.    ** if 
2b840 69 74 20 72 65 74 75 72 6e 73 20 73 75 63 63 65  it returns succe
2b850 73 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ss */.    assert
2b860 28 20 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20 29  ( idx >= end+2 )
2b870 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  ;.    assert( id
2b880 78 2b 73 7a 20 3c 3d 20 70 50 61 67 65 2d 3e 70  x+sz <= pPage->p
2b890 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
2b8a0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65  ;.    pPage->nCe
2b8b0 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d  ll++;.    pPage-
2b8c0 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28  >nFree -= (u16)(
2b8d0 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d  2 + sz);.    mem
2b8e0 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53  cpy(&data[idx+nS
2b8f0 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69  kip], pCell+nSki
2b900 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20  p, sz-nSkip);.  
2b910 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a    if( iChild ){.
2b920 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
2b930 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c  data[idx], iChil
2b940 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  d);.    }.    fo
2b950 72 28 6a 3d 65 6e 64 2c 20 70 74 72 3d 26 64 61  r(j=end, ptr=&da
2b960 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d  ta[j]; j>ins; j-
2b970 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20  =2, ptr-=2){.   
2b980 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b     ptr[0] = ptr[
2b990 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b 31  -2];.      ptr[1
2b9a0 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20  ] = ptr[-1];.   
2b9b0 20 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65 28   }.    put2byte(
2b9c0 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29  &data[ins], idx)
2b9d0 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
2b9e0 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
2b9f0 66 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d  ffset+3], pPage-
2ba00 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66  >nCell);.#ifndef
2ba10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2ba20 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
2ba30 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f  pPage->pBt->auto
2ba40 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
2ba50 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20  /* The cell may 
2ba60 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65  contain a pointe
2ba70 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r to an overflow
2ba80 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72   page. If so, wr
2ba90 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ite.      ** the
2baa0 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f   entry for the o
2bab0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74  verflow page int
2bac0 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
2bad0 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  p..      */.    
2bae0 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50    ptrmapPutOvflP
2baf0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
2bb00 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e   pRC);.    }.#en
2bb10 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  dif.  }.}../*.**
2bb20 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63   Add a list of c
2bb30 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20  ells to a page. 
2bb40 20 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64   The page should
2bb50 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d   be initially em
2bb60 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  pty..** The cell
2bb70 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
2bb80 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70   to fit on the p
2bb90 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
2bba0 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65  oid assemblePage
2bbb0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
2bbc0 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge,   /* The pag
2bbd0 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69  e to be assembli
2bbe0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ed */.  int nCel
2bbf0 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  l,        /* The
2bc00 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
2bc10 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20   to add to this 
2bc20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
2bc30 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50  pCell,      /* P
2bc40 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20  ointers to cell 
2bc50 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20  bodies */.  u16 
2bc60 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a  *aSize        /*
2bc70 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65   Sizes of the ce
2bc80 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lls */.){.  int 
2bc90 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
2bca0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
2bcb0 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b  .  u8 *pCellptr;
2bcc0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
2bcd0 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69  of next cell poi
2bce0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65  nter */.  int ce
2bcf0 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41  llbody;     /* A
2bd00 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63  ddress of next c
2bd10 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38  ell body */.  u8
2bd20 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20   * const data = 
2bd30 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20  pPage->aData;   
2bd40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
2bd50 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72  nter to data for
2bd60 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73   pPage */.  cons
2bd70 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67  t int hdr = pPag
2bd80 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  e->hdrOffset;   
2bd90 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
2bda0 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70  t of header on p
2bdb0 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  Page */.  const 
2bdc0 69 6e 74 20 6e 55 73 61 62 6c 65 20 3d 20 70 50  int nUsable = pP
2bdd0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
2bde0 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20  Size; /* Usable 
2bdf0 73 69 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f 0a  size of page */.
2be00 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2be10 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
2be20 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2be30 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2be40 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2be50 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
2be60 43 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c  Cell>=0 && nCell
2be70 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  <=MX_CELL(pPage-
2be80 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c  >pBt) && MX_CELL
2be90 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34  (pPage->pBt)<=54
2bea0 36 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  60 );.  assert( 
2beb0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2bec0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2bed0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  DbPage) );..  /*
2bee0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
2bef0 70 61 67 65 20 68 61 73 20 6a 75 73 74 20 62 65  page has just be
2bf00 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a 65 72  en zeroed by zer
2bf10 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20 61 73 73  oPage() */.  ass
2bf20 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
2bf30 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  l==0 );.  assert
2bf40 28 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ( get2byte(&data
2bf50 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c  [hdr+5])==nUsabl
2bf60 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74 72  e );..  pCellptr
2bf70 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e   = &data[pPage->
2bf80 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65  cellOffset + nCe
2bf90 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64  ll*2];.  cellbod
2bfa0 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66  y = nUsable;.  f
2bfb0 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e  or(i=nCell-1; i>
2bfc0 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 43  =0; i--){.    pC
2bfd0 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20  ellptr -= 2;.   
2bfe0 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 61 53 69   cellbody -= aSi
2bff0 7a 65 5b 69 5d 3b 0a 20 20 20 20 70 75 74 32 62  ze[i];.    put2b
2c000 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 63 65  yte(pCellptr, ce
2c010 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d  llbody);.    mem
2c020 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f  cpy(&data[cellbo
2c030 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20  dy], apCell[i], 
2c040 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20  aSize[i]);.  }. 
2c050 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
2c060 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a  hdr+3], nCell);.
2c070 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
2c080 5b 68 64 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64  [hdr+5], cellbod
2c090 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  y);.  pPage->nFr
2c0a0 65 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b  ee -= (nCell*2 +
2c0b0 20 6e 55 73 61 62 6c 65 20 2d 20 63 65 6c 6c 62   nUsable - cellb
2c0c0 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ody);.  pPage->n
2c0d0 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c  Cell = (u16)nCel
2c0e0 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  l;.}../*.** The 
2c0f0 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65  following parame
2c100 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68  ters determine h
2c110 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74  ow many adjacent
2c120 20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c   pages get invol
2c130 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61  ved.** in a bala
2c140 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
2c150 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62    NN is the numb
2c160 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
2c170 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a  on either side.*
2c180 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68  * of the page th
2c190 61 74 20 70 61 72 74 69 63 69 70 61 74 65 20 69  at participate i
2c1a0 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20  n the balancing 
2c1b0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69  operation.  NB i
2c1c0 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e  s the.** total n
2c1d0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
2c1e0 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65 2c  hat participate,
2c1f0 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74   including the t
2c200 61 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a  arget page and.*
2c210 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f  * NN neighbors o
2c220 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a  n either side..*
2c230 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d  *.** The minimum
2c240 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20   value of NN is 
2c250 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20  1 (of course).  
2c260 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62  Increasing NN ab
2c270 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f  ove 1.** (to 2 o
2c280 72 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64  r 3) gives a mod
2c290 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20  est improvement 
2c2a0 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45  in SELECT and DE
2c2b0 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  LETE performance
2c2c0 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20  .** in exchange 
2c2d0 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65 67  for a larger deg
2c2e0 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45  radation in INSE
2c2f0 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 70 65  RT and UPDATE pe
2c300 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68  rformance..** Th
2c310 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70  e value of NN ap
2c320 70 65 61 72 73 20 74 6f 20 67 69 76 65 20 74 68  pears to give th
2c330 65 20 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f  e best results o
2c340 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69  verall..*/.#defi
2c350 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20  ne NN 1         
2c360 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2c370 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
2c380 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61  ther side of pPa
2c390 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42  ge */.#define NB
2c3a0 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f   (NN*2+1)      /
2c3b0 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e  * Total pages in
2c3c0 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61  volved in the ba
2c3d0 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64  lance */...#ifnd
2c3e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  ef SQLITE_OMIT_Q
2c3f0 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a  UICKBALANCE./*.*
2c400 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f  * This version o
2c410 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64  f balance() hand
2c420 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73  les the common s
2c430 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72  pecial case wher
2c440 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79  e.** a new entry
2c450 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74   is being insert
2c460 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d  ed on the extrem
2c470 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74  e right-end of t
2c480 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f  he.** tree, in o
2c490 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e  ther words, when
2c4a0 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77   the new entry w
2c4b0 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c  ill become the l
2c4c0 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20  argest.** entry 
2c4d0 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a  in the tree..**.
2c4e0 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72  ** Instead of tr
2c4f0 79 69 6e 67 20 74 6f 20 62 61 6c 61 6e 63 65 20  ying to balance 
2c500 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74  the 3 right-most
2c510 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73   leaf pages, jus
2c520 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70  t add.** a new p
2c530 61 67 65 20 74 6f 20 74 68 65 20 72 69 67 68 74  age to the right
2c540 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70  -hand side and p
2c550 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65  ut the one new e
2c560 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20  ntry in.** that 
2c570 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76  page.  This leav
2c580 65 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64  es the right sid
2c590 65 20 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f  e of the tree so
2c5a0 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61  mewhat.** unbala
2c5b0 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20  nced.  But odds 
2c5c0 61 72 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c  are that we will
2c5d0 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65   be inserting ne
2c5e0 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20  w entries.** at 
2c5f0 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74  the end soon aft
2c600 65 72 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e  erwards so the n
2c610 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65  early empty page
2c620 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a   will quickly.**
2c630 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76   fill up.  On av
2c640 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61  erage..**.** pPa
2c650 67 65 20 69 73 20 74 68 65 20 6c 65 61 66 20 70  ge is the leaf p
2c660 61 67 65 20 77 68 69 63 68 20 69 73 20 74 68 65  age which is the
2c670 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65   right-most page
2c680 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a   in the tree..**
2c690 20 70 50 61 72 65 6e 74 20 69 73 20 69 74 73 20   pParent is its 
2c6a0 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d  parent.  pPage m
2c6b0 75 73 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c  ust have a singl
2c6c0 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79  e overflow entry
2c6d0 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73  .** which is als
2c6e0 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
2c6f0 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61   entry on the pa
2c700 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 53  ge..**.** The pS
2c710 70 61 63 65 20 62 75 66 66 65 72 20 69 73 20 75  pace buffer is u
2c720 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 74  sed to store a t
2c730 65 6d 70 6f 72 61 72 79 20 63 6f 70 79 20 6f 66  emporary copy of
2c740 20 74 68 65 20 64 69 76 69 64 65 72 0a 2a 2a 20   the divider.** 
2c750 63 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20 62  cell that will b
2c760 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  e inserted into 
2c770 70 50 61 72 65 6e 74 2e 20 53 75 63 68 20 61 20  pParent. Such a 
2c780 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
2c790 20 61 20 34 0a 2a 2a 20 62 79 74 65 20 70 61 67   a 4.** byte pag
2c7a0 65 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65  e number followe
2c7b0 64 20 62 79 20 61 20 76 61 72 69 61 62 6c 65 20  d by a variable 
2c7c0 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2e 20  length integer. 
2c7d0 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64  In other.** word
2c7e0 73 2c 20 61 74 20 6d 6f 73 74 20 31 33 20 62 79  s, at most 13 by
2c7f0 74 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 70  tes. Hence the p
2c800 53 70 61 63 65 20 62 75 66 66 65 72 20 6d 75 73  Space buffer mus
2c810 74 20 62 65 20 61 74 0a 2a 2a 20 6c 65 61 73 74  t be at.** least
2c820 20 31 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a   13 bytes in siz
2c830 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2c840 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d   balance_quick(M
2c850 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
2c860 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
2c870 20 75 38 20 2a 70 53 70 61 63 65 29 7b 0a 20 20   u8 *pSpace){.  
2c880 42 74 53 68 61 72 65 64 20 2a 63 6f 6e 73 74 20  BtShared *const 
2c890 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
2c8a0 3b 20 20 20 20 2f 2a 20 42 2d 54 72 65 65 20 44  ;    /* B-Tree D
2c8b0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 4d 65 6d  atabase */.  Mem
2c8c0 50 61 67 65 20 2a 70 4e 65 77 3b 20 20 20 20 20  Page *pNew;     
2c8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c8e0 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63    /* Newly alloc
2c8f0 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69  ated page */.  i
2c900 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2c910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c920 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
2c930 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  de */.  Pgno pgn
2c940 6f 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  oNew;           
2c950 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c960 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70  Page number of p
2c970 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  New */..  assert
2c980 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2c990 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2c9a0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2c9b0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2c9c0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2c9d0 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
2c9e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2c9f0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20  e->nOverflow==1 
2ca00 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d  );..  if( pPage-
2ca10 3e 6e 43 65 6c 6c 3c 3d 30 20 29 20 72 65 74 75  >nCell<=0 ) retu
2ca20 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2ca30 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c  T_BKPT;..  /* Al
2ca40 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
2ca50 65 2e 20 54 68 69 73 20 70 61 67 65 20 77 69 6c  e. This page wil
2ca60 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 69 67  l become the rig
2ca70 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20  ht-sibling of . 
2ca80 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65 20   ** pPage. Make 
2ca90 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
2caa0 77 72 69 74 61 62 6c 65 2c 20 73 6f 20 74 68 61  writable, so tha
2cab0 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65  t the new divide
2cac0 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20  r cell.  ** may 
2cad0 62 65 20 69 6e 73 65 72 74 65 64 2e 20 49 66 20  be inserted. If 
2cae0 62 6f 74 68 20 74 68 65 73 65 20 6f 70 65 72 61  both these opera
2caf0 74 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65 73  tions are succes
2cb00 73 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20  sful, proceed.. 
2cb10 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63   */.  rc = alloc
2cb20 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
2cb30 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65  , &pNew, &pgnoNe
2cb40 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66 28  w, 0, 0);..  if(
2cb50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2cb60 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75 74 20  {..    u8 *pOut 
2cb70 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20  = &pSpace[4];.  
2cb80 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50    u8 *pCell = pP
2cb90 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43  age->aOvfl[0].pC
2cba0 65 6c 6c 3b 0a 20 20 20 20 75 31 36 20 73 7a 43  ell;.    u16 szC
2cbb0 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ell = cellSizePt
2cbc0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  r(pPage, pCell);
2cbd0 0a 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a  .    u8 *pStop;.
2cbe0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
2cbf0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2cc00 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61  able(pNew->pDbPa
2cc10 67 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ge) );.    asser
2cc20 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  t( pPage->aData[
2cc30 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c  0]==(PTF_INTKEY|
2cc40 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
2cc50 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20 20 7a 65  _LEAF) );.    ze
2cc60 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 50 54 46  roPage(pNew, PTF
2cc70 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
2cc80 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a  DATA|PTF_LEAF);.
2cc90 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
2cca0 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c  (pNew, 1, &pCell
2ccb0 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20  , &szCell);..   
2ccc0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
2ccd0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
2cce0 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
2ccf0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20  he pointer map. 
2cd00 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69     ** with entri
2cd10 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70  es for the new p
2cd20 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69  age, and any poi
2cd30 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20  nter from the . 
2cd40 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68     ** cell on th
2cd50 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65  e page to an ove
2cd60 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 65  rflow page. If e
2cd70 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a 20  ither of these. 
2cd80 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73     ** operations
2cd90 20 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74 75   fails, the retu
2cda0 72 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c 20  rn code is set, 
2cdb0 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  but the contents
2cdc0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  .    ** of the p
2cdd0 61 72 65 6e 74 20 70 61 67 65 20 61 72 65 20 73  arent page are s
2cde0 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64  till manipulated
2cdf0 20 62 79 20 74 68 68 20 63 6f 64 65 20 62 65 6c   by thh code bel
2ce00 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20  ow..    ** That 
2ce10 69 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20 70  is Ok, at this p
2ce20 6f 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74 20  oint the parent 
2ce30 70 61 67 65 20 69 73 20 67 75 61 72 61 6e 74 65  page is guarante
2ce40 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ed to.    ** be 
2ce50 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
2ce60 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
2ce70 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63 61  ror code will ca
2ce80 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c  use a.    ** rol
2ce90 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61  lback, undoing a
2cea0 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  ny changes made 
2ceb0 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
2cec0 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
2ced0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
2cee0 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
2cef0 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c  ut(pBt, pgnoNew,
2cf00 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
2cf10 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72  Parent->pgno, &r
2cf20 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  c);.      if( sz
2cf30 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f  Cell>pNew->minLo
2cf40 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  cal ){.        p
2cf50 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
2cf60 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72 63  pNew, pCell, &rc
2cf70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2cf80 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  .  .    /* Creat
2cf90 65 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  e a divider cell
2cfa0 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
2cfb0 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69 76  pParent. The div
2cfc0 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a  ider cell.    **
2cfd0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34   consists of a 4
2cfe0 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65  -byte page numbe
2cff0 72 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d 62  r (the page numb
2d000 65 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e 64  er of pPage) and
2d010 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61 62  .    ** a variab
2d020 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76 61  le length key va
2d030 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73 74 20  lue (which must 
2d040 62 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  be the same valu
2d050 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  e as the.    ** 
2d060 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 70  largest key on p
2d070 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  Page)..    **.  
2d080 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68 65    ** To find the
2d090 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61 6c   largest key val
2d0a0 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69 72  ue on pPage, fir
2d0b0 73 74 20 66 69 6e 64 20 74 68 65 20 72 69 67 68  st find the righ
2d0c0 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63  t-most .    ** c
2d0d0 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54 68  ell on pPage. Th
2d0e0 65 20 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c  e first two fiel
2d0f0 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20  ds of this cell 
2d100 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  are the .    ** 
2d110 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61  record-length (a
2d120 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
2d130 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73 74   integer at most
2d140 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a 65   32-bits in size
2d150 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65  ).    ** and the
2d160 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76 61   key value (a va
2d170 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
2d180 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65 20  teger, may have 
2d190 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20 20  any value)..    
2d1a0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66 20  ** The first of 
2d1b0 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c  the while(...) l
2d1c0 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70 73  oops below skips
2d1d0 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72 64   over the record
2d1e0 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66  -length.    ** f
2d1f0 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e 64  ield. The second
2d200 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70   while(...) loop
2d210 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79 20   copies the key 
2d220 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a 20  value from the. 
2d230 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50     ** cell on pP
2d240 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53 70  age into the pSp
2d250 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20  ace buffer..    
2d260 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66  */.    pCell = f
2d270 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
2d280 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a  Page->nCell-1);.
2d290 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65      pStop = &pCe
2d2a0 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65  ll[9];.    while
2d2b0 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78  ( (*(pCell++)&0x
2d2c0 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74  80) && pCell<pSt
2d2d0 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70 20  op );.    pStop 
2d2e0 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20  = &pCell[9];.   
2d2f0 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75 74   while( ((*(pOut
2d300 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29  ++) = *(pCell++)
2d310 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c  )&0x80) && pCell
2d320 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f  <pStop );..    /
2d330 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
2d340 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
2d350 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20  to pParent. */. 
2d360 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50     insertCell(pP
2d370 61 72 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d 3e  arent, pParent->
2d380 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20 28  nCell, pSpace, (
2d390 69 6e 74 29 28 70 4f 75 74 2d 70 53 70 61 63 65  int)(pOut-pSpace
2d3a0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2d3b0 20 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f    0, pPage->pgno
2d3c0 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a 20  , &rc);..    /* 
2d3d0 53 65 74 20 74 68 65 20 72 69 67 68 74 2d 63 68  Set the right-ch
2d3e0 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 70  ild pointer of p
2d3f0 50 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20  Parent to point 
2d400 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  to the new page.
2d410 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65   */.    put4byte
2d420 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
2d430 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
2d440 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29  set+8], pgnoNew)
2d450 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65  ;.  .    /* Rele
2d460 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ase the referenc
2d470 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  e to the new pag
2d480 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73  e. */.    releas
2d490 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d  ePage(pNew);.  }
2d4a0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2d4b0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2d4c0 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
2d4d0 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a  NCE */..#if 0./*
2d4e0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2d4f0 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72  n does not contr
2d500 69 62 75 74 65 20 61 6e 79 74 68 69 6e 67 20 74  ibute anything t
2d510 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  o the operation 
2d520 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69 74  of SQLite..** it
2d530 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 61 63   is sometimes ac
2d540 74 69 76 61 74 65 64 20 74 65 6d 70 6f 72 61 72  tivated temporar
2d550 69 6c 79 20 77 68 69 6c 65 20 64 65 62 75 67 67  ily while debugg
2d560 69 6e 67 20 63 6f 64 65 20 72 65 73 70 6f 6e 73  ing code respons
2d570 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65 74  ible .** for set
2d580 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61 70  ting pointer-map
2d590 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61   entries..*/.sta
2d5a0 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 43 68  tic int ptrmapCh
2d5b0 65 63 6b 50 61 67 65 73 28 4d 65 6d 50 61 67 65  eckPages(MemPage
2d5c0 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74 20 6e   **apPage, int n
2d5d0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20  Page){.  int i, 
2d5e0 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  j;.  for(i=0; i<
2d5f0 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nPage; i++){.   
2d600 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38 20   Pgno n;.    u8 
2d610 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  e;.    MemPage *
2d620 70 50 61 67 65 20 3d 20 61 70 50 61 67 65 5b 69  pPage = apPage[i
2d630 5d 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ];.    BtShared 
2d640 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
2d650 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
2d660 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2d670 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
2d680 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b  pPage->nCell; j+
2d690 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e  +){.      CellIn
2d6a0 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 75  fo info;.      u
2d6b0 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20 20  8 *z;.     .    
2d6c0 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70    z = findCell(p
2d6d0 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20  Page, j);.      
2d6e0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
2d6f0 72 28 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e 66  r(pPage, z, &inf
2d700 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e  o);.      if( in
2d710 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  fo.iOverflow ){.
2d720 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66          Pgno ovf
2d730 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 7a 5b  l = get4byte(&z[
2d740 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
2d750 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  ;.        ptrmap
2d760 47 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26  Get(pBt, ovfl, &
2d770 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  e, &n);.        
2d780 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65  assert( n==pPage
2d790 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52  ->pgno && e==PTR
2d7a0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 3b  MAP_OVERFLOW1 );
2d7b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2d7c0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2d7d0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
2d7e0 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  child = get4byte
2d7f0 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  (z);.        ptr
2d800 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c  mapGet(pBt, chil
2d810 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20  d, &e, &n);.    
2d820 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70      assert( n==p
2d830 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d  Page->pgno && e=
2d840 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b  =PTRMAP_BTREE );
2d850 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2d860 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
2d870 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
2d880 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79  o child = get4by
2d890 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2d8a0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2d8b0 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70 74 72  t+8]);.      ptr
2d8c0 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c  mapGet(pBt, chil
2d8d0 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20  d, &e, &n);.    
2d8e0 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61    assert( n==pPa
2d8f0 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50  ge->pgno && e==P
2d900 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20  TRMAP_BTREE );. 
2d910 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2d920 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 1;.}.#endif../
2d930 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2d940 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  on is used to co
2d950 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  py the contents 
2d960 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f  of the b-tree no
2d970 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e  de stored .** on
2d980 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70   page pFrom to p
2d990 61 67 65 20 70 54 6f 2e 20 49 66 20 70 61 67 65  age pTo. If page
2d9a0 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20 61   pFrom was not a
2d9b0 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 6e   leaf page, then
2d9c0 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  .** the pointer-
2d9d0 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
2d9e0 65 61 63 68 20 63 68 69 6c 64 20 70 61 67 65 20  each child page 
2d9f0 61 72 65 20 75 70 64 61 74 65 64 20 73 6f 20 74  are updated so t
2da00 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 72 65 6e  hat the.** paren
2da10 74 20 70 61 67 65 20 73 74 6f 72 65 64 20 69 6e  t page stored in
2da20 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
2da30 20 69 73 20 70 61 67 65 20 70 54 6f 2e 20 49 66   is page pTo. If
2da40 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65 64   pFrom contained
2da50 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77 69  .** any cells wi
2da60 74 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  th overflow page
2da70 20 70 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e 20   pointers, then 
2da80 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
2da90 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  g pointer.** map
2daa0 20 65 6e 74 72 69 65 73 20 61 72 65 20 61 6c 73   entries are als
2dab0 6f 20 75 70 64 61 74 65 64 20 73 6f 20 74 68 61  o updated so tha
2dac0 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  t the parent pag
2dad0 65 20 69 73 20 70 61 67 65 20 70 54 6f 2e 0a 2a  e is page pTo..*
2dae0 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69 73  *.** If pFrom is
2daf0 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 72 79   currently carry
2db00 69 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  ing any overflow
2db10 20 63 65 6c 6c 73 20 28 65 6e 74 72 69 65 73 20   cells (entries 
2db20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61 67  in the.** MemPag
2db30 65 2e 61 4f 76 66 6c 5b 5d 20 61 72 72 61 79 29  e.aOvfl[] array)
2db40 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 63  , they are not c
2db50 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a 2a  opied to pTo. .*
2db60 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
2db70 72 6e 69 6e 67 2c 20 70 61 67 65 20 70 54 6f 20  rning, page pTo 
2db80 69 73 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64  is reinitialized
2db90 20 75 73 69 6e 67 20 62 74 72 65 65 49 6e 69 74   using btreeInit
2dba0 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  Page()..**.** Th
2dbb0 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66  e performance of
2dbc0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2dbd0 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e 20  s not critical. 
2dbe0 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  It is only used 
2dbf0 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61 6e  by .** the balan
2dc00 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20 61  ce_shallower() a
2dc10 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  nd balance_deepe
2dc20 72 28 29 20 70 72 6f 63 65 64 75 72 65 73 2c 20  r() procedures, 
2dc30 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77 68  neither of.** wh
2dc40 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64 20 6f  ich are called o
2dc50 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d 61  ften under norma
2dc60 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2e  l circumstances.
2dc70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2dc80 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28  copyNodeContent(
2dc90 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20  MemPage *pFrom, 
2dca0 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20 69 6e  MemPage *pTo, in
2dcb0 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28  t *pRC){.  if( (
2dcc0 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  *pRC)==SQLITE_OK
2dcd0 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
2dce0 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d 20 70   * const pBt = p
2dcf0 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20 20 75  From->pBt;.    u
2dd00 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d 20  8 * const aFrom 
2dd10 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a  = pFrom->aData;.
2dd20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61      u8 * const a
2dd30 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b  To = pTo->aData;
2dd40 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69  .    int const i
2dd50 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d 2d  FromHdr = pFrom-
2dd60 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  >hdrOffset;.    
2dd70 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64 72  int const iToHdr
2dd80 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d   = ((pTo->pgno==
2dd90 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a 20  1) ? 100 : 0);. 
2dda0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69     int rc;.    i
2ddb0 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a 20 20 0a  nt iData;.  .  .
2ddc0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
2ddd0 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  m->isInit );.   
2dde0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
2ddf0 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b  nFree>=iToHdr );
2de00 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
2de10 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72  2byte(&aFrom[iFr
2de20 6f 6d 48 64 72 2b 35 5d 29 3c 3d 70 42 74 2d 3e  omHdr+5])<=pBt->
2de30 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
2de40 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65  .    /* Copy the
2de50 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e   b-tree node con
2de60 74 65 6e 74 20 66 72 6f 6d 20 70 61 67 65 20 70  tent from page p
2de70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f  From to page pTo
2de80 2e 20 2a 2f 0a 20 20 20 20 69 44 61 74 61 20 3d  . */.    iData =
2de90 20 67 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d   get2byte(&aFrom
2dea0 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20  [iFromHdr+5]);. 
2deb0 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69     memcpy(&aTo[i
2dec0 44 61 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44  Data], &aFrom[iD
2ded0 61 74 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c  ata], pBt->usabl
2dee0 65 53 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20  eSize-iData);.  
2def0 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 54    memcpy(&aTo[iT
2df00 6f 48 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46  oHdr], &aFrom[iF
2df10 72 6f 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e  romHdr], pFrom->
2df20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
2df30 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  From->nCell);.  
2df40 0a 20 20 20 20 2f 2a 20 52 65 69 6e 69 74 69 61  .    /* Reinitia
2df50 6c 69 7a 65 20 70 61 67 65 20 70 54 6f 20 73 6f  lize page pTo so
2df60 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
2df70 74 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ts of the MemPag
2df80 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20  e structure.    
2df90 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77  ** match the new
2dfa0 20 64 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69   data. The initi
2dfb0 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f  alization of pTo
2dfc0 20 63 61 6e 20 61 63 74 75 61 6c 6c 79 20 66 61   can actually fa
2dfd0 69 6c 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20  il under.    ** 
2dfe0 66 61 69 72 6c 79 20 6f 62 73 63 75 72 65 20 63  fairly obscure c
2dff0 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 65 76  ircumstances, ev
2e000 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 20  en though it is 
2e010 61 20 63 6f 70 79 20 6f 66 20 69 6e 69 74 69 61  a copy of initia
2e020 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 70 61  lized .    ** pa
2e030 67 65 20 70 46 72 6f 6d 2e 0a 20 20 20 20 2a 2f  ge pFrom..    */
2e040 0a 20 20 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74  .    pTo->isInit
2e050 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 62   = 0;.    rc = b
2e060 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 54 6f  treeInitPage(pTo
2e070 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2e080 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e090 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
2e0a0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
2e0b0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
2e0c0 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
2e0d0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
2e0e0 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
2e0f0 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20  r-map entries.  
2e100 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74    ** for any b-t
2e110 72 65 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ree or overflow 
2e120 70 61 67 65 73 20 74 68 61 74 20 70 54 6f 20 6e  pages that pTo n
2e130 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ow contains the 
2e140 70 6f 69 6e 74 65 72 73 20 74 6f 2e 0a 20 20 20  pointers to..   
2e150 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55   */.    if( ISAU
2e160 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
2e170 20 20 2a 70 52 43 20 3d 20 73 65 74 43 68 69 6c    *pRC = setChil
2e180 64 50 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20  dPtrmaps(pTo);. 
2e190 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
2e1a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
2e1b0 65 64 69 73 74 72 69 62 75 74 65 73 20 63 65 6c  edistributes cel
2e1c0 6c 73 20 6f 6e 20 74 68 65 20 69 50 61 72 65 6e  ls on the iParen
2e1d0 74 49 64 78 27 74 68 20 63 68 69 6c 64 20 6f 66  tIdx'th child of
2e1e0 20 70 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72   pParent.** (her
2e1f0 65 61 66 74 65 72 20 22 74 68 65 20 70 61 67 65  eafter "the page
2e200 22 29 20 61 6e 64 20 75 70 20 74 6f 20 32 20 73  ") and up to 2 s
2e210 69 62 6c 69 6e 67 73 20 73 6f 20 74 68 61 74 20  iblings so that 
2e220 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 61  all pages have a
2e230 62 6f 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65  bout the.** same
2e240 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20   amount of free 
2e250 73 70 61 63 65 2e 20 55 73 75 61 6c 6c 79 20 61  space. Usually a
2e260 20 73 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20   single sibling 
2e270 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  on either side o
2e280 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 61 72  f the.** page ar
2e290 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 62 61  e used in the ba
2e2a0 6c 61 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68 20  lancing, though 
2e2b0 62 6f 74 68 20 73 69 62 6c 69 6e 67 73 20 6d 69  both siblings mi
2e2c0 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e  ght come from on
2e2d0 65 0a 2a 2a 20 73 69 64 65 20 69 66 20 74 68 65  e.** side if the
2e2e0 20 70 61 67 65 20 69 73 20 74 68 65 20 66 69 72   page is the fir
2e2f0 73 74 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64  st or last child
2e300 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20   of its parent. 
2e310 49 66 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20  If the page .** 
2e320 68 61 73 20 66 65 77 65 72 20 74 68 61 6e 20 32  has fewer than 2
2e330 20 73 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74   siblings (somet
2e340 68 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f  hing which can o
2e350 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68  nly happen if th
2e360 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 20 72  e page.** is a r
2e370 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20 63 68  oot page or a ch
2e380 69 6c 64 20 6f 66 20 61 20 72 6f 6f 74 20 70 61  ild of a root pa
2e390 67 65 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61  ge) then all ava
2e3a0 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 0a  ilable siblings.
2e3b0 2a 2a 20 70 61 72 74 69 63 69 70 61 74 65 20 69  ** participate i
2e3c0 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e  n the balancing.
2e3d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65  .**.** The numbe
2e3e0 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66  r of siblings of
2e3f0 20 74 68 65 20 70 61 67 65 20 6d 69 67 68 74 20   the page might 
2e400 62 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20  be increased or 
2e410 64 65 63 72 65 61 73 65 64 20 62 79 20 0a 2a 2a  decreased by .**
2e420 20 6f 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20 61   one or two in a
2e430 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70  n effort to keep
2e440 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75   pages nearly fu
2e450 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20  ll but not over 
2e460 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74  full. .**.** Not
2e470 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73  e that when this
2e480 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2e490 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  ed, some of the 
2e4a0 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
2e4b0 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61  e.** might not a
2e4c0 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65  ctually be store
2e4d0 64 20 69 6e 20 4d 65 6d 50 61 67 65 2e 61 44 61  d in MemPage.aDa
2e4e0 74 61 5b 5d 2e 20 54 68 69 73 20 63 61 6e 20 68  ta[]. This can h
2e4f0 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20  appen.** if the 
2e500 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c  page is overfull
2e510 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  . This routine e
2e520 6e 73 75 72 65 73 20 74 68 61 74 20 61 6c 6c 20  nsures that all 
2e530 63 65 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64 0a  cells allocated.
2e540 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 61  ** to the page a
2e550 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20  nd its siblings 
2e560 66 69 74 20 69 6e 74 6f 20 4d 65 6d 50 61 67 65  fit into MemPage
2e570 2e 61 44 61 74 61 5b 5d 20 62 65 66 6f 72 65 20  .aData[] before 
2e580 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
2e590 20 49 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f   In the course o
2e5a0 66 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20  f balancing the 
2e5b0 70 61 67 65 20 61 6e 64 20 69 74 73 20 73 69 62  page and its sib
2e5c0 6c 69 6e 67 73 2c 20 63 65 6c 6c 73 20 6d 61 79  lings, cells may
2e5d0 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20   be.** inserted 
2e5e0 69 6e 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20  into or removed 
2e5f0 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20  from the parent 
2e600 70 61 67 65 20 28 70 50 61 72 65 6e 74 29 2e 20  page (pParent). 
2e610 44 6f 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79 20  Doing so.** may 
2e620 63 61 75 73 65 20 74 68 65 20 70 61 72 65 6e 74  cause the parent
2e630 20 70 61 67 65 20 74 6f 20 62 65 63 6f 6d 65 20   page to become 
2e640 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65  overfull or unde
2e650 72 66 75 6c 6c 2e 20 49 66 20 74 68 69 73 0a 2a  rfull. If this.*
2e660 2a 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73  * happens, it is
2e670 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
2e680 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
2e690 72 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20  r to invoke the 
2e6a0 63 6f 72 72 65 63 74 0a 2a 2a 20 62 61 6c 61 6e  correct.** balan
2e6b0 63 69 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f 20  cing routine to 
2e6c0 66 69 78 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  fix this problem
2e6d0 20 28 73 65 65 20 74 68 65 20 62 61 6c 61 6e 63   (see the balanc
2e6e0 65 28 29 20 72 6f 75 74 69 6e 65 29 2e 20 0a 2a  e() routine). .*
2e6f0 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75  *.** If this rou
2e700 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61  tine fails for a
2e710 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69  ny reason, it mi
2e720 67 68 74 20 6c 65 61 76 65 20 74 68 65 20 64 61  ght leave the da
2e730 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63  tabase.** in a c
2e740 6f 72 72 75 70 74 65 64 20 73 74 61 74 65 2e 20  orrupted state. 
2e750 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
2e760 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61  ne fails, the da
2e770 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a  tabase should.**
2e780 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
2e790 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72 64  .**.** The third
2e7a0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
2e7b0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 4f 76 66  s function, aOvf
2e7c0 6c 53 70 61 63 65 2c 20 69 73 20 61 20 70 6f 69  lSpace, is a poi
2e7d0 6e 74 65 72 20 74 6f 20 61 0a 2a 2a 20 62 75 66  nter to a.** buf
2e7e0 66 65 72 20 62 69 67 20 65 6e 6f 75 67 68 20 74  fer big enough t
2e7f0 6f 20 68 6f 6c 64 20 6f 6e 65 20 70 61 67 65 2e  o hold one page.
2e800 20 49 66 20 77 68 69 6c 65 20 69 6e 73 65 72 74   If while insert
2e810 69 6e 67 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74  ing cells into t
2e820 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20 70 61 67  he parent.** pag
2e830 65 20 28 70 50 61 72 65 6e 74 29 20 74 68 65 20  e (pParent) the 
2e840 70 61 72 65 6e 74 20 70 61 67 65 20 62 65 63 6f  parent page beco
2e850 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68  mes overfull, th
2e860 69 73 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20  is buffer is.** 
2e870 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
2e880 65 20 70 61 72 65 6e 74 27 73 20 6f 76 65 72 66  e parent's overf
2e890 6c 6f 77 20 63 65 6c 6c 73 2e 20 42 65 63 61 75  low cells. Becau
2e8a0 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  se this function
2e8b0 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61 20 6d 61   inserts.** a ma
2e8c0 78 69 6d 75 6d 20 6f 66 20 66 6f 75 72 20 64 69  ximum of four di
2e8d0 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f  vider cells into
2e8e0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2e8f0 2c 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75  , and the maximu
2e900 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 61 20 63  m.** size of a c
2e910 65 6c 6c 20 73 74 6f 72 65 64 20 77 69 74 68 69  ell stored withi
2e920 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  n an internal no
2e930 64 65 20 69 73 20 61 6c 77 61 79 73 20 6c 65 73  de is always les
2e940 73 20 74 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f 66  s than 1/4.** of
2e950 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20   the page-size, 
2e960 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d  the aOvflSpace[]
2e970 20 62 75 66 66 65 72 20 69 73 20 67 75 61 72 61   buffer is guara
2e980 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 61 72 67  nteed to be larg
2e990 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 66 6f 72 20  e.** enough for 
2e9a0 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  all overflow cel
2e9b0 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f 76  ls..**.** If aOv
2e9c0 66 6c 53 70 61 63 65 20 69 73 20 73 65 74 20 74  flSpace is set t
2e9d0 6f 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  o a null pointer
2e9e0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
2e9f0 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
2ea00 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61  TE_NOMEM..*/.sta
2ea10 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
2ea20 6e 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d 50 61  nonroot(.  MemPa
2ea30 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20  ge *pParent,    
2ea40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2ea50 72 65 6e 74 20 70 61 67 65 20 6f 66 20 73 69 62  rent page of sib
2ea60 6c 69 6e 67 73 20 62 65 69 6e 67 20 62 61 6c 61  lings being bala
2ea70 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50  nced */.  int iP
2ea80 61 72 65 6e 74 49 64 78 2c 20 20 20 20 20 20 20  arentIdx,       
2ea90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2eaa0 65 78 20 6f 66 20 22 74 68 65 20 70 61 67 65 22  ex of "the page"
2eab0 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20   in pParent */. 
2eac0 20 75 38 20 2a 61 4f 76 66 6c 53 70 61 63 65 2c   u8 *aOvflSpace,
2ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eae0 20 2f 2a 20 70 61 67 65 2d 73 69 7a 65 20 62 79   /* page-size by
2eaf0 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
2eb00 20 70 61 72 65 6e 74 20 6f 76 66 6c 20 2a 2f 0a   parent ovfl */.
2eb10 20 20 69 6e 74 20 69 73 52 6f 6f 74 20 20 20 20    int isRoot    
2eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb30 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61    /* True if pPa
2eb40 72 65 6e 74 20 69 73 20 61 20 72 6f 6f 74 2d 70  rent is a root-p
2eb50 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  age */.){.  BtSh
2eb60 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
2eb70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2eb80 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a  whole database *
2eb90 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20  /.  int nCell = 
2eba0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2ebb0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
2ebc0 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
2ebd0 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c  */.  int nMaxCel
2ebe0 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ls = 0;         
2ebf0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
2ec00 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73  ize of apCell, s
2ec10 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f  zCell, aFrom. */
2ec20 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b  .  int nNew = 0;
2ec30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec40 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
2ec50 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f  es in apNew[] */
2ec60 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20  .  int nOld;    
2ec70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec80 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
2ec90 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f  es in apOld[] */
2eca0 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20  .  int i, j, k; 
2ecb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ecc0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
2ecd0 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b   */.  int nxDiv;
2ece0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ecf0 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64     /* Next divid
2ed00 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65  er slot in pPare
2ed10 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  nt->aCell[] */. 
2ed20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2ed30 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
2ed40 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
2ed50 20 2a 2f 0a 20 20 75 31 36 20 6c 65 61 66 43 6f   */.  u16 leafCo
2ed60 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20  rrection;       
2ed70 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65     /* 4 if pPage
2ed80 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69   is a leaf.  0 i
2ed90 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  f not */.  int l
2eda0 65 61 66 44 61 74 61 3b 20 20 20 20 20 20 20 20  eafData;        
2edb0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2edc0 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
2edd0 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41  af of a LEAFDATA
2ede0 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75   tree */.  int u
2edf0 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20  sableSpace;     
2ee00 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
2ee10 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64   in pPage beyond
2ee20 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
2ee30 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20   int pageFlags; 
2ee40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ee50 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d   Value of pPage-
2ee60 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69  >aData[0] */.  i
2ee70 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20  nt subtotal;    
2ee80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2ee90 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73  ubtotal of bytes
2eea0 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65   in cells on one
2eeb0 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
2eec0 53 70 61 63 65 31 20 3d 20 30 3b 20 20 20 20 20  Space1 = 0;     
2eed0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2eee0 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20   unused byte of 
2eef0 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69  aSpace1[] */.  i
2ef00 6e 74 20 69 4f 76 66 6c 53 70 61 63 65 20 3d 20  nt iOvflSpace = 
2ef10 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  0;          /* F
2ef20 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65  irst unused byte
2ef30 20 6f 66 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d   of aOvflSpace[]
2ef40 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72 61   */.  int szScra
2ef50 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  tch;            
2ef60 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63     /* Size of sc
2ef70 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72 65 71  ratch memory req
2ef80 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50  uested */.  MemP
2ef90 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20  age *apOld[NB]; 
2efa0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67           /* pPag
2efb0 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20  e and up to two 
2efc0 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d 65  siblings */.  Me
2efd0 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42  mPage *apCopy[NB
2efe0 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72  ];         /* Pr
2eff0 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20  ivate copies of 
2f000 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f  apOld[] pages */
2f010 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65  .  MemPage *apNe
2f020 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
2f030 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  /* pPage and up 
2f040 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61  to NB siblings a
2f050 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a  fter balancing *
2f060 2f 0a 20 20 75 38 20 2a 70 52 69 67 68 74 3b 20  /.  u8 *pRight; 
2f070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f080 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 69 6e 20   /* Location in 
2f090 70 61 72 65 6e 74 20 6f 66 20 72 69 67 68 74 2d  parent of right-
2f0a0 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74 65 72 20  sibling pointer 
2f0b0 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e  */.  u8 *apDiv[N
2f0c0 42 2d 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20  B-1];           
2f0d0 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c    /* Divider cel
2f0e0 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f  ls in pParent */
2f0f0 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42  .  int cntNew[NB
2f100 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  +2];            
2f110 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c  /* Index in aCel
2f120 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65  l[] of cell afte
2f130 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20  r i-th page */. 
2f140 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d   int szNew[NB+2]
2f150 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2f160 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f   Combined size o
2f170 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e  f cells place on
2f180 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20   i-th page */.  
2f190 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b  u8 **apCell = 0;
2f1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f1b0 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20  All cells begin 
2f1c0 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31  balanced */.  u1
2f1d0 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20  6 *szCell;      
2f1e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2f1f0 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20  cal size of all 
2f200 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
2f210 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63  ] */.  u8 *aSpac
2f220 65 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  e1;             
2f230 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
2f240 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76 69 64   copies of divid
2f250 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 50  ers cells */.  P
2f260 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
2f270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2f280 65 6d 70 20 76 61 72 20 74 6f 20 73 74 6f 72 65  emp var to store
2f290 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69   a page number i
2f2a0 6e 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50  n */..  pBt = pP
2f2b0 61 72 65 6e 74 2d 3e 70 42 74 3b 0a 20 20 61 73  arent->pBt;.  as
2f2c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2f2d0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
2f2e0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
2f2f0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2f300 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
2f310 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  t->pDbPage) );..
2f320 23 69 66 20 30 0a 20 20 54 52 41 43 45 28 28 22  #if 0.  TRACE(("
2f330 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70  BALANCE: begin p
2f340 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20  age %d child of 
2f350 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  %d\n", pPage->pg
2f360 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  no, pParent->pgn
2f370 6f 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  o));.#endif..  /
2f380 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
2f390 70 50 61 72 65 6e 74 20 6d 61 79 20 68 61 76 65  pParent may have
2f3a0 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 6f 76 65   at most one ove
2f3b0 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e 64 20  rflow cell. And 
2f3c0 69 66 0a 20 20 2a 2a 20 74 68 69 73 20 6f 76 65  if.  ** this ove
2f3d0 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20 70 72  rflow cell is pr
2f3e0 65 73 65 6e 74 2c 20 69 74 20 6d 75 73 74 20 62  esent, it must b
2f3f0 65 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20  e the cell with 
2f400 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 50 61 72  .  ** index iPar
2f410 65 6e 74 49 64 78 2e 20 54 68 69 73 20 73 63 65  entIdx. This sce
2f420 6e 61 72 69 6f 20 63 6f 6d 65 73 20 61 62 6f 75  nario comes abou
2f430 74 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  t when this func
2f440 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 63 61 6c  tion.  ** is cal
2f450 6c 65 64 20 28 69 6e 64 69 72 65 63 74 6c 79 29  led (indirectly)
2f460 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72   from sqlite3Btr
2f470 65 65 44 65 6c 65 74 65 28 29 2e 0a 20 20 2a 2f  eeDelete()..  */
2f480 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
2f490 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  nt->nOverflow==0
2f4a0 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76   || pParent->nOv
2f4b0 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 61  erflow==1 );.  a
2f4c0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
2f4d0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20  nOverflow==0 || 
2f4e0 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30  pParent->aOvfl[0
2f4f0 5d 2e 69 64 78 3d 3d 69 50 61 72 65 6e 74 49 64  ].idx==iParentId
2f500 78 20 29 3b 0a 0a 20 20 69 66 28 20 21 61 4f 76  x );..  if( !aOv
2f510 66 6c 53 70 61 63 65 20 29 7b 0a 20 20 20 20 72  flSpace ){.    r
2f520 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2f530 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  EM;.  }..  /* Fi
2f540 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  nd the sibling p
2f550 61 67 65 73 20 74 6f 20 62 61 6c 61 6e 63 65 2e  ages to balance.
2f560 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20 74 68 65   Also locate the
2f570 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
2f580 74 20 0a 20 20 2a 2a 20 74 68 61 74 20 64 69 76  t .  ** that div
2f590 69 64 65 20 74 68 65 20 73 69 62 6c 69 6e 67 73  ide the siblings
2f5a0 2e 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20  . An attempt is 
2f5b0 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20  made to find NN 
2f5c0 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a 20 20 2a  siblings on .  *
2f5d0 2a 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  * either side of
2f5e0 20 70 50 61 67 65 2e 20 4d 6f 72 65 20 73 69 62   pPage. More sib
2f5f0 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20  lings are taken 
2f600 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68  from one side, h
2f610 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a 20 69 66  owever, .  ** if
2f620 20 74 68 65 72 65 20 61 72 65 20 66 65 77 65 72   there are fewer
2f630 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67   than NN sibling
2f640 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73  s on the other s
2f650 69 64 65 2e 20 49 66 20 70 50 61 72 65 6e 74 0a  ide. If pParent.
2f660 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66    ** has NB or f
2f670 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68  ewer children th
2f680 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  en all children 
2f690 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65 20 74  of pParent are t
2f6a0 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  aken.  .  **.  *
2f6b0 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f  * This loop also
2f6c0 20 64 72 6f 70 73 20 74 68 65 20 64 69 76 69 64   drops the divid
2f6d0 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68  er cells from th
2f6e0 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 54  e parent page. T
2f6f0 68 69 73 0a 20 20 2a 2a 20 77 61 79 2c 20 74 68  his.  ** way, th
2f700 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
2f710 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  he function does
2f720 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 64 65 61   not have to dea
2f730 6c 20 77 69 74 68 20 61 6e 79 0a 20 20 2a 2a 20  l with any.  ** 
2f740 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 69  overflow cells i
2f750 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  n the parent pag
2f760 65 2c 20 73 69 6e 63 65 20 69 66 20 61 6e 79 20  e, since if any 
2f770 65 78 69 73 74 65 64 20 74 68 65 79 20 77 69 6c  existed they wil
2f780 6c 0a 20 20 2a 2a 20 68 61 76 65 20 61 6c 72 65  l.  ** have alre
2f790 61 64 79 20 62 65 65 6e 20 72 65 6d 6f 76 65 64  ady been removed
2f7a0 2e 0a 20 20 2a 2f 0a 20 20 69 20 3d 20 70 50 61  ..  */.  i = pPa
2f7b0 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  rent->nOverflow 
2f7c0 2b 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  + pParent->nCell
2f7d0 3b 0a 20 20 69 66 28 20 69 3c 32 20 29 7b 0a 20  ;.  if( i<2 ){. 
2f7e0 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20     nxDiv = 0;.  
2f7f0 20 20 6e 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20 20    nOld = i+1;.  
2f800 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 6c 64 20  }else{.    nOld 
2f810 3d 20 33 3b 0a 20 20 20 20 69 66 28 20 69 50 61  = 3;.    if( iPa
2f820 72 65 6e 74 49 64 78 3d 3d 30 20 29 7b 20 20 20  rentIdx==0 ){   
2f830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20                . 
2f840 20 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a       nxDiv = 0;.
2f850 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 50      }else if( iP
2f860 61 72 65 6e 74 49 64 78 3d 3d 69 20 29 7b 0a 20  arentIdx==i ){. 
2f870 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69 2d 32       nxDiv = i-2
2f880 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2f890 20 20 20 6e 78 44 69 76 20 3d 20 69 50 61 72 65     nxDiv = iPare
2f8a0 6e 74 49 64 78 2d 31 3b 0a 20 20 20 20 7d 0a 20  ntIdx-1;.    }. 
2f8b0 20 20 20 69 20 3d 20 32 3b 0a 20 20 7d 0a 20 20     i = 2;.  }.  
2f8c0 69 66 28 20 28 69 2b 6e 78 44 69 76 2d 70 50 61  if( (i+nxDiv-pPa
2f8d0 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29  rent->nOverflow)
2f8e0 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
2f8f0 20 29 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d   ){.    pRight =
2f900 20 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61   &pParent->aData
2f910 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
2f920 73 65 74 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b  set+8];.  }else{
2f930 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 66 69  .    pRight = fi
2f940 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
2f950 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d  i+nxDiv-pParent-
2f960 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 7d  >nOverflow);.  }
2f970 0a 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79  .  pgno = get4by
2f980 74 65 28 70 52 69 67 68 74 29 3b 0a 20 20 77 68  te(pRight);.  wh
2f990 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 72 63  ile( 1 ){.    rc
2f9a0 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
2f9b0 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 61 70  e(pBt, pgno, &ap
2f9c0 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  Old[i]);.    if(
2f9d0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d   rc ){.      mem
2f9e0 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69  set(apOld, 0, (i
2f9f0 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61  +1)*sizeof(MemPa
2fa00 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 67 6f 74  ge*));.      got
2fa10 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2fa20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61  p;.    }.    nMa
2fa30 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c  xCells += 1+apOl
2fa40 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c  d[i]->nCell+apOl
2fa50 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  d[i]->nOverflow;
2fa60 0a 20 20 20 20 69 66 28 20 28 69 2d 2d 29 3d 3d  .    if( (i--)==
2fa70 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  0 ) break;..    
2fa80 69 66 28 20 69 2b 6e 78 44 69 76 3d 3d 70 50 61  if( i+nxDiv==pPa
2fa90 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  rent->aOvfl[0].i
2faa0 64 78 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e  dx && pParent->n
2fab0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
2fac0 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 70 50 61    apDiv[i] = pPa
2fad0 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70  rent->aOvfl[0].p
2fae0 43 65 6c 6c 3b 0a 20 20 20 20 20 20 70 67 6e 6f  Cell;.      pgno
2faf0 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69   = get4byte(apDi
2fb00 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e  v[i]);.      szN
2fb10 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  ew[i] = cellSize
2fb20 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44  Ptr(pParent, apD
2fb30 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 50  iv[i]);.      pP
2fb40 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
2fb50 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
2fb60 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20  .      apDiv[i] 
2fb70 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  = findCell(pPare
2fb80 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72  nt, i+nxDiv-pPar
2fb90 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b  ent->nOverflow);
2fba0 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  .      pgno = ge
2fbb0 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29  t4byte(apDiv[i])
2fbc0 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d  ;.      szNew[i]
2fbd0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
2fbe0 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d  Parent, apDiv[i]
2fbf0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 72 6f  );..      /* Dro
2fc00 70 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  p the cell from 
2fc10 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
2fc20 20 61 70 44 69 76 5b 69 5d 20 73 74 69 6c 6c 20   apDiv[i] still 
2fc30 70 6f 69 6e 74 73 20 74 6f 0a 20 20 20 20 20 20  points to.      
2fc40 2a 2a 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68  ** the cell with
2fc50 69 6e 20 74 68 65 20 70 61 72 65 6e 74 2c 20 65  in the parent, e
2fc60 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 68 61  ven though it ha
2fc70 73 20 62 65 65 6e 20 64 72 6f 70 70 65 64 2e 0a  s been dropped..
2fc80 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
2fc90 20 73 61 66 65 20 62 65 63 61 75 73 65 20 64 72   safe because dr
2fca0 6f 70 70 69 6e 67 20 61 20 63 65 6c 6c 20 6f 6e  opping a cell on
2fcb0 6c 79 20 6f 76 65 72 77 72 69 74 65 73 20 74 68  ly overwrites th
2fcc0 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a  e first.      **
2fcd0 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69   four bytes of i
2fce0 74 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  t, and this func
2fcf0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65  tion does not ne
2fd00 65 64 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  ed the first.   
2fd10 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73     ** four bytes
2fd20 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
2fd30 63 65 6c 6c 2e 20 53 6f 20 74 68 65 20 70 6f 69  cell. So the poi
2fd40 6e 74 65 72 20 69 73 20 73 61 66 65 20 74 6f 20  nter is safe to 
2fd50 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 74  use.      ** lat
2fd60 65 72 20 6f 6e 2e 20 20 0a 20 20 20 20 20 20 2a  er on.  .      *
2fd70 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73  *.      ** Unles
2fd80 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70  s SQLite is comp
2fd90 69 6c 65 64 20 69 6e 20 73 65 63 75 72 65 2d 64  iled in secure-d
2fda0 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49 6e 20 74  elete mode. In t
2fdb0 68 69 73 20 63 61 73 65 2c 0a 20 20 20 20 20 20  his case,.      
2fdc0 2a 2a 20 74 68 65 20 64 72 6f 70 43 65 6c 6c 28  ** the dropCell(
2fdd0 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  ) routine will o
2fde0 76 65 72 77 72 69 74 65 20 74 68 65 20 65 6e 74  verwrite the ent
2fdf0 69 72 65 20 63 65 6c 6c 20 77 69 74 68 20 7a 65  ire cell with ze
2fe00 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49  roes..      ** I
2fe10 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 65 6d  n this case, tem
2fe20 70 6f 72 61 72 69 6c 79 20 63 6f 70 79 20 74 68  porarily copy th
2fe30 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20  e cell into the 
2fe40 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a 20 20 20  aOvflSpace[].   
2fe50 20 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 49 74     ** buffer. It
2fe60 20 77 69 6c 6c 20 62 65 20 63 6f 70 69 65 64 20   will be copied 
2fe70 6f 75 74 20 61 67 61 69 6e 20 61 73 20 73 6f 6f  out again as soo
2fe80 6e 20 61 73 20 74 68 65 20 61 53 70 61 63 65 5b  n as the aSpace[
2fe90 5d 20 62 75 66 66 65 72 0a 20 20 20 20 20 20 2a  ] buffer.      *
2fea0 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20  * is allocated. 
2feb0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
2fec0 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20  t->secureDelete 
2fed0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
2fee0 79 28 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70  y(&aOvflSpace[ap
2fef0 44 69 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e  Div[i]-pParent->
2ff00 61 44 61 74 61 5d 2c 20 61 70 44 69 76 5b 69 5d  aData], apDiv[i]
2ff10 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20  , szNew[i]);.   
2ff20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20       apDiv[i] = 
2ff30 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69  &aOvflSpace[apDi
2ff40 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44  v[i]-pParent->aD
2ff50 61 74 61 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ata];.      }.  
2ff60 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
2ff70 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50  rent, i+nxDiv-pP
2ff80 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
2ff90 2c 20 73 7a 4e 65 77 5b 69 5d 2c 20 26 72 63 29  , szNew[i], &rc)
2ffa0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
2ffb0 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73  * Make nMaxCells
2ffc0 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34   a multiple of 4
2ffd0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65   in order to pre
2ffe0 73 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a  serve 8-byte.  *
2fff0 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20  * alignment */. 
30000 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d   nMaxCells = (nM
30010 61 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b  axCells + 3)&~3;
30020 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f  ..  /*.  ** Allo
30030 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d  cate space for m
30040 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
30050 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20 70 42 74 2d  .  */.  k = pBt-
30060 3e 70 61 67 65 53 69 7a 65 20 2b 20 52 4f 55 4e  >pageSize + ROUN
30070 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  D8(sizeof(MemPag
30080 65 29 29 3b 0a 20 20 73 7a 53 63 72 61 74 63 68  e));.  szScratch
30090 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65   =.       nMaxCe
300a0 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20  lls*sizeof(u8*) 
300b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
300c0 20 20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20        /* apCell 
300d0 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65  */.     + nMaxCe
300e0 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20  lls*sizeof(u16) 
300f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30100 20 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20        /* szCell 
30110 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70  */.     + pBt->p
30120 61 67 65 53 69 7a 65 20 20 20 20 20 20 20 20 20  ageSize         
30130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30140 20 20 20 20 20 20 2f 2a 20 61 53 70 61 63 65 31        /* aSpace1
30150 20 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a 6e 4f 6c   */.     + k*nOl
30160 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
30170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30180 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
30190 6f 70 69 65 73 20 28 61 70 43 6f 70 79 29 20 2a  opies (apCopy) *
301a0 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c  /.  apCell = sql
301b0 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f  ite3ScratchMallo
301c0 63 28 20 73 7a 53 63 72 61 74 63 68 20 29 3b 20  c( szScratch ); 
301d0 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30  .  if( apCell==0
301e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
301f0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
30200 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
30210 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c  nup;.  }.  szCel
30220 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c  l = (u16*)&apCel
30230 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20  l[nMaxCells];.  
30240 61 53 70 61 63 65 31 20 3d 20 28 75 38 2a 29 26  aSpace1 = (u8*)&
30250 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73  szCell[nMaxCells
30260 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  ];.  assert( EIG
30270 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
30280 54 28 61 53 70 61 63 65 31 29 20 29 3b 0a 0a 20  T(aSpace1) );.. 
30290 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f   /*.  ** Load po
302a0 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65  inters to all ce
302b0 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70  lls on sibling p
302c0 61 67 65 73 20 61 6e 64 20 74 68 65 20 64 69 76  ages and the div
302d0 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  ider cells.  ** 
302e0 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61  into the local a
302f0 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20  pCell[] array.  
30300 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74  Make copies of t
30310 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
30320 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65  .  ** into space
30330 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61   obtained from a
30340 53 70 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d  Space1[] and rem
30350 6f 76 65 20 74 68 65 20 74 68 65 20 64 69 76 69  ove the the divi
30360 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66  der Cells.  ** f
30370 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a  rom pParent..  *
30380 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69  *.  ** If the si
30390 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65  blings are on le
303a0 61 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74  af pages, then t
303b0 68 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  he child pointer
303c0 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69  s of the.  ** di
303d0 76 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20  vider cells are 
303e0 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68  stripped from th
303f0 65 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74  e cells before t
30400 68 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20  hey are copied. 
30410 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31   ** into aSpace1
30420 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79  [].  In this way
30430 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  , all cells in a
30440 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68  pCell[] are with
30450 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70  out.  ** child p
30460 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62  ointers.  If sib
30470 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65  lings are not le
30480 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63  aves, then all c
30490 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65  ell in.  ** apCe
304a0 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69  ll[] include chi
304b0 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69  ld pointers.  Ei
304c0 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65  ther way, all ce
304d0 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a  lls in apCell[].
304e0 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a    ** are alike..
304f0 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f    **.  ** leafCo
30500 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20  rrection:  4 if 
30510 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e  pPage is a leaf.
30520 20 20 30 20 69 66 20 70 50 61 67 65 20 69 73 20    0 if pPage is 
30530 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a  not a leaf..  **
30540 20 20 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a         leafData:
30550 20 20 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c    1 if pPage hol
30560 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20  ds key+data and 
30570 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e  pParent holds on
30580 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20  ly keys..  */.  
30590 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d  leafCorrection =
305a0 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61 66 2a   apOld[0]->leaf*
305b0 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d 20  4;.  leafData = 
305c0 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73 44 61 74  apOld[0]->hasDat
305d0 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  a;.  for(i=0; i<
305e0 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOld; i++){.    
305f0 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 20 20 0a  int limit;.    .
30600 20 20 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f      /* Before do
30610 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73  ing anything els
30620 65 2c 20 74 61 6b 65 20 61 20 63 6f 70 79 20 6f  e, take a copy o
30630 66 20 74 68 65 20 69 27 74 68 20 6f 72 69 67 69  f the i'th origi
30640 6e 61 6c 20 73 69 62 6c 69 6e 67 0a 20 20 20 20  nal sibling.    
30650 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20 74  ** The rest of t
30660 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
30670 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d 20  l use data from 
30680 74 68 65 20 63 6f 70 69 65 73 20 72 61 74 68 65  the copies rathe
30690 72 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68  r.    ** that th
306a0 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  e original pages
306b0 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69   since the origi
306c0 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62  nal pages will b
306d0 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  e in the.    ** 
306e0 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67  process of being
306f0 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a   overwritten.  *
30700 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
30710 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20  Old = apCopy[i] 
30720 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26 61 53 70  = (MemPage*)&aSp
30730 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65 53 69  ace1[pBt->pageSi
30740 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20 20 6d  ze + k*i];.    m
30750 65 6d 63 70 79 28 70 4f 6c 64 2c 20 61 70 4f 6c  emcpy(pOld, apOl
30760 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d  d[i], sizeof(Mem
30770 50 61 67 65 29 29 3b 0a 20 20 20 20 70 4f 6c 64  Page));.    pOld
30780 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 64 2a  ->aData = (void*
30790 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20 20 6d  )&pOld[1];.    m
307a0 65 6d 63 70 79 28 70 4f 6c 64 2d 3e 61 44 61 74  emcpy(pOld->aDat
307b0 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61  a, apOld[i]->aDa
307c0 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  ta, pBt->pageSiz
307d0 65 29 3b 0a 0a 20 20 20 20 6c 69 6d 69 74 20 3d  e);..    limit =
307e0 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c   pOld->nCell+pOl
307f0 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  d->nOverflow;.  
30800 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d    for(j=0; j<lim
30810 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  it; j++){.      
30820 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d  assert( nCell<nM
30830 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
30840 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   apCell[nCell] =
30850 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c   findOverflowCel
30860 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20  l(pOld, j);.    
30870 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
30880 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f  = cellSizePtr(pO
30890 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  ld, apCell[nCell
308a0 5d 29 3b 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b  ]);.      nCell+
308b0 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
308c0 20 69 3c 6e 4f 6c 64 2d 31 20 26 26 20 21 6c 65   i<nOld-1 && !le
308d0 61 66 44 61 74 61 29 7b 0a 20 20 20 20 20 20 75  afData){.      u
308e0 31 36 20 73 7a 20 3d 20 28 75 31 36 29 73 7a 4e  16 sz = (u16)szN
308f0 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 75 38 20  ew[i];.      u8 
30900 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 61 73  *pTemp;.      as
30910 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78  sert( nCell<nMax
30920 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 73  Cells );.      s
30930 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73  zCell[nCell] = s
30940 7a 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d  z;.      pTemp =
30950 20 26 61 53 70 61 63 65 31 5b 69 53 70 61 63 65   &aSpace1[iSpace
30960 31 5d 3b 0a 20 20 20 20 20 20 69 53 70 61 63 65  1];.      iSpace
30970 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61  1 += sz;.      a
30980 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e  ssert( sz<=pBt->
30990 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20  pageSize/4 );.  
309a0 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61      assert( iSpa
309b0 63 65 31 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ce1<=pBt->pageSi
309c0 7a 65 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  ze );.      memc
309d0 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b  py(pTemp, apDiv[
309e0 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 61  i], sz);.      a
309f0 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70  pCell[nCell] = p
30a00 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74  Temp+leafCorrect
30a10 69 6f 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ion;.      asser
30a20 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
30a30 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72  n==0 || leafCorr
30a40 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20  ection==4 );.   
30a50 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
30a60 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d   = szCell[nCell]
30a70 20 2d 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   - leafCorrectio
30a80 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4f  n;.      if( !pO
30a90 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ld->leaf ){.    
30aa0 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
30ab0 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b  Correction==0 );
30ac0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
30ad0 20 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74   pOld->hdrOffset
30ae0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f  ==0 );.        /
30af0 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e  * The right poin
30b00 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ter of the child
30b10 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d   page pOld becom
30b20 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20  es the left.    
30b30 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f      ** pointer o
30b40 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
30b50 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65  ll */.        me
30b60 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c  mcpy(apCell[nCel
30b70 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61  l], &pOld->aData
30b80 5b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d  [8], 4);.      }
30b90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
30ba0 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
30bb0 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20  tion==4 );.     
30bc0 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43     if( szCell[nC
30bd0 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20  ell]<4 ){.      
30be0 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c      /* Do not al
30bf0 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d  low any cells sm
30c00 61 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74  aller than 4 byt
30c10 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  es. */.         
30c20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
30c30 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   4;.        }.  
30c40 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c      }.      nCel
30c50 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  l++;.    }.  }..
30c60 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65    /*.  ** Figure
30c70 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20   out the number 
30c80 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65 64 20  of pages needed 
30c90 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c  to hold all nCel
30ca0 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74  l cells..  ** St
30cb0 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20  ore this number 
30cc0 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f  in "k".  Also co
30cd0 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68  mpute szNew[] wh
30ce0 69 63 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c  ich is the total
30cf0 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c  .  ** size of al
30d00 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69  l cells on the i
30d10 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74  -th page and cnt
30d20 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
30d30 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e  he index.  ** in
30d40 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65   apCell[] of the
30d50 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64   cell that divid
30d60 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70  es page i from p
30d70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20  age i+1.  .  ** 
30d80 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64  cntNew[k] should
30d90 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20   equal nCell..  
30da0 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63  **.  ** Values c
30db0 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69 73 20  omputed by this 
30dc0 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  block:.  **.  **
30dd0 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68             k: Th
30de0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
30df0 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a  f sibling pages.
30e00 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d    **    szNew[i]
30e10 3a 20 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e  : Spaced used on
30e20 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
30e30 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63  g page..  **   c
30e40 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20  ntNew[i]: Index 
30e50 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20  in apCell[] and 
30e60 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65  szCell[] for the
30e70 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20   first cell to. 
30e80 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
30e90 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68   the right of th
30ea0 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70  e i-th sibling p
30eb0 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65  age..  ** usable
30ec0 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66  Space: Number of
30ed0 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
30ee0 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63  available on eac
30ef0 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20  h sibling..  ** 
30f00 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70  .  */.  usableSp
30f10 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ace = pBt->usabl
30f20 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61  eSize - 12 + lea
30f30 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66  fCorrection;.  f
30f40 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d  or(subtotal=k=i=
30f50 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
30f60 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  {.    assert( i<
30f70 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
30f80 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43   subtotal += szC
30f90 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[i] + 2;.    
30fa0 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75  if( subtotal > u
30fb0 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20  sableSpace ){.  
30fc0 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73      szNew[k] = s
30fd0 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c  ubtotal - szCell
30fe0 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65  [i];.      cntNe
30ff0 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  w[k] = i;.      
31000 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20  if( leafData ){ 
31010 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62  i--; }.      sub
31020 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  total = 0;.     
31030 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20   k++;.      if( 
31040 6b 3e 4e 42 2b 31 20 29 7b 20 72 63 20 3d 20 53  k>NB+1 ){ rc = S
31050 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
31060 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  PT; goto balance
31070 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20 20 20 20  _cleanup; }.    
31080 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d  }.  }.  szNew[k]
31090 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63   = subtotal;.  c
310a0 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c  ntNew[k] = nCell
310b0 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20  ;.  k++;..  /*. 
310c0 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20   ** The packing 
310d0 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20  computed by the 
310e0 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69  previous block i
310f0 73 20 62 69 61 73 65 64 20 74 6f 77 61 72 64 20  s biased toward 
31100 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a  the siblings.  *
31110 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69  * on the left si
31120 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69  de.  The left si
31130 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79  blings are alway
31140 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77  s nearly full, w
31150 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69  hile the.  ** ri
31160 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
31170 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79   might be nearly
31180 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c   empty.  This bl
31190 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65  ock of code atte
311a0 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a  mpts.  ** to adj
311b0 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20  ust the packing 
311c0 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67  of siblings to g
311d0 65 74 20 61 20 62 65 74 74 65 72 20 62 61 6c 61  et a better bala
311e0 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
311f0 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69  his adjustment i
31200 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f  s more than an o
31210 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68  ptimization.  Th
31220 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20  e packing above 
31230 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f  might.  ** be so
31240 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20   out of balance 
31250 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c  as to be illegal
31260 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
31270 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20  the right-most. 
31280 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68   ** sibling migh
31290 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20  t be completely 
312a0 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a  empty.  This adj
312b0 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f  ustment is not o
312c0 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  ptional..  */.  
312d0 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20  for(i=k-1; i>0; 
312e0 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a  i--){.    int sz
312f0 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d  Right = szNew[i]
31300 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69  ;  /* Size of si
31310 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67  bling on the rig
31320 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a  ht */.    int sz
31330 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31  Left = szNew[i-1
31340 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69  ]; /* Size of si
31350 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66  bling on the lef
31360 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20  t */.    int r; 
31370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31380 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d  Index of right-m
31390 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74  ost cell in left
313a0 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20   sibling */.    
313b0 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20 20  int d;          
313c0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
313d0 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68  first cell to th
313e0 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20  e left of right 
313f0 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20  sibling */..    
31400 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20  r = cntNew[i-1] 
31410 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b  - 1;.    d = r +
31420 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20   1 - leafData;. 
31430 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61     assert( d<nMa
31440 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73  xCells );.    as
31450 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c  sert( r<nMaxCell
31460 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  s );.    while( 
31470 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a  szRight==0 || sz
31480 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b  Right+szCell[d]+
31490 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c  2<=szLeft-(szCel
314a0 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20  l[r]+2) ){.     
314b0 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65   szRight += szCe
314c0 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20  ll[d] + 2;.     
314d0 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c   szLeft -= szCel
314e0 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20  l[r] + 2;.      
314f0 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20  cntNew[i-1]--;. 
31500 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b       r = cntNew[
31510 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20  i-1] - 1;.      
31520 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66  d = r + 1 - leaf
31530 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Data;.    }.    
31540 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67  szNew[i] = szRig
31550 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d  ht;.    szNew[i-
31560 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d  1] = szLeft;.  }
31570 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65  ..  /* Either we
31580 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f   found one or mo
31590 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77  re cells (cntnew
315a0 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50 61 67 65  [0])>0) or pPage
315b0 20 69 73 0a 20 20 2a 2a 20 61 20 76 69 72 74 75   is.  ** a virtu
315c0 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41  al root page.  A
315d0 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
315e0 67 65 20 69 73 20 77 68 65 6e 20 74 68 65 20 72  ge is when the r
315f0 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61  eal root.  ** pa
31600 67 65 20 69 73 20 70 61 67 65 20 31 20 61 6e 64  ge is page 1 and
31610 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79   we are the only
31620 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70   child of that p
31630 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  age..  */.  asse
31640 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20  rt( cntNew[0]>0 
31650 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e  || (pParent->pgn
31660 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d  o==1 && pParent-
31670 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20  >nCell==0) );.. 
31680 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
31690 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20  : old: %d %d %d 
316a0 20 22 2c 0a 20 20 20 20 61 70 4f 6c 64 5b 30 5d   ",.    apOld[0]
316b0 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 6e 4f 6c  ->pgno, .    nOl
316c0 64 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b 31 5d 2d  d>=2 ? apOld[1]-
316d0 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20 20 20 20 6e  >pgno : 0,.    n
316e0 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c 64 5b 32  Old>=3 ? apOld[2
316f0 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20 20 29 29  ]->pgno : 0.  ))
31700 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c  ;..  /*.  ** All
31710 6f 63 61 74 65 20 6b 20 6e 65 77 20 70 61 67 65  ocate k new page
31720 73 2e 20 20 52 65 75 73 65 20 6f 6c 64 20 70 61  s.  Reuse old pa
31730 67 65 73 20 77 68 65 72 65 20 70 6f 73 73 69 62  ges where possib
31740 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 61  le..  */.  if( a
31750 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d 31  pOld[0]->pgno<=1
31760 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
31770 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
31780 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e  ;.    goto balan
31790 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
317a0 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20 61 70    pageFlags = ap
317b0 4f 6c 64 5b 30 5d 2d 3e 61 44 61 74 61 5b 30 5d  Old[0]->aData[0]
317c0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b  ;.  for(i=0; i<k
317d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50  ; i++){.    MemP
317e0 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69  age *pNew;.    i
317f0 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20  f( i<nOld ){.   
31800 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b     pNew = apNew[
31810 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20  i] = apOld[i];. 
31820 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20       apOld[i] = 
31830 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
31840 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
31850 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a  pNew->pDbPage);.
31860 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20        nNew++;.  
31870 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
31880 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
31890 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  p;.    }else{.  
318a0 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20      assert( i>0 
318b0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  );.      rc = al
318c0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
318d0 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e  pBt, &pNew, &pgn
318e0 6f 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20  o, pgno, 0);.   
318f0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
31900 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
31910 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d  ;.      apNew[i]
31920 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e   = pNew;.      n
31930 4e 65 77 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a  New++;..      /*
31940 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   Set the pointer
31950 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 74  -map entry for t
31960 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70  he new sibling p
31970 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  age. */.      if
31980 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
31990 7b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  {.        ptrmap
319a0 50 75 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70  Put(pBt, pNew->p
319b0 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
319c0 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  E, pParent->pgno
319d0 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
319e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
319f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
31a00 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
31a10 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nup;.        }. 
31a20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
31a30 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20  ..  /* Free any 
31a40 6f 6c 64 20 70 61 67 65 73 20 74 68 61 74 20 77  old pages that w
31a50 65 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61  ere not reused a
31a60 73 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a  s new pages..  *
31a70 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c  /.  while( i<nOl
31a80 64 20 29 7b 0a 20 20 20 20 66 72 65 65 50 61 67  d ){.    freePag
31a90 65 28 61 70 4f 6c 64 5b 69 5d 2c 20 26 72 63 29  e(apOld[i], &rc)
31aa0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
31ab0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
31ac0 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  nup;.    release
31ad0 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a  Page(apOld[i]);.
31ae0 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30      apOld[i] = 0
31af0 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a  ;.    i++;.  }..
31b00 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68    /*.  ** Put th
31b10 65 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61  e new pages in a
31b20 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  ccending order. 
31b30 20 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20   This helps to. 
31b40 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73   ** keep entries
31b50 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   in the disk fil
31b60 65 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68  e in order so th
31b70 61 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f  at a scan.  ** o
31b80 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61  f the table is a
31b90 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72   linear scan thr
31ba0 6f 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20  ough the file.  
31bb0 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72  That.  ** in tur
31bc0 6e 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72  n helps the oper
31bd0 61 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20  ating system to 
31be0 64 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20  deliver pages.  
31bf0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b  ** from the disk
31c00 20 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20   more rapidly.. 
31c10 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e   **.  ** An O(n^
31c20 32 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72  2) insertion sor
31c30 74 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75  t algorithm is u
31c40 73 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20  sed, but since. 
31c50 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d   ** n is never m
31c60 6f 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73  ore than NB (a s
31c70 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20  mall constant), 
31c80 74 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a  that should.  **
31c90 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65   not be a proble
31ca0 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  m..  **.  ** Whe
31cb0 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e  n NB==3, this on
31cc0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d  e optimization m
31cd0 61 6b 65 73 20 74 68 65 20 64 61 74 61 62 61 73  akes the databas
31ce0 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25  e.  ** about 25%
31cf0 20 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67   faster for larg
31d00 65 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64  e insertions and
31d10 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f   deletions..  */
31d20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d  .  for(i=0; i<k-
31d30 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  1; i++){.    int
31d40 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 69 5d   minV = apNew[i]
31d50 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 6e 74 20  ->pgno;.    int 
31d60 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f  minI = i;.    fo
31d70 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b  r(j=i+1; j<k; j+
31d80 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70  +){.      if( ap
31d90 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75 6e  New[j]->pgno<(un
31da0 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20  signed)minV ){. 
31db0 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b         minI = j;
31dc0 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20  .        minV = 
31dd0 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a  apNew[j]->pgno;.
31de0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
31df0 20 20 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a    if( minI>i ){.
31e00 20 20 20 20 20 20 69 6e 74 20 74 3b 0a 20 20 20        int t;.   
31e10 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a     MemPage *pT;.
31e20 20 20 20 20 20 20 74 20 3d 20 61 70 4e 65 77 5b        t = apNew[
31e30 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20  i]->pgno;.      
31e40 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20  pT = apNew[i];. 
31e50 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20       apNew[i] = 
31e60 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20  apNew[minI];.   
31e70 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d     apNew[minI] =
31e80 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   pT;.    }.  }. 
31e90 20 54 52 41 43 45 28 28 22 6e 65 77 3a 20 25 64   TRACE(("new: %d
31ea0 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
31eb0 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
31ec0 5c 6e 22 2c 0a 20 20 20 20 61 70 4e 65 77 5b 30  \n",.    apNew[0
31ed0 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30  ]->pgno, szNew[0
31ee0 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f  ],.    nNew>=2 ?
31ef0 20 61 70 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20   apNew[1]->pgno 
31f00 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73  : 0, nNew>=2 ? s
31f10 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20  zNew[1] : 0,.   
31f20 20 6e 4e 65 77 3e 3d 33 20 3f 20 61 70 4e 65 77   nNew>=3 ? apNew
31f30 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e  [2]->pgno : 0, n
31f40 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32  New>=3 ? szNew[2
31f50 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
31f60 3d 34 20 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e 70  =4 ? apNew[3]->p
31f70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34  gno : 0, nNew>=4
31f80 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c   ? szNew[3] : 0,
31f90 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 61  .    nNew>=5 ? a
31fa0 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20  pNew[4]->pgno : 
31fb0 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e  0, nNew>=5 ? szN
31fc0 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20  ew[4] : 0));..  
31fd0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
31fe0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
31ff0 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
32000 29 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  ) );.  put4byte(
32010 70 52 69 67 68 74 2c 20 61 70 4e 65 77 5b 6e 4e  pRight, apNew[nN
32020 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20  ew-1]->pgno);.. 
32030 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20   /*.  ** Evenly 
32040 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20 64  distribute the d
32050 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  ata in apCell[] 
32060 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70  across the new p
32070 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72  ages..  ** Inser
32080 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  t divider cells 
32090 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20  into pParent as 
320a0 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
320b0 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69    j = 0;.  for(i
320c0 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29  =0; i<nNew; i++)
320d0 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c  {.    /* Assembl
320e0 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e  e the new siblin
320f0 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d  g page. */.    M
32100 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61  emPage *pNew = a
32110 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73  pNew[i];.    ass
32120 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73  ert( j<nMaxCells
32130 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65   );.    zeroPage
32140 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73  (pNew, pageFlags
32150 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50  );.    assembleP
32160 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77  age(pNew, cntNew
32170 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a  [i]-j, &apCell[j
32180 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a  ], &szCell[j]);.
32190 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
321a0 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e  ->nCell>0 || (nN
321b0 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b  ew==1 && cntNew[
321c0 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73  0]==0) );.    as
321d0 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65  sert( pNew->nOve
321e0 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20  rflow==0 );..   
321f0 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a   j = cntNew[i];.
32200 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
32210 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65  ibling page asse
32220 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20  mbled above was 
32230 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  not the right-mo
32240 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20  st sibling,.    
32250 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76 69  ** insert a divi
32260 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68  der cell into th
32270 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20  e parent page.. 
32280 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
32290 28 20 69 3c 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d  ( i<nNew-1 || j=
322a0 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66  =nCell );.    if
322b0 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ( j<nCell ){.   
322c0 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20     u8 *pCell;.  
322d0 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
322e0 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20       int sz;..  
322f0 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d      assert( j<nM
32300 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
32310 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b   pCell = apCell[
32320 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73  j];.      sz = s
32330 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43  zCell[j] + leafC
32340 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
32350 20 70 54 65 6d 70 20 3d 20 26 61 4f 76 66 6c 53   pTemp = &aOvflS
32360 70 61 63 65 5b 69 4f 76 66 6c 53 70 61 63 65 5d  pace[iOvflSpace]
32370 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65  ;.      if( !pNe
32380 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  w->leaf ){.     
32390 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d     memcpy(&pNew-
323a0 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c  >aData[8], pCell
323b0 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 4);.      }els
323c0 65 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29  e if( leafData )
323d0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
323e0 74 68 65 20 74 72 65 65 20 69 73 20 61 20 6c 65  the tree is a le
323f0 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e  af-data tree, an
32400 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  d the siblings a
32410 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20  re leaves, .    
32420 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
32430 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20  e is no divider 
32440 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  cell in apCell[]
32450 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64  . Instead, the d
32460 69 76 69 64 65 72 20 0a 20 20 20 20 20 20 20 20  ivider .        
32470 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73  ** cell consists
32480 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
32490 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69 67 68  key for the righ
324a0 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a  t-most cell of .
324b0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73          ** the s
324c0 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65  ibling-page asse
324d0 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79  mbled above only
324e0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
324f0 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
32500 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b  fo;.        j--;
32510 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61  .        btreePa
32520 72 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c  rseCellPtr(pNew,
32530 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66   apCell[j], &inf
32540 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  o);.        pCel
32550 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 20  l = pTemp;.     
32560 20 20 20 73 7a 20 3d 20 34 20 2b 20 70 75 74 56     sz = 4 + putV
32570 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c  arint(&pCell[4],
32580 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20 20   info.nKey);.   
32590 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a       pTemp = 0;.
325a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
325b0 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b       pCell -= 4;
325c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73 63  .        /* Obsc
325d0 75 72 65 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e  ure case for non
325e0 2d 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 73  -leaf-data trees
325f0 3a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 61 74  : If the cell at
32600 20 70 43 65 6c 6c 20 77 61 73 0a 20 20 20 20 20   pCell was.     
32610 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79     ** previously
32620 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61   stored on a lea
32630 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73 20  f node, and its 
32640 72 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77 61  reported size wa
32650 73 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  s 4.        ** b
32660 79 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d 61  ytes, then it ma
32670 79 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 6d  y actually be sm
32680 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20  aller than this 
32690 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65 65  .        ** (see
326a0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
326b0 74 72 28 29 2c 20 34 20 62 79 74 65 73 20 69 73  tr(), 4 bytes is
326c0 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a   the minimum siz
326d0 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  e of.        ** 
326e0 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69  any cell). But i
326f0 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
32700 6f 20 70 61 73 73 20 74 68 65 20 63 6f 72 72 65  o pass the corre
32710 63 74 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20  ct size to .    
32720 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c      ** insertCel
32730 6c 28 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20  l(), so reparse 
32740 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20  the cell now..  
32750 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
32760 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
32770 69 73 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70  is can never hap
32780 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65  pen in an SQLite
32790 20 64 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61   data file, as a
327a0 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65  ll.        ** ce
327b0 6c 6c 73 20 61 72 65 20 61 74 20 6c 65 61 73 74  lls are at least
327c0 20 34 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c   4 bytes. It onl
327d0 79 20 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74  y happens in b-t
327e0 72 65 65 73 20 75 73 65 64 0a 20 20 20 20 20 20  rees used.      
327f0 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65    ** to evaluate
32800 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e   "IN (SELECT ...
32810 29 22 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63  )" and similar c
32820 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20  lauses..        
32830 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  */.        if( s
32840 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20  zCell[j]==4 ){. 
32850 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
32860 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
32870 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  4);.          sz
32880 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
32890 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a  Parent, pCell);.
328a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
328b0 7d 0a 20 20 20 20 20 20 69 4f 76 66 6c 53 70 61  }.      iOvflSpa
328c0 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ce += sz;.      
328d0 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d  assert( sz<=pBt-
328e0 3e 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20  >pageSize/4 );. 
328f0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4f 76       assert( iOv
32900 66 6c 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61  flSpace<=pBt->pa
32910 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
32920 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65  insertCell(pPare
32930 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c  nt, nxDiv, pCell
32940 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 70 4e 65  , sz, pTemp, pNe
32950 77 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  w->pgno, &rc);. 
32960 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
32970 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61  ITE_OK ) goto ba
32980 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
32990 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
329a0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
329b0 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  able(pParent->pD
329c0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
329d0 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69   j++;.      nxDi
329e0 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  v++;.    }.  }. 
329f0 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c   assert( j==nCel
32a00 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  l );.  assert( n
32a10 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Old>0 );.  asser
32a20 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69  t( nNew>0 );.  i
32a30 66 28 20 28 70 61 67 65 46 6c 61 67 73 20 26 20  f( (pageFlags & 
32a40 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a  PTF_LEAF)==0 ){.
32a50 20 20 20 20 75 38 20 2a 7a 43 68 69 6c 64 20 3d      u8 *zChild =
32a60 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d   &apCopy[nOld-1]
32a70 2d 3e 61 44 61 74 61 5b 38 5d 3b 0a 20 20 20 20  ->aData[8];.    
32a80 6d 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e  memcpy(&apNew[nN
32a90 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c  ew-1]->aData[8],
32aa0 20 7a 43 68 69 6c 64 2c 20 34 29 3b 0a 20 20 7d   zChild, 4);.  }
32ab0 0a 0a 20 20 69 66 28 20 69 73 52 6f 6f 74 20 26  ..  if( isRoot &
32ac0 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  & pParent->nCell
32ad0 3d 3d 30 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  ==0 && pParent->
32ae0 68 64 72 4f 66 66 73 65 74 3c 3d 61 70 4e 65 77  hdrOffset<=apNew
32af0 5b 30 5d 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  [0]->nFree ){.  
32b00 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61    /* The root pa
32b10 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
32b20 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 6e 6f   now contains no
32b30 20 63 65 6c 6c 73 2e 20 54 68 65 20 6f 6e 6c 79   cells. The only
32b40 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20   sibling.    ** 
32b50 70 61 67 65 20 69 73 20 74 68 65 20 72 69 67 68  page is the righ
32b60 74 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70  t-child of the p
32b70 61 72 65 6e 74 2e 20 43 6f 70 79 20 74 68 65 20  arent. Copy the 
32b80 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
32b90 20 20 20 20 2a 2a 20 63 68 69 6c 64 20 70 61 67      ** child pag
32ba0 65 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  e into the paren
32bb0 74 2c 20 64 65 63 72 65 61 73 69 6e 67 20 74 68  t, decreasing th
32bc0 65 20 6f 76 65 72 61 6c 6c 20 68 65 69 67 68 74  e overall height
32bd0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 62   of the.    ** b
32be0 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
32bf0 62 79 20 6f 6e 65 2e 20 54 68 69 73 20 69 73 20  by one. This is 
32c00 64 65 73 63 72 69 62 65 64 20 61 73 20 74 68 65  described as the
32c10 20 22 62 61 6c 61 6e 63 65 2d 73 68 61 6c 6c 6f   "balance-shallo
32c20 77 65 72 22 0a 20 20 20 20 2a 2a 20 73 75 62 2d  wer".    ** sub-
32c30 61 6c 67 6f 72 69 74 68 6d 20 69 6e 20 73 6f 6d  algorithm in som
32c40 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e  e documentation.
32c50 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
32c60 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
32c70 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
32c80 65 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63  e, the call to c
32c90 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 29  opyNodeContent()
32ca0 20 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 61 6c   .    ** sets al
32cb0 6c 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  l pointer-map en
32cc0 74 72 69 65 73 20 63 6f 72 72 65 73 70 6f 6e 64  tries correspond
32cd0 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20  ing to database 
32ce0 69 6d 61 67 65 20 70 61 67 65 73 20 0a 20 20 20  image pages .   
32cf0 20 2a 2a 20 66 6f 72 20 77 68 69 63 68 20 74 68   ** for which th
32d00 65 20 70 6f 69 6e 74 65 72 20 69 73 20 73 74 6f  e pointer is sto
32d10 72 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63  red within the c
32d20 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 63 6f 70  ontent being cop
32d30 69 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ied..    **.    
32d40 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 73  ** The second as
32d50 73 65 72 74 20 62 65 6c 6f 77 20 76 65 72 69 66  sert below verif
32d60 69 65 73 20 74 68 61 74 20 74 68 65 20 63 68 69  ies that the chi
32d70 6c 64 20 70 61 67 65 20 69 73 20 64 65 66 72 61  ld page is defra
32d80 67 6d 65 6e 74 65 64 0a 20 20 20 20 2a 2a 20 28  gmented.    ** (
32d90 69 74 20 6d 75 73 74 20 62 65 2c 20 61 73 20 69  it must be, as i
32da0 74 20 77 61 73 20 6a 75 73 74 20 72 65 63 6f 6e  t was just recon
32db0 73 74 72 75 63 74 65 64 20 75 73 69 6e 67 20 61  structed using a
32dc0 73 73 65 6d 62 6c 65 50 61 67 65 28 29 29 2e 20  ssemblePage()). 
32dd0 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 69  This.    ** is i
32de0 6d 70 6f 72 74 61 6e 74 20 69 66 20 74 68 65 20  mportant if the 
32df0 70 61 72 65 6e 74 20 70 61 67 65 20 68 61 70 70  parent page happ
32e00 65 6e 73 20 74 6f 20 62 65 20 70 61 67 65 20 31  ens to be page 1
32e10 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
32e20 0a 20 20 20 20 2a 2a 20 69 6d 61 67 65 2e 20 20  .    ** image.  
32e30 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  */.    assert( n
32e40 4e 65 77 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73  New==1 );.    as
32e50 73 65 72 74 28 20 61 70 4e 65 77 5b 30 5d 2d 3e  sert( apNew[0]->
32e60 6e 46 72 65 65 20 3d 3d 20 0a 20 20 20 20 20 20  nFree == .      
32e70 20 20 28 67 65 74 32 62 79 74 65 28 26 61 70 4e    (get2byte(&apN
32e80 65 77 5b 30 5d 2d 3e 61 44 61 74 61 5b 35 5d 29  ew[0]->aData[5])
32e90 2d 61 70 4e 65 77 5b 30 5d 2d 3e 63 65 6c 6c 4f  -apNew[0]->cellO
32ea0 66 66 73 65 74 2d 61 70 4e 65 77 5b 30 5d 2d 3e  ffset-apNew[0]->
32eb0 6e 43 65 6c 6c 2a 32 29 20 0a 20 20 20 20 29 3b  nCell*2) .    );
32ec0 0a 20 20 20 20 63 6f 70 79 4e 6f 64 65 43 6f 6e  .    copyNodeCon
32ed0 74 65 6e 74 28 61 70 4e 65 77 5b 30 5d 2c 20 70  tent(apNew[0], p
32ee0 50 61 72 65 6e 74 2c 20 26 72 63 29 3b 0a 20 20  Parent, &rc);.  
32ef0 20 20 66 72 65 65 50 61 67 65 28 61 70 4e 65 77    freePage(apNew
32f00 5b 30 5d 2c 20 26 72 63 29 3b 0a 20 20 7d 65 6c  [0], &rc);.  }el
32f10 73 65 20 69 66 28 20 49 53 41 55 54 4f 56 41 43  se if( ISAUTOVAC
32f20 55 55 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69  UUM ){.    /* Fi
32f30 78 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  x the pointer-ma
32f40 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
32f50 6c 20 74 68 65 20 63 65 6c 6c 73 20 74 68 61 74  l the cells that
32f60 20 77 65 72 65 20 73 68 69 66 74 65 64 20 61 72   were shifted ar
32f70 6f 75 6e 64 2e 20 0a 20 20 20 20 2a 2a 20 54 68  ound. .    ** Th
32f80 65 72 65 20 61 72 65 20 73 65 76 65 72 61 6c 20  ere are several 
32f90 64 69 66 66 65 72 65 6e 74 20 74 79 70 65 73 20  different types 
32fa0 6f 66 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  of pointer-map e
32fb0 6e 74 72 69 65 73 20 74 68 61 74 20 6e 65 65 64  ntries that need
32fc0 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 64 65   to.    ** be de
32fd0 61 6c 74 20 77 69 74 68 20 62 79 20 74 68 69 73  alt with by this
32fe0 20 72 6f 75 74 69 6e 65 2e 20 53 6f 6d 65 20 6f   routine. Some o
32ff0 66 20 74 68 65 73 65 20 68 61 76 65 20 62 65 65  f these have bee
33000 6e 20 73 65 74 20 61 6c 72 65 61 64 79 2c 20 62  n set already, b
33010 75 74 0a 20 20 20 20 2a 2a 20 6d 61 6e 79 20 68  ut.    ** many h
33020 61 76 65 20 6e 6f 74 2e 20 54 68 65 20 66 6f 6c  ave not. The fol
33030 6c 6f 77 69 6e 67 20 69 73 20 61 20 73 75 6d 6d  lowing is a summ
33040 61 72 79 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ary:.    **.    
33050 2a 2a 20 20 20 31 29 20 54 68 65 20 65 6e 74 72  **   1) The entr
33060 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ies associated w
33070 69 74 68 20 6e 65 77 20 73 69 62 6c 69 6e 67 20  ith new sibling 
33080 70 61 67 65 73 20 74 68 61 74 20 77 65 72 65 20  pages that were 
33090 6e 6f 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  not.    **      
330a0 73 69 62 6c 69 6e 67 73 20 77 68 65 6e 20 74 68  siblings when th
330b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  is function was 
330c0 63 61 6c 6c 65 64 2e 20 54 68 65 73 65 20 68 61  called. These ha
330d0 76 65 20 61 6c 72 65 61 64 79 0a 20 20 20 20 2a  ve already.    *
330e0 2a 20 20 20 20 20 20 62 65 65 6e 20 73 65 74 2e  *      been set.
330f0 20 57 65 20 64 6f 6e 27 74 20 6e 65 65 64 20 74   We don't need t
33100 6f 20 77 6f 72 72 79 20 61 62 6f 75 74 20 6f 6c  o worry about ol
33110 64 20 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20  d siblings that 
33120 77 65 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  were.    **     
33130 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72   moved to the fr
33140 65 65 2d 6c 69 73 74 20 2d 20 74 68 65 20 66 72  ee-list - the fr
33150 65 65 50 61 67 65 28 29 20 63 6f 64 65 20 68 61  eePage() code ha
33160 73 20 74 61 6b 65 6e 20 63 61 72 65 0a 20 20 20  s taken care.   
33170 20 2a 2a 20 20 20 20 20 20 6f 66 20 74 68 6f 73   **      of thos
33180 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
33190 20 20 20 32 29 20 54 68 65 20 70 6f 69 6e 74 65     2) The pointe
331a0 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 61 73  r-map entries as
331b0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
331c0 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
331d0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 70 61 67  .    **      pag
331e0 65 20 69 6e 20 61 6e 79 20 6f 76 65 72 66 6c 6f  e in any overflo
331f0 77 20 63 68 61 69 6e 73 20 75 73 65 64 20 62 79  w chains used by
33200 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
33210 6c 73 2e 20 54 68 65 73 65 20 0a 20 20 20 20 2a  ls. These .    *
33220 2a 20 20 20 20 20 20 68 61 76 65 20 61 6c 73 6f  *      have also
33230 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 74 61   already been ta
33240 6b 65 6e 20 63 61 72 65 20 6f 66 20 62 79 20 74  ken care of by t
33250 68 65 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 20  he insertCell() 
33260 63 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  code..    **.   
33270 20 2a 2a 20 20 20 33 29 20 49 66 20 74 68 65 20   **   3) If the 
33280 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72  sibling pages ar
33290 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68  e not leaves, th
332a0 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  en the child pag
332b0 65 73 20 6f 66 0a 20 20 20 20 2a 2a 20 20 20 20  es of.    **    
332c0 20 20 63 65 6c 6c 73 20 73 74 6f 72 65 64 20 6f    cells stored o
332d0 6e 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  n the sibling pa
332e0 67 65 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20  ges may need to 
332f0 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20  be updated..    
33300 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 34 29 20 49  **.    **   4) I
33310 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
33320 67 65 73 20 61 72 65 20 6e 6f 74 20 69 6e 74 65  ges are not inte
33330 72 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65  rnal intkey node
33340 73 2c 20 74 68 65 6e 20 61 6e 79 0a 20 20 20 20  s, then any.    
33350 2a 2a 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77  **      overflow
33360 20 70 61 67 65 73 20 75 73 65 64 20 62 79 20 74   pages used by t
33370 68 65 73 65 20 63 65 6c 6c 73 20 6d 61 79 20 6e  hese cells may n
33380 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74 65  eed to be update
33390 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 28 69  d.    **      (i
333a0 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20 6e  nternal intkey n
333b0 6f 64 65 73 20 6e 65 76 65 72 20 63 6f 6e 74 61  odes never conta
333c0 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6f  in pointers to o
333d0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a  verflow pages)..
333e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
333f0 35 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  5) If the siblin
33400 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20  g pages are not 
33410 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65  leaves, then the
33420 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
33430 20 2a 2a 20 20 20 20 20 20 65 6e 74 72 69 65 73   **      entries
33440 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 63   for the right-c
33450 68 69 6c 64 20 70 61 67 65 73 20 6f 66 20 65 61  hild pages of ea
33460 63 68 20 73 69 62 6c 69 6e 67 20 6d 61 79 20 6e  ch sibling may n
33470 65 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  eed.    **      
33480 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20  to be updated.. 
33490 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 61 73     **.    ** Cas
334a0 65 73 20 31 20 61 6e 64 20 32 20 61 72 65 20 64  es 1 and 2 are d
334b0 65 61 6c 74 20 77 69 74 68 20 61 62 6f 76 65 20  ealt with above 
334c0 62 79 20 6f 74 68 65 72 20 63 6f 64 65 2e 20 54  by other code. T
334d0 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62  he next.    ** b
334e0 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20  lock deals with 
334f0 63 61 73 65 73 20 33 20 61 6e 64 20 34 20 61 6e  cases 3 and 4 an
33500 64 20 74 68 65 20 6f 6e 65 20 61 66 74 65 72 20  d the one after 
33510 74 68 61 74 2c 20 63 61 73 65 20 35 2e 20 53 69  that, case 5. Si
33520 6e 63 65 0a 20 20 20 20 2a 2a 20 73 65 74 74 69  nce.    ** setti
33530 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70  ng a pointer map
33540 20 65 6e 74 72 79 20 69 73 20 61 20 72 65 6c 61   entry is a rela
33550 74 69 76 65 6c 79 20 65 78 70 65 6e 73 69 76 65  tively expensive
33560 20 6f 70 65 72 61 74 69 6f 6e 2c 20 74 68 69 73   operation, this
33570 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 6f 6e 6c  .    ** code onl
33580 79 20 73 65 74 73 20 70 6f 69 6e 74 65 72 20 6d  y sets pointer m
33590 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 63  ap entries for c
335a0 68 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f 77  hild or overflow
335b0 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
335c0 0a 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79  .    ** actually
335d0 20 6d 6f 76 65 64 20 62 65 74 77 65 65 6e 20 70   moved between p
335e0 61 67 65 73 2e 20 20 2a 2f 0a 20 20 20 20 4d 65  ages.  */.    Me
335f0 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70  mPage *pNew = ap
33600 4e 65 77 5b 30 5d 3b 0a 20 20 20 20 4d 65 6d 50  New[0];.    MemP
33610 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f  age *pOld = apCo
33620 70 79 5b 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e  py[0];.    int n
33630 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d  Overflow = pOld-
33640 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  >nOverflow;.    
33650 69 6e 74 20 69 4e 65 78 74 4f 6c 64 20 3d 20 70  int iNextOld = p
33660 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 6e 4f 76  Old->nCell + nOv
33670 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20  erflow;.    int 
33680 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 6e 4f 76  iOverflow = (nOv
33690 65 72 66 6c 6f 77 20 3f 20 70 4f 6c 64 2d 3e 61  erflow ? pOld->a
336a0 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 3a 20 2d 31  Ovfl[0].idx : -1
336b0 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 20 20 20  );.    j = 0;   
336c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
336d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
336e0 72 65 6e 74 20 27 6f 6c 64 27 20 73 69 62 6c 69  rent 'old' sibli
336f0 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 6b  ng page */.    k
33700 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
33710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33720 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6e 65    /* Current 'ne
33730 77 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  w' sibling page 
33740 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
33750 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
33760 20 20 20 20 20 69 6e 74 20 69 73 44 69 76 69 64       int isDivid
33770 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68  er = 0;.      wh
33780 69 6c 65 28 20 69 3d 3d 69 4e 65 78 74 4f 6c 64  ile( i==iNextOld
33790 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
337a0 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65 6c  ell i is the cel
337b0 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  l immediately fo
337c0 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74  llowing the last
337d0 20 63 65 6c 6c 20 6f 6e 20 6f 6c 64 0a 20 20 20   cell on old.   
337e0 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20       ** sibling 
337f0 70 61 67 65 20 6a 2e 20 49 66 20 74 68 65 20 73  page j. If the s
33800 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20  iblings are not 
33810 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20 61 6e  leaf pages of an
33820 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b  .        ** intk
33830 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20  ey b-tree, then 
33840 63 65 6c 6c 20 69 20 77 61 73 20 61 20 64 69 76  cell i was a div
33850 69 64 65 72 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20  ider cell. */.  
33860 20 20 20 20 20 20 70 4f 6c 64 20 3d 20 61 70 43        pOld = apC
33870 6f 70 79 5b 2b 2b 6a 5d 3b 0a 20 20 20 20 20 20  opy[++j];.      
33880 20 20 69 4e 65 78 74 4f 6c 64 20 3d 20 69 20 2b    iNextOld = i +
33890 20 21 6c 65 61 66 44 61 74 61 20 2b 20 70 4f 6c   !leafData + pOl
338a0 64 2d 3e 6e 43 65 6c 6c 20 2b 20 70 4f 6c 64 2d  d->nCell + pOld-
338b0 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  >nOverflow;.    
338c0 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f      if( pOld->nO
338d0 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
338e0 20 20 20 20 20 6e 4f 76 65 72 66 6c 6f 77 20 3d       nOverflow =
338f0 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pOld->nOverflow
33900 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 76 65  ;.          iOve
33910 72 66 6c 6f 77 20 3d 20 69 20 2b 20 21 6c 65 61  rflow = i + !lea
33920 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 61 4f  fData + pOld->aO
33930 76 66 6c 5b 30 5d 2e 69 64 78 3b 0a 20 20 20 20  vfl[0].idx;.    
33940 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 73      }.        is
33950 44 69 76 69 64 65 72 20 3d 20 21 6c 65 61 66 44  Divider = !leafD
33960 61 74 61 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a  ata;  .      }..
33970 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76        assert(nOv
33980 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 69 4f 76 65  erflow>0 || iOve
33990 72 66 6c 6f 77 3c 69 20 29 3b 0a 20 20 20 20 20  rflow<i );.     
339a0 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f   assert(nOverflo
339b0 77 3c 32 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76  w<2 || pOld->aOv
339c0 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d  fl[0].idx==pOld-
339d0 3e 61 4f 76 66 6c 5b 31 5d 2e 69 64 78 2d 31 29  >aOvfl[1].idx-1)
339e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  ;.      assert(n
339f0 4f 76 65 72 66 6c 6f 77 3c 33 20 7c 7c 20 70 4f  Overflow<3 || pO
33a00 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69 64 78  ld->aOvfl[1].idx
33a10 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 32 5d  ==pOld->aOvfl[2]
33a20 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20 20 20 69  .idx-1);.      i
33a30 66 28 20 69 3d 3d 69 4f 76 65 72 66 6c 6f 77 20  f( i==iOverflow 
33a40 29 7b 0a 20 20 20 20 20 20 20 20 69 73 44 69 76  ){.        isDiv
33a50 69 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20  ider = 1;.      
33a60 20 20 69 66 28 20 28 2d 2d 6e 4f 76 65 72 66 6c    if( (--nOverfl
33a70 6f 77 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ow)>0 ){.       
33a80 20 20 20 69 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a     iOverflow++;.
33a90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33aa0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  }..      if( i==
33ab0 63 6e 74 4e 65 77 5b 6b 5d 20 29 7b 0a 20 20 20  cntNew[k] ){.   
33ac0 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69       /* Cell i i
33ad0 73 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64  s the cell immed
33ae0 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
33af0 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f   the last cell o
33b00 6e 20 6e 65 77 0a 20 20 20 20 20 20 20 20 2a 2a  n new.        **
33b10 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6b 2e   sibling page k.
33b20 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73   If the siblings
33b30 20 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61   are not leaf pa
33b40 67 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20  ges of an.      
33b50 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72    ** intkey b-tr
33b60 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20  ee, then cell i 
33b70 69 73 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  is a divider cel
33b80 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  l.  */.        p
33b90 4e 65 77 20 3d 20 61 70 4e 65 77 5b 2b 2b 6b 5d  New = apNew[++k]
33ba0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6c  ;.        if( !l
33bb0 65 61 66 44 61 74 61 20 29 20 63 6f 6e 74 69 6e  eafData ) contin
33bc0 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
33bd0 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4f 6c 64    assert( j<nOld
33be0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
33bf0 28 20 6b 3c 6e 4e 65 77 20 29 3b 0a 0a 20 20 20  ( k<nNew );..   
33c00 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c     /* If the cel
33c10 6c 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79  l was originally
33c20 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 28 61   divider cell (a
33c30 6e 64 20 69 73 20 6e 6f 74 20 6e 6f 77 29 20 6f  nd is not now) o
33c40 72 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 6f 76  r.      ** an ov
33c50 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20 6f 72 20  erflow cell, or 
33c60 69 66 20 74 68 65 20 63 65 6c 6c 20 77 61 73 20  if the cell was 
33c70 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 64 69 66  located on a dif
33c80 66 65 72 65 6e 74 20 73 69 62 6c 69 6e 67 0a 20  ferent sibling. 
33c90 20 20 20 20 20 2a 2a 20 70 61 67 65 20 62 65 66       ** page bef
33ca0 6f 72 65 20 74 68 65 20 62 61 6c 61 6e 63 69 6e  ore the balancin
33cb0 67 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69 6e  g, then the poin
33cc0 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20  ter map entries 
33cd0 61 73 73 6f 63 69 61 74 65 64 0a 20 20 20 20 20  associated.     
33ce0 20 2a 2a 20 77 69 74 68 20 61 6e 79 20 63 68 69   ** with any chi
33cf0 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  ld or overflow p
33d00 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
33d10 75 70 64 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20  updated.  */.   
33d20 20 20 20 69 66 28 20 69 73 44 69 76 69 64 65 72     if( isDivider
33d30 20 7c 7c 20 70 4f 6c 64 2d 3e 70 67 6e 6f 21 3d   || pOld->pgno!=
33d40 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  pNew->pgno ){.  
33d50 20 20 20 20 20 20 69 66 28 20 21 6c 65 61 66 43        if( !leafC
33d60 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20  orrection ){.   
33d70 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
33d80 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 61  (pBt, get4byte(a
33d90 70 43 65 6c 6c 5b 69 5d 29 2c 20 50 54 52 4d 41  pCell[i]), PTRMA
33da0 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70  P_BTREE, pNew->p
33db0 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  gno, &rc);.     
33dc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
33dd0 20 73 7a 43 65 6c 6c 5b 69 5d 3e 70 4e 65 77 2d   szCell[i]>pNew-
33de0 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >minLocal ){.   
33df0 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
33e00 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 61 70  OvflPtr(pNew, ap
33e10 43 65 6c 6c 5b 69 5d 2c 20 26 72 63 29 3b 0a 20  Cell[i], &rc);. 
33e20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
33e30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
33e40 21 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20  !leafCorrection 
33e50 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
33e60 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a  ; i<nNew; i++){.
33e70 20 20 20 20 20 20 20 20 75 33 32 20 6b 65 79 20          u32 key 
33e80 3d 20 67 65 74 34 62 79 74 65 28 26 61 70 4e 65  = get4byte(&apNe
33e90 77 5b 69 5d 2d 3e 61 44 61 74 61 5b 38 5d 29 3b  w[i]->aData[8]);
33ea0 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50  .        ptrmapP
33eb0 75 74 28 70 42 74 2c 20 6b 65 79 2c 20 50 54 52  ut(pBt, key, PTR
33ec0 4d 41 50 5f 42 54 52 45 45 2c 20 61 70 4e 65 77  MAP_BTREE, apNew
33ed0 5b 69 5d 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b  [i]->pgno, &rc);
33ee0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
33ef0 23 69 66 20 30 0a 20 20 20 20 2f 2a 20 54 68 65  #if 0.    /* The
33f00 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65   ptrmapCheckPage
33f10 73 28 29 20 63 6f 6e 74 61 69 6e 73 20 61 73 73  s() contains ass
33f20 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
33f30 20 74 68 61 74 20 76 65 72 69 66 79 20 74 68 61   that verify tha
33f40 74 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 70 6f 69  t.    ** all poi
33f50 6e 74 65 72 20 6d 61 70 20 70 61 67 65 73 20 61  nter map pages a
33f60 72 65 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  re set correctly
33f70 2e 20 54 68 69 73 20 69 73 20 68 65 6c 70 66 75  . This is helpfu
33f80 6c 20 77 68 69 6c 65 20 0a 20 20 20 20 2a 2a 20  l while .    ** 
33f90 64 65 62 75 67 67 69 6e 67 2e 20 54 68 69 73 20  debugging. This 
33fa0 69 73 20 75 73 75 61 6c 6c 79 20 64 69 73 61 62  is usually disab
33fb0 6c 65 64 20 62 65 63 61 75 73 65 20 61 20 63 6f  led because a co
33fc0 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 6d  rrupt database m
33fd0 61 79 0a 20 20 20 20 2a 2a 20 63 61 75 73 65 20  ay.    ** cause 
33fe0 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
33ff0 65 6d 65 6e 74 20 74 6f 20 66 61 69 6c 2e 20 20  ement to fail.  
34000 2a 2f 0a 20 20 20 20 70 74 72 6d 61 70 43 68 65  */.    ptrmapChe
34010 63 6b 50 61 67 65 73 28 61 70 4e 65 77 2c 20 6e  ckPages(apNew, n
34020 4e 65 77 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  New);.    ptrmap
34030 43 68 65 63 6b 50 61 67 65 73 28 26 70 50 61 72  CheckPages(&pPar
34040 65 6e 74 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a  ent, 1);.#endif.
34050 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
34060 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29  Parent->isInit )
34070 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  ;.  TRACE(("BALA
34080 4e 43 45 3a 20 66 69 6e 69 73 68 65 64 3a 20 6f  NCE: finished: o
34090 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c  ld=%d new=%d cel
340a0 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ls=%d\n",.      
340b0 20 20 20 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20      nOld, nNew, 
340c0 6e 43 65 6c 6c 29 29 3b 0a 0a 20 20 2f 2a 0a 20  nCell));..  /*. 
340d0 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65 66 6f   ** Cleanup befo
340e0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20  re returning..  
340f0 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  */.balance_clean
34100 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 53 63 72  up:.  sqlite3Scr
34110 61 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29  atchFree(apCell)
34120 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
34130 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  Old; i++){.    r
34140 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64  eleasePage(apOld
34150 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  [i]);.  }.  for(
34160 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
34170 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
34180 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20  ge(apNew[i]);.  
34190 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
341a0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
341b0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
341c0 64 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 20  d when the root 
341d0 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65  page of a b-tree
341e0 20 73 74 72 75 63 74 75 72 65 20 69 73 0a 2a 2a   structure is.**
341f0 20 6f 76 65 72 66 75 6c 6c 20 28 68 61 73 20 6f   overfull (has o
34200 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
34210 6c 6f 77 20 70 61 67 65 73 29 2e 0a 2a 2a 0a 2a  low pages)..**.*
34220 2a 20 41 20 6e 65 77 20 63 68 69 6c 64 20 70 61  * A new child pa
34230 67 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ge is allocated 
34240 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  and the contents
34250 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
34260 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 2c 20 69 6e  root.** page, in
34270 63 6c 75 64 69 6e 67 20 6f 76 65 72 66 6c 6f 77  cluding overflow
34280 20 63 65 6c 6c 73 2c 20 61 72 65 20 63 6f 70 69   cells, are copi
34290 65 64 20 69 6e 74 6f 20 74 68 65 20 63 68 69 6c  ed into the chil
342a0 64 2e 20 54 68 65 20 72 6f 6f 74 0a 2a 2a 20 70  d. The root.** p
342b0 61 67 65 20 69 73 20 74 68 65 6e 20 6f 76 65 72  age is then over
342c0 77 72 69 74 74 65 6e 20 74 6f 20 6d 61 6b 65 20  written to make 
342d0 69 74 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65  it an empty page
342e0 20 77 69 74 68 20 74 68 65 20 72 69 67 68 74 2d   with the right-
342f0 63 68 69 6c 64 20 0a 2a 2a 20 70 6f 69 6e 74 65  child .** pointe
34300 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  r pointing to th
34310 65 20 6e 65 77 20 70 61 67 65 2e 0a 2a 2a 0a 2a  e new page..**.*
34320 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * Before returni
34330 6e 67 2c 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d  ng, all pointer-
34340 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f 72 72  map entries corr
34350 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67  esponding to pag
34360 65 73 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  es .** that the 
34370 6e 65 77 20 63 68 69 6c 64 2d 70 61 67 65 20 6e  new child-page n
34380 6f 77 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e  ow contains poin
34390 74 65 72 73 20 74 6f 20 61 72 65 20 75 70 64 61  ters to are upda
343a0 74 65 64 2e 20 54 68 65 0a 2a 2a 20 65 6e 74 72  ted. The.** entr
343b0 79 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  y corresponding 
343c0 74 6f 20 74 68 65 20 6e 65 77 20 72 69 67 68 74  to the new right
343d0 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f  -child pointer o
343e0 66 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  f the root.** pa
343f0 67 65 20 69 73 20 61 6c 73 6f 20 75 70 64 61 74  ge is also updat
34400 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  ed..**.** If suc
34410 63 65 73 73 66 75 6c 2c 20 2a 70 70 43 68 69 6c  cessful, *ppChil
34420 64 20 69 73 20 73 65 74 20 74 6f 20 63 6f 6e 74  d is set to cont
34430 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20  ain a reference 
34440 74 6f 20 74 68 65 20 63 68 69 6c 64 20 0a 2a 2a  to the child .**
34450 20 70 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45   page and SQLITE
34460 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
34470 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
34480 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 71 75  e caller is requ
34490 69 72 65 64 0a 2a 2a 20 74 6f 20 63 61 6c 6c 20  ired.** to call 
344a0 72 65 6c 65 61 73 65 50 61 67 65 28 29 20 6f 6e  releasePage() on
344b0 20 2a 70 70 43 68 69 6c 64 20 65 78 61 63 74 6c   *ppChild exactl
344c0 79 20 6f 6e 63 65 2e 20 49 66 20 61 6e 20 65 72  y once. If an er
344d0 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 61  ror occurs,.** a
344e0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
344f0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
34500 43 68 69 6c 64 20 69 73 20 73 65 74 20 74 6f 20  Child is set to 
34510 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
34520 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
34530 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 2c 20  MemPage *pRoot, 
34540 4d 65 6d 50 61 67 65 20 2a 2a 70 70 43 68 69 6c  MemPage **ppChil
34550 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  d){.  int rc;   
34560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34570 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
34580 61 6c 75 65 20 66 72 6f 6d 20 73 75 62 70 72 6f  alue from subpro
34590 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d  cedures */.  Mem
345a0 50 61 67 65 20 2a 70 43 68 69 6c 64 20 3d 20 30  Page *pChild = 0
345b0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
345c0 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20  ointer to a new 
345d0 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20  child page */.  
345e0 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d  Pgno pgnoChild =
345f0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
34600 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
34610 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70   the new child p
34620 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  age */.  BtShare
34630 64 20 2a 70 42 74 20 3d 20 70 52 6f 6f 74 2d 3e  d *pBt = pRoot->
34640 70 42 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 42  pBt;    /* The B
34650 54 72 65 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  Tree */..  asser
34660 74 28 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66  t( pRoot->nOverf
34670 6c 6f 77 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  low>0 );.  asser
34680 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
34690 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
346a0 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ) );..  /* Make 
346b0 70 52 6f 6f 74 2c 20 74 68 65 20 72 6f 6f 74 20  pRoot, the root 
346c0 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
346d0 65 65 2c 20 77 72 69 74 61 62 6c 65 2e 20 41 6c  ee, writable. Al
346e0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 0a 20 20  locate a new .  
346f0 2a 2a 20 70 61 67 65 20 74 68 61 74 20 77 69 6c  ** page that wil
34700 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
34710 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20   right-child of 
34720 70 50 61 67 65 2e 20 43 6f 70 79 20 74 68 65 20  pPage. Copy the 
34730 63 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f 66  contents.  ** of
34740 20 74 68 65 20 6e 6f 64 65 20 73 74 6f 72 65 64   the node stored
34750 20 6f 6e 20 70 52 6f 6f 74 20 69 6e 74 6f 20 74   on pRoot into t
34760 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67  he new child pag
34770 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  e..  */.  rc = s
34780 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
34790 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
347a0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
347b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
347c0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
347d0 61 67 65 28 70 42 74 2c 26 70 43 68 69 6c 64 2c  age(pBt,&pChild,
347e0 26 70 67 6e 6f 43 68 69 6c 64 2c 70 52 6f 6f 74  &pgnoChild,pRoot
347f0 2d 3e 70 67 6e 6f 2c 30 29 3b 0a 20 20 20 20 63  ->pgno,0);.    c
34800 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 70  opyNodeContent(p
34810 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2c 20 26 72  Root, pChild, &r
34820 63 29 3b 0a 20 20 20 20 69 66 28 20 49 53 41 55  c);.    if( ISAU
34830 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
34840 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
34850 20 70 67 6e 6f 43 68 69 6c 64 2c 20 50 54 52 4d   pgnoChild, PTRM
34860 41 50 5f 42 54 52 45 45 2c 20 70 52 6f 6f 74 2d  AP_BTREE, pRoot-
34870 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20  >pgno, &rc);.   
34880 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20   }.  }.  if( rc 
34890 29 7b 0a 20 20 20 20 2a 70 70 43 68 69 6c 64 20  ){.    *ppChild 
348a0 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  = 0;.    release
348b0 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
348c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
348d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
348e0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
348f0 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44 62 50 61  le(pChild->pDbPa
34900 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
34910 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
34920 72 69 74 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e  riteable(pRoot->
34930 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
34940 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43  sert( pChild->nC
34950 65 6c 6c 3d 3d 70 52 6f 6f 74 2d 3e 6e 43 65 6c  ell==pRoot->nCel
34960 6c 20 29 3b 0a 0a 20 20 54 52 41 43 45 28 28 22  l );..  TRACE(("
34970 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72 6f  BALANCE: copy ro
34980 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e 22  ot %d into %d\n"
34990 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 70  , pRoot->pgno, p
349a0 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 0a  Child->pgno));..
349b0 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 6f 76    /* Copy the ov
349c0 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 66 72 6f  erflow cells fro
349d0 6d 20 70 52 6f 6f 74 20 74 6f 20 70 43 68 69 6c  m pRoot to pChil
349e0 64 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 43  d */.  memcpy(pC
349f0 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 52 6f  hild->aOvfl, pRo
34a00 6f 74 2d 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f 74  ot->aOvfl, pRoot
34a10 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65  ->nOverflow*size
34a20 6f 66 28 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c 5b  of(pRoot->aOvfl[
34a30 30 5d 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d 3e  0]));.  pChild->
34a40 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 52 6f 6f  nOverflow = pRoo
34a50 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 0a 20  t->nOverflow;.. 
34a60 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 63 6f 6e   /* Zero the con
34a70 74 65 6e 74 73 20 6f 66 20 70 52 6f 6f 74 2e 20  tents of pRoot. 
34a80 54 68 65 6e 20 69 6e 73 74 61 6c 6c 20 70 43 68  Then install pCh
34a90 69 6c 64 20 61 73 20 74 68 65 20 72 69 67 68 74  ild as the right
34aa0 2d 63 68 69 6c 64 2e 20 2a 2f 0a 20 20 7a 65 72  -child. */.  zer
34ab0 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20 70 43 68  oPage(pRoot, pCh
34ac0 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20  ild->aData[0] & 
34ad0 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 70 75  ~PTF_LEAF);.  pu
34ae0 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61  t4byte(&pRoot->a
34af0 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f  Data[pRoot->hdrO
34b00 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68  ffset+8], pgnoCh
34b10 69 6c 64 29 3b 0a 0a 20 20 2a 70 70 43 68 69 6c  ild);..  *ppChil
34b20 64 20 3d 20 70 43 68 69 6c 64 3b 0a 20 20 72 65  d = pChild;.  re
34b30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
34b40 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67  }../*.** The pag
34b50 65 20 74 68 61 74 20 70 43 75 72 20 63 75 72 72  e that pCur curr
34b60 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
34b70 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6d 6f  has just been mo
34b80 64 69 66 69 65 64 20 69 6e 0a 2a 2a 20 73 6f 6d  dified in.** som
34b90 65 20 77 61 79 2e 20 54 68 69 73 20 66 75 6e 63  e way. This func
34ba0 74 69 6f 6e 20 66 69 67 75 72 65 73 20 6f 75 74  tion figures out
34bb0 20 69 66 20 74 68 69 73 20 6d 6f 64 69 66 69 63   if this modific
34bc0 61 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 65 0a  ation means the.
34bd0 2a 2a 20 74 72 65 65 20 6e 65 65 64 73 20 74 6f  ** tree needs to
34be0 20 62 65 20 62 61 6c 61 6e 63 65 64 2c 20 61 6e   be balanced, an
34bf0 64 20 69 66 20 73 6f 20 63 61 6c 6c 73 20 74 68  d if so calls th
34c00 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 62 61  e appropriate ba
34c10 6c 61 6e 63 69 6e 67 20 0a 2a 2a 20 72 6f 75 74  lancing .** rout
34c20 69 6e 65 2e 20 42 61 6c 61 6e 63 69 6e 67 20 72  ine. Balancing r
34c30 6f 75 74 69 6e 65 73 20 61 72 65 3a 0a 2a 2a 0a  outines are:.**.
34c40 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 71 75 69  **   balance_qui
34c50 63 6b 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63  ck().**   balanc
34c60 65 5f 64 65 65 70 65 72 28 29 0a 2a 2a 20 20 20  e_deeper().**   
34c70 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
34c80 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ).*/.static int 
34c90 62 61 6c 61 6e 63 65 28 42 74 43 75 72 73 6f 72  balance(BtCursor
34ca0 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
34cb0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
34cc0 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4d 69 6e 20   const int nMin 
34cd0 3d 20 70 43 75 72 2d 3e 70 42 74 2d 3e 75 73 61  = pCur->pBt->usa
34ce0 62 6c 65 53 69 7a 65 20 2a 20 32 20 2f 20 33 3b  bleSize * 2 / 3;
34cf0 0a 20 20 75 38 20 61 42 61 6c 61 6e 63 65 51 75  .  u8 aBalanceQu
34d00 69 63 6b 53 70 61 63 65 5b 31 33 5d 3b 0a 20 20  ickSpace[13];.  
34d10 75 38 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a  u8 *pFree = 0;..
34d20 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20    TESTONLY( int 
34d30 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 5f 63 61  balance_quick_ca
34d40 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 20 20 54 45  lled = 0 );.  TE
34d50 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61  STONLY( int bala
34d60 6e 63 65 5f 64 65 65 70 65 72 5f 63 61 6c 6c 65  nce_deeper_calle
34d70 64 20 3d 20 30 20 29 3b 0a 0a 20 20 64 6f 20 7b  d = 0 );..  do {
34d80 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d  .    int iPage =
34d90 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
34da0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
34db0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
34dc0 69 50 61 67 65 5d 3b 0a 0a 20 20 20 20 69 66 28  iPage];..    if(
34dd0 20 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20   iPage==0 ){.   
34de0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f     if( pPage->nO
34df0 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
34e00 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70     /* The root p
34e10 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
34e20 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 49  e is overfull. I
34e30 6e 20 74 68 69 73 20 63 61 73 65 20 63 61 6c 6c  n this case call
34e40 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
34e50 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29  balance_deeper()
34e60 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 72 65   function to cre
34e70 61 74 65 20 61 20 6e 65 77 20 63 68 69 6c 64 20  ate a new child 
34e80 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  for the root-pag
34e90 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  e.        ** and
34ea0 20 63 6f 70 79 20 74 68 65 20 63 75 72 72 65 6e   copy the curren
34eb0 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  t contents of th
34ec0 65 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20 69  e root-page to i
34ed0 74 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  t. The.        *
34ee0 2a 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  * next iteration
34ef0 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20   of the do-loop 
34f00 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20 74 68 65  will balance the
34f10 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 20   child page..   
34f20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 20       */ .       
34f30 20 61 73 73 65 72 74 28 20 28 62 61 6c 61 6e 63   assert( (balanc
34f40 65 5f 64 65 65 70 65 72 5f 63 61 6c 6c 65 64 2b  e_deeper_called+
34f50 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  +)==0 );.       
34f60 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64 65   rc = balance_de
34f70 65 70 65 72 28 70 50 61 67 65 2c 20 26 70 43 75  eper(pPage, &pCu
34f80 72 2d 3e 61 70 50 61 67 65 5b 31 5d 29 3b 0a 20  r->apPage[1]);. 
34f90 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
34fa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34fb0 20 20 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67        pCur->iPag
34fc0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
34fd0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20   pCur->aiIdx[0] 
34fe0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
34ff0 43 75 72 2d 3e 61 69 49 64 78 5b 31 5d 20 3d 20  Cur->aiIdx[1] = 
35000 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  0;.          ass
35010 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
35020 65 5b 31 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  e[1]->nOverflow 
35030 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
35040 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35050 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
35060 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
35070 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
35080 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72  =0 && pPage->nFr
35090 65 65 3c 3d 6e 4d 69 6e 20 29 7b 0a 20 20 20 20  ee<=nMin ){.    
350a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c    break;.    }el
350b0 73 65 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67  se{.      MemPag
350c0 65 20 2a 20 63 6f 6e 73 74 20 70 50 61 72 65 6e  e * const pParen
350d0 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  t = pCur->apPage
350e0 5b 69 50 61 67 65 2d 31 5d 3b 0a 20 20 20 20 20  [iPage-1];.     
350f0 20 69 6e 74 20 63 6f 6e 73 74 20 69 49 64 78 20   int const iIdx 
35100 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  = pCur->aiIdx[iP
35110 61 67 65 2d 31 5d 3b 0a 0a 20 20 20 20 20 20 72  age-1];..      r
35120 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
35130 57 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e 70  Write(pParent->p
35140 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
35150 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
35160 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
35170 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
35180 41 4e 43 45 0a 20 20 20 20 20 20 20 20 69 66 28  ANCE.        if(
35190 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 0a   pPage->hasData.
351a0 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61 67           && pPag
351b0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 0a  e->nOverflow==1.
351c0 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61 67           && pPag
351d0 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d  e->aOvfl[0].idx=
351e0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 0a 20 20  =pPage->nCell.  
351f0 20 20 20 20 20 20 20 26 26 20 70 50 61 72 65 6e         && pParen
35200 74 2d 3e 70 67 6e 6f 21 3d 31 0a 20 20 20 20 20  t->pgno!=1.     
35210 20 20 20 20 26 26 20 70 50 61 72 65 6e 74 2d 3e      && pParent->
35220 6e 43 65 6c 6c 3d 3d 69 49 64 78 0a 20 20 20 20  nCell==iIdx.    
35230 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
35240 20 2f 2a 20 43 61 6c 6c 20 62 61 6c 61 6e 63 65   /* Call balance
35250 5f 71 75 69 63 6b 28 29 20 74 6f 20 63 72 65 61  _quick() to crea
35260 74 65 20 61 20 6e 65 77 20 73 69 62 6c 69 6e 67  te a new sibling
35270 20 6f 66 20 70 50 61 67 65 20 6f 6e 20 77 68 69   of pPage on whi
35280 63 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ch.          ** 
35290 74 6f 20 73 74 6f 72 65 20 74 68 65 20 6f 76 65  to store the ove
352a0 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 62 61 6c 61  rflow cell. bala
352b0 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 6e 73 65  nce_quick() inse
352c0 72 74 73 20 61 20 6e 65 77 20 63 65 6c 6c 0a 20  rts a new cell. 
352d0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f           ** into
352e0 20 70 50 61 72 65 6e 74 2c 20 77 68 69 63 68 20   pParent, which 
352f0 6d 61 79 20 63 61 75 73 65 20 70 50 61 72 65 6e  may cause pParen
35300 74 20 6f 76 65 72 66 6c 6f 77 2e 20 49 66 20 74  t overflow. If t
35310 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  his.          **
35320 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6e 65   happens, the ne
35330 78 74 20 69 6e 74 65 72 61 74 69 6f 6e 20 6f 66  xt interation of
35340 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c   the do-loop wil
35350 6c 20 62 61 6c 61 6e 63 65 20 70 50 61 72 65 6e  l balance pParen
35360 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  t .          ** 
35370 75 73 65 20 65 69 74 68 65 72 20 62 61 6c 61 6e  use either balan
35380 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 6f 72 20  ce_nonroot() or 
35390 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29  balance_deeper()
353a0 2e 20 55 6e 74 69 6c 20 74 68 69 73 0a 20 20 20  . Until this.   
353b0 20 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e         ** happen
353c0 73 2c 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  s, the overflow 
353d0 63 65 6c 6c 20 69 73 20 73 74 6f 72 65 64 20 69  cell is stored i
353e0 6e 20 74 68 65 20 61 42 61 6c 61 6e 63 65 51 75  n the aBalanceQu
353f0 69 63 6b 53 70 61 63 65 5b 5d 0a 20 20 20 20 20  ickSpace[].     
35400 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e 20       ** buffer. 
35410 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .          **.  
35420 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 70          ** The p
35430 75 72 70 6f 73 65 20 6f 66 20 74 68 65 20 66 6f  urpose of the fo
35440 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29  llowing assert()
35450 20 69 73 20 74 6f 20 63 68 65 63 6b 20 74 68 61   is to check tha
35460 74 20 6f 6e 6c 79 20 61 0a 20 20 20 20 20 20 20  t only a.       
35470 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 63 61 6c     ** single cal
35480 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 71 75 69  l to balance_qui
35490 63 6b 28 29 20 69 73 20 6d 61 64 65 20 66 6f 72  ck() is made for
354a0 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 74 68   each call to th
354b0 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
354c0 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69  function. If thi
354d0 73 20 77 65 72 65 20 6e 6f 74 20 76 65 72 69 66  s were not verif
354e0 69 65 64 2c 20 61 20 73 75 62 74 6c 65 20 62 75  ied, a subtle bu
354f0 67 20 69 6e 76 6f 6c 76 69 6e 67 20 72 65 75 73  g involving reus
35500 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  e.          ** o
35510 66 20 74 68 65 20 61 42 61 6c 61 6e 63 65 51 75  f the aBalanceQu
35520 69 63 6b 53 70 61 63 65 5b 5d 20 6d 69 67 68 74  ickSpace[] might
35530 20 73 6e 65 61 6b 20 69 6e 2e 0a 20 20 20 20 20   sneak in..     
35540 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
35550 20 20 61 73 73 65 72 74 28 20 28 62 61 6c 61 6e    assert( (balan
35560 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64 2b  ce_quick_called+
35570 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  +)==0 );.       
35580 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f     rc = balance_
35590 71 75 69 63 6b 28 70 50 61 72 65 6e 74 2c 20 70  quick(pParent, p
355a0 50 61 67 65 2c 20 61 42 61 6c 61 6e 63 65 51 75  Page, aBalanceQu
355b0 69 63 6b 53 70 61 63 65 29 3b 0a 20 20 20 20 20  ickSpace);.     
355c0 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
355d0 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
355e0 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
355f0 61 73 65 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63  ase, call balanc
35600 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 74 6f 20 72  e_nonroot() to r
35610 65 64 69 73 74 72 69 62 75 74 65 20 63 65 6c 6c  edistribute cell
35620 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  s.          ** b
35630 65 74 77 65 65 6e 20 70 50 61 67 65 20 61 6e 64  etween pPage and
35640 20 75 70 20 74 6f 20 32 20 6f 66 20 69 74 73 20   up to 2 of its 
35650 73 69 62 6c 69 6e 67 20 70 61 67 65 73 2e 20 54  sibling pages. T
35660 68 69 73 20 69 6e 76 6f 6c 76 65 73 0a 20 20 20  his involves.   
35670 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79         ** modify
35680 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ing the contents
35690 20 6f 66 20 70 50 61 72 65 6e 74 2c 20 77 68 69   of pParent, whi
356a0 63 68 20 6d 61 79 20 63 61 75 73 65 20 70 50 61  ch may cause pPa
356b0 72 65 6e 74 20 74 6f 0a 20 20 20 20 20 20 20 20  rent to.        
356c0 20 20 2a 2a 20 62 65 63 6f 6d 65 20 6f 76 65 72    ** become over
356d0 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c  full or underful
356e0 6c 2e 20 54 68 65 20 6e 65 78 74 20 69 74 65 72  l. The next iter
356f0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d  ation of the do-
35700 6c 6f 6f 70 0a 20 20 20 20 20 20 20 20 20 20 2a  loop.          *
35710 2a 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20 74  * will balance t
35720 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 74  he parent page t
35730 6f 20 63 6f 72 72 65 63 74 20 74 68 69 73 2e 0a  o correct this..
35740 20 20 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20            ** .  
35750 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68          ** If th
35760 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 62 65  e parent page be
35770 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c 20  comes overfull, 
35780 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
35790 6c 20 6f 72 20 63 65 6c 6c 73 0a 20 20 20 20 20  l or cells.     
357a0 20 20 20 20 20 2a 2a 20 61 72 65 20 73 74 6f 72       ** are stor
357b0 65 64 20 69 6e 20 74 68 65 20 70 53 70 61 63 65  ed in the pSpace
357c0 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
357d0 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 62 65  d immediately be
357e0 6c 6f 77 2e 20 0a 20 20 20 20 20 20 20 20 20 20  low. .          
357f0 2a 2a 20 41 20 73 75 62 73 65 71 75 65 6e 74 20  ** A subsequent 
35800 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
35810 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 64 65   do-loop will de
35820 61 6c 20 77 69 74 68 20 74 68 69 73 20 62 79 0a  al with this by.
35830 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6c            ** cal
35840 6c 69 6e 67 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  ling balance_non
35850 72 6f 6f 74 28 29 20 28 62 61 6c 61 6e 63 65 5f  root() (balance_
35860 64 65 65 70 65 72 28 29 20 6d 61 79 20 62 65 20  deeper() may be 
35870 63 61 6c 6c 65 64 20 66 69 72 73 74 2c 0a 20 20  called first,.  
35880 20 20 20 20 20 20 20 20 2a 2a 20 62 75 74 20 69          ** but i
35890 74 20 64 6f 65 73 6e 27 74 20 64 65 61 6c 20 77  t doesn't deal w
358a0 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ith overflow cel
358b0 6c 73 20 2d 20 6a 75 73 74 20 6d 6f 76 65 73 20  ls - just moves 
358c0 74 68 65 6d 20 74 6f 20 61 0a 20 20 20 20 20 20  them to a.      
358d0 20 20 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74      ** different
358e0 20 70 61 67 65 29 2e 20 4f 6e 63 65 20 74 68 69   page). Once thi
358f0 73 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  s subsequent cal
35900 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  l to balance_non
35910 72 6f 6f 74 28 29 20 0a 20 20 20 20 20 20 20 20  root() .        
35920 20 20 2a 2a 20 68 61 73 20 63 6f 6d 70 6c 65 74    ** has complet
35930 65 64 2c 20 69 74 20 69 73 20 73 61 66 65 20 74  ed, it is safe t
35940 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20 70 53  o release the pS
35950 70 61 63 65 20 62 75 66 66 65 72 20 75 73 65 64  pace buffer used
35960 20 62 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   by.          **
35970 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 61   the previous ca
35980 6c 6c 2c 20 61 73 20 74 68 65 20 6f 76 65 72 66  ll, as the overf
35990 6c 6f 77 20 63 65 6c 6c 20 64 61 74 61 20 77 69  low cell data wi
359a0 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 0a 20 20  ll have been .  
359b0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65          ** copie
359c0 64 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68  d either into th
359d0 65 20 62 6f 64 79 20 6f 66 20 61 20 64 61 74 61  e body of a data
359e0 62 61 73 65 20 70 61 67 65 20 6f 72 20 69 6e 74  base page or int
359f0 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 20 20  o the new.      
35a00 20 20 20 20 2a 2a 20 70 53 70 61 63 65 20 62 75      ** pSpace bu
35a10 66 66 65 72 20 70 61 73 73 65 64 20 74 6f 20 74  ffer passed to t
35a20 68 65 20 6c 61 74 74 65 72 20 63 61 6c 6c 20 74  he latter call t
35a30 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  o balance_nonroo
35a40 74 28 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  t()..          *
35a50 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a  /.          u8 *
35a60 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
35a70 50 61 67 65 4d 61 6c 6c 6f 63 28 70 43 75 72 2d  PageMalloc(pCur-
35a80 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  >pBt->pageSize);
35a90 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
35aa0 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
35ab0 70 50 61 72 65 6e 74 2c 20 69 49 64 78 2c 20 70  pParent, iIdx, p
35ac0 53 70 61 63 65 2c 20 69 50 61 67 65 3d 3d 31 29  Space, iPage==1)
35ad0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
35ae0 70 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20  pFree ){.       
35af0 20 20 20 20 20 2f 2a 20 49 66 20 70 46 72 65 65       /* If pFree
35b00 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74   is not NULL, it
35b10 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 70   points to the p
35b20 53 70 61 63 65 20 62 75 66 66 65 72 20 75 73 65  Space buffer use
35b30 64 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  d .            *
35b40 2a 20 62 79 20 61 20 70 72 65 76 69 6f 75 73 20  * by a previous 
35b50 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f  call to balance_
35b60 6e 6f 6e 72 6f 6f 74 28 29 2e 20 49 74 73 20 63  nonroot(). Its c
35b70 6f 6e 74 65 6e 74 73 20 61 72 65 0a 20 20 20 20  ontents are.    
35b80 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 77 20 73          ** now s
35b90 74 6f 72 65 64 20 65 69 74 68 65 72 20 6f 6e 20  tored either on 
35ba0 72 65 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  real database pa
35bb0 67 65 73 20 6f 72 20 77 69 74 68 69 6e 20 74 68  ges or within th
35bc0 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  e .            *
35bd0 2a 20 6e 65 77 20 70 53 70 61 63 65 20 62 75 66  * new pSpace buf
35be0 66 65 72 2c 20 73 6f 20 69 74 20 6d 61 79 20 62  fer, so it may b
35bf0 65 20 73 61 66 65 6c 79 20 66 72 65 65 64 20 68  e safely freed h
35c00 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ere. */.        
35c10 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
35c20 72 65 65 28 70 46 72 65 65 29 3b 0a 20 20 20 20  ree(pFree);.    
35c30 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
35c40 20 20 20 2f 2a 20 54 68 65 20 70 53 70 61 63 65     /* The pSpace
35c50 20 62 75 66 66 65 72 20 77 69 6c 6c 20 62 65 20   buffer will be 
35c60 66 72 65 65 64 20 61 66 74 65 72 20 74 68 65 20  freed after the 
35c70 6e 65 78 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  next call to.   
35c80 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63         ** balanc
35c90 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2c 20 6f 72 20  e_nonroot(), or 
35ca0 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68 69 73  just before this
35cb0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
35cc0 73 2c 20 77 68 69 63 68 65 76 65 72 0a 20 20 20  s, whichever.   
35cd0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6d 65 73 20         ** comes 
35ce0 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20  first. */.      
35cf0 20 20 20 20 70 46 72 65 65 20 3d 20 70 53 70 61      pFree = pSpa
35d00 63 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ce;.        }.  
35d10 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61      }..      pPa
35d20 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
35d30 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  0;..      /* The
35d40 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
35d50 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 62  of the do-loop b
35d60 61 6c 61 6e 63 65 73 20 74 68 65 20 70 61 72 65  alances the pare
35d70 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  nt page. */.    
35d80 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
35d90 61 67 65 29 3b 0a 20 20 20 20 20 20 70 43 75 72  age);.      pCur
35da0 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d  ->iPage--;.    }
35db0 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53  .  }while( rc==S
35dc0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69  QLITE_OK );..  i
35dd0 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20  f( pFree ){.    
35de0 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
35df0 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pFree);.  }.  re
35e00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
35e10 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  ** Insert a new 
35e20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
35e30 42 54 72 65 65 2e 20 20 54 68 65 20 6b 65 79 20  BTree.  The key 
35e40 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 4b 65  is given by (pKe
35e50 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74  y,nKey).** and t
35e60 68 65 20 64 61 74 61 20 69 73 20 67 69 76 65 6e  he data is given
35e70 20 62 79 20 28 70 44 61 74 61 2c 6e 44 61 74 61   by (pData,nData
35e80 29 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 69  ).  The cursor i
35e90 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a  s used only to.*
35ea0 2a 20 64 65 66 69 6e 65 20 77 68 61 74 20 74 61  * define what ta
35eb0 62 6c 65 20 74 68 65 20 72 65 63 6f 72 64 20 73  ble the record s
35ec0 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65  hould be inserte
35ed0 64 20 69 6e 74 6f 2e 20 20 54 68 65 20 63 75 72  d into.  The cur
35ee0 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70  sor.** is left p
35ef0 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e  ointing at a ran
35f00 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  dom location..**
35f10 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45  .** For an INTKE
35f20 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68  Y table, only th
35f30 65 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f 66 20  e nKey value of 
35f40 74 68 65 20 6b 65 79 20 69 73 20 75 73 65 64 2e  the key is used.
35f50 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e    pKey is.** ign
35f60 6f 72 65 64 2e 20 20 46 6f 72 20 61 20 5a 45 52  ored.  For a ZER
35f70 4f 44 41 54 41 20 74 61 62 6c 65 2c 20 74 68 65  ODATA table, the
35f80 20 70 44 61 74 61 20 61 6e 64 20 6e 44 61 74 61   pData and nData
35f90 20 61 72 65 20 62 6f 74 68 20 69 67 6e 6f 72 65   are both ignore
35fa0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
35fb0 73 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d  seekResult param
35fc0 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
35fd0 2c 20 74 68 65 6e 20 61 20 73 75 63 63 65 73 73  , then a success
35fe0 66 75 6c 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 4d  ful call to.** M
35ff0 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20  ovetoUnpacked() 
36000 74 6f 20 73 65 65 6b 20 63 75 72 73 6f 72 20 70  to seek cursor p
36010 43 75 72 20 74 6f 20 28 70 4b 65 79 2c 20 6e 4b  Cur to (pKey, nK
36020 65 79 29 20 68 61 73 20 61 6c 72 65 61 64 79 0a  ey) has already.
36030 2a 2a 20 62 65 65 6e 20 70 65 72 66 6f 72 6d 65  ** been performe
36040 64 2e 20 73 65 65 6b 52 65 73 75 6c 74 20 69 73  d. seekResult is
36050 20 74 68 65 20 73 65 61 72 63 68 20 72 65 73 75   the search resu
36060 6c 74 20 72 65 74 75 72 6e 65 64 20 28 61 20 6e  lt returned (a n
36070 65 67 61 74 69 76 65 0a 2a 2a 20 6e 75 6d 62 65  egative.** numbe
36080 72 20 69 66 20 70 43 75 72 20 70 6f 69 6e 74 73  r if pCur points
36090 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
360a0 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  t is smaller tha
360b0 6e 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 2c 20  n (pKey, nKey), 
360c0 6f 72 0a 2a 2a 20 61 20 70 6f 73 69 74 69 76 65  or.** a positive
360d0 20 76 61 6c 75 65 20 69 66 20 70 43 75 72 20 70   value if pCur p
360e0 6f 69 6e 74 73 20 61 74 20 61 6e 20 65 74 72 79  oints at an etry
360f0 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20   that is larger 
36100 74 68 61 6e 20 0a 2a 2a 20 28 70 4b 65 79 2c 20  than .** (pKey, 
36110 6e 4b 65 79 29 29 2e 20 0a 2a 2a 0a 2a 2a 20 49  nKey)). .**.** I
36120 66 20 74 68 65 20 73 65 65 6b 52 65 73 75 6c 74  f the seekResult
36130 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
36140 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
36150 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65   caller guarante
36160 65 73 20 74 68 61 74 0a 2a 2a 20 63 75 72 73 6f  es that.** curso
36170 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69  r pCur is pointi
36180 6e 67 20 61 74 20 74 68 65 20 65 78 69 73 74 69  ng at the existi
36190 6e 67 20 63 6f 70 79 20 6f 66 20 61 20 72 6f 77  ng copy of a row
361a0 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 0a 2a   that is to be.*
361b0 2a 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20  * overwritten.  
361c0 49 66 20 74 68 65 20 73 65 65 6b 52 65 73 75 6c  If the seekResul
361d0 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  t parameter is 0
361e0 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 70 43  , then cursor pC
361f0 75 72 20 6d 61 79 0a 2a 2a 20 70 6f 69 6e 74 20  ur may.** point 
36200 74 6f 20 61 6e 79 20 65 6e 74 72 79 20 6f 72 20  to any entry or 
36210 74 6f 20 6e 6f 20 65 6e 74 72 79 20 61 74 20 61  to no entry at a
36220 6c 6c 20 61 6e 64 20 73 6f 20 74 68 69 73 20 66  ll and so this f
36230 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 6f 20 73  unction has to s
36240 65 65 6b 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f  eek.** the curso
36250 72 20 62 65 66 6f 72 65 20 74 68 65 20 6e 65 77  r before the new
36260 20 6b 65 79 20 63 61 6e 20 62 65 20 69 6e 73 65   key can be inse
36270 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rted..*/.int sql
36280 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28  ite3BtreeInsert(
36290 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
362a0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
362b0 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61    /* Insert data
362c0 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20   into the table 
362d0 6f 66 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a  of this cursor *
362e0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
362f0 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20  pKey, i64 nKey, 
36300 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66     /* The key of
36310 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20   the new record 
36320 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
36330 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74  *pData, int nDat
36340 61 2c 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  a,  /* The data 
36350 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  of the new recor
36360 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f  d */.  int nZero
36370 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
36380 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
36390 6f 66 20 65 78 74 72 61 20 30 20 62 79 74 65 73  of extra 0 bytes
363a0 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 64 61   to append to da
363b0 74 61 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65  ta */.  int appe
363c0 6e 64 42 69 61 73 2c 20 20 20 20 20 20 20 20 20  ndBias,         
363d0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
363e0 66 20 74 68 69 73 20 69 73 20 6c 69 6b 65 6c 79  f this is likely
363f0 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20   an append */.  
36400 69 6e 74 20 73 65 65 6b 52 65 73 75 6c 74 20 20  int seekResult  
36410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36420 2a 20 52 65 73 75 6c 74 20 6f 66 20 70 72 69 6f  * Result of prio
36430 72 20 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  r MovetoUnpacked
36440 28 29 20 63 61 6c 6c 20 2a 2f 0a 29 7b 0a 20 20  () call */.){.  
36450 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f  int rc;.  int lo
36460 63 20 3d 20 73 65 65 6b 52 65 73 75 6c 74 3b 20  c = seekResult; 
36470 20 20 20 20 20 20 20 20 20 2f 2a 20 2d 31 3a 20           /* -1: 
36480 62 65 66 6f 72 65 20 64 65 73 69 72 65 64 20 6c  before desired l
36490 6f 63 61 74 69 6f 6e 20 20 2b 31 3a 20 61 66 74  ocation  +1: aft
364a0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65  er */.  int szNe
364b0 77 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 64 78  w = 0;.  int idx
364c0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
364d0 67 65 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d  ge;.  Btree *p =
364e0 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
364f0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
36500 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67   p->pBt;.  unsig
36510 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c  ned char *oldCel
36520 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  l;.  unsigned ch
36530 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b  ar *newCell = 0;
36540 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ..  if( pCur->eS
36550 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
36560 4c 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  LT ){.    assert
36570 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
36580 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
36590 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
365a0 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20  skipNext;.  }.. 
365b0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
365c0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
365d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
365e0 72 2d 3e 77 72 46 6c 61 67 20 26 26 20 70 42 74  r->wrFlag && pBt
365f0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
36600 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20  =TRANS_WRITE && 
36610 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
36620 3b 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53  ;.  assert( hasS
36630 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
36640 6f 63 6b 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e  ock(p, pCur->pgn
36650 6f 52 6f 6f 74 2c 20 70 43 75 72 2d 3e 70 4b 65  oRoot, pCur->pKe
36660 79 49 6e 66 6f 21 3d 30 2c 20 32 29 20 29 3b 0a  yInfo!=0, 2) );.
36670 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
36680 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
36690 20 62 65 65 6e 20 63 6f 6e 73 69 73 74 65 6e 74   been consistent
366a0 2e 20 49 66 20 74 68 69 73 20 63 75 72 73 6f 72  . If this cursor
366b0 20 77 61 73 20 6f 70 65 6e 65 64 0a 20 20 2a 2a   was opened.  **
366c0 20 65 78 70 65 63 74 69 6e 67 20 61 6e 20 69 6e   expecting an in
366d0 64 65 78 20 62 2d 74 72 65 65 2c 20 74 68 65 6e  dex b-tree, then
366e0 20 74 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75   the caller shou
366f0 6c 64 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20  ld be inserting 
36700 62 6c 6f 62 0a 20 20 2a 2a 20 6b 65 79 73 20 77  blob.  ** keys w
36710 69 74 68 20 6e 6f 20 61 73 73 6f 63 69 61 74 65  ith no associate
36720 64 20 64 61 74 61 2e 20 49 66 20 74 68 65 20 63  d data. If the c
36730 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
36740 20 65 78 70 65 63 74 69 6e 67 20 61 6e 0a 20 20   expecting an.  
36750 2a 2a 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c  ** intkey table,
36760 20 74 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75   the caller shou
36770 6c 64 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20  ld be inserting 
36780 69 6e 74 65 67 65 72 20 6b 65 79 73 20 77 69 74  integer keys wit
36790 68 20 61 0a 20 20 2a 2a 20 62 6c 6f 62 20 6f 66  h a.  ** blob of
367a0 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   associated data
367b0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
367c0 28 70 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72  (pKey==0)==(pCur
367d0 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29  ->pKeyInfo==0) )
367e0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
367f0 69 73 20 61 6e 20 69 6e 73 65 72 74 20 69 6e 74  is an insert int
36800 6f 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  o a table b-tree
36810 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79  , invalidate any
36820 20 69 6e 63 72 62 6c 6f 62 20 0a 20 20 2a 2a 20   incrblob .  ** 
36830 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
36840 74 68 65 20 72 6f 77 20 62 65 69 6e 67 20 72 65  the row being re
36850 70 6c 61 63 65 64 20 28 61 73 73 75 6d 69 6e 67  placed (assuming
36860 20 74 68 69 73 20 69 73 20 61 20 72 65 70 6c 61   this is a repla
36870 63 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f  ce.  ** operatio
36880 6e 20 2d 20 69 66 20 69 74 20 69 73 20 6e 6f 74  n - if it is not
36890 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
368a0 69 73 20 61 20 6e 6f 2d 6f 70 29 2e 20 20 2a 2f  is a no-op).  */
368b0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4b 65  .  if( pCur->pKe
368c0 79 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  yInfo==0 ){.    
368d0 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c  invalidateIncrbl
368e0 6f 62 43 75 72 73 6f 72 73 28 70 2c 20 6e 4b 65  obCursors(p, nKe
368f0 79 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  y, 0);.  }..  /*
36900 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69   Save the positi
36910 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72  ons of any other
36920 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
36930 20 74 68 69 73 20 74 61 62 6c 65 2e 0a 20 20 2a   this table..  *
36940 2a 0a 20 20 2a 2a 20 49 6e 20 73 6f 6d 65 20 63  *.  ** In some c
36950 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 20 74  ases, the call t
36960 6f 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 29 20  o btreeMoveto() 
36970 62 65 6c 6f 77 20 69 73 20 61 20 6e 6f 2d 6f 70  below is a no-op
36980 2e 20 46 6f 72 0a 20 20 2a 2a 20 65 78 61 6d 70  . For.  ** examp
36990 6c 65 2c 20 77 68 65 6e 20 69 6e 73 65 72 74 69  le, when inserti
369a0 6e 67 20 64 61 74 61 20 69 6e 74 6f 20 61 20 74  ng data into a t
369b0 61 62 6c 65 20 77 69 74 68 20 61 75 74 6f 2d 67  able with auto-g
369c0 65 6e 65 72 61 74 65 64 20 69 6e 74 65 67 65 72  enerated integer
369d0 0a 20 20 2a 2a 20 6b 65 79 73 2c 20 74 68 65 20  .  ** keys, the 
369e0 56 44 42 45 20 6c 61 79 65 72 20 69 6e 76 6f 6b  VDBE layer invok
369f0 65 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  es sqlite3BtreeL
36a00 61 73 74 28 29 20 74 6f 20 66 69 67 75 72 65 20  ast() to figure 
36a10 6f 75 74 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e  out the .  ** in
36a20 74 65 67 65 72 20 6b 65 79 20 74 6f 20 75 73 65  teger key to use
36a30 2e 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20  . It then calls 
36a40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
36a50 20 61 63 74 75 61 6c 6c 79 20 69 6e 73 65 72 74   actually insert
36a60 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 20   the .  ** data 
36a70 69 6e 74 6f 20 74 68 65 20 69 6e 74 6b 65 79 20  into the intkey 
36a80 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20  B-Tree. In this 
36a90 63 61 73 65 20 62 74 72 65 65 4d 6f 76 65 74 6f  case btreeMoveto
36aa0 28 29 20 72 65 63 6f 67 6e 69 7a 65 73 0a 20 20  () recognizes.  
36ab0 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ** that the curs
36ac0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 77 68  or is already wh
36ad0 65 72 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20  ere it needs to 
36ae0 62 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 77  be and returns w
36af0 69 74 68 6f 75 74 0a 20 20 2a 2a 20 64 6f 69 6e  ithout.  ** doin
36b00 67 20 61 6e 79 20 77 6f 72 6b 2e 20 54 6f 20 61  g any work. To a
36b10 76 6f 69 64 20 74 68 77 61 72 74 69 6e 67 20 74  void thwarting t
36b20 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  hese optimizatio
36b30 6e 73 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74  ns, it is import
36b40 61 6e 74 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20  ant.  ** not to 
36b50 63 6c 65 61 72 20 74 68 65 20 63 75 72 73 6f 72  clear the cursor
36b60 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 72 63   here..  */.  rc
36b70 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
36b80 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  s(pBt, pCur->pgn
36b90 6f 52 6f 6f 74 2c 20 70 43 75 72 29 3b 0a 20 20  oRoot, pCur);.  
36ba0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
36bb0 72 63 3b 0a 20 20 69 66 28 20 21 6c 6f 63 20 29  rc;.  if( !loc )
36bc0 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
36bd0 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 4b 65  Moveto(pCur, pKe
36be0 79 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42  y, nKey, appendB
36bf0 69 61 73 2c 20 26 6c 6f 63 29 3b 0a 20 20 20 20  ias, &loc);.    
36c00 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
36c10 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
36c20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
36c30 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
36c40 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43  (pCur->eState==C
36c50 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 26 26  URSOR_INVALID &&
36c60 20 6c 6f 63 29 20 29 3b 0a 0a 20 20 70 50 61 67   loc) );..  pPag
36c70 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
36c80 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
36c90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
36ca0 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d  intKey || nKey>=
36cb0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
36cc0 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70  Page->leaf || !p
36cd0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a  Page->intKey );.
36ce0 0a 20 20 54 52 41 43 45 28 28 22 49 4e 53 45 52  .  TRACE(("INSER
36cf0 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79  T: table=%d nkey
36d00 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20 70  =%lld ndata=%d p
36d10 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20  age=%d %s\n",.  
36d20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67          pCur->pg
36d30 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44  noRoot, nKey, nD
36d40 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ata, pPage->pgno
36d50 2c 0a 20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d  ,.          loc=
36d60 3d 30 20 3f 20 22 6f 76 65 72 77 72 69 74 65 22  =0 ? "overwrite"
36d70 20 3a 20 22 6e 65 77 20 65 6e 74 72 79 22 29 29   : "new entry"))
36d80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
36d90 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
36da0 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
36db0 28 70 42 74 29 3b 0a 20 20 6e 65 77 43 65 6c 6c  (pBt);.  newCell
36dc0 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63   = pBt->pTmpSpac
36dd0 65 3b 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c  e;.  if( newCell
36de0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
36df0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20  ITE_NOMEM;.  rc 
36e00 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61  = fillInCell(pPa
36e10 67 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65  ge, newCell, pKe
36e20 79 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20  y, nKey, pData, 
36e30 6e 44 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73  nData, nZero, &s
36e40 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20  zNew);.  if( rc 
36e50 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72  ) goto end_inser
36e60 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e  t;.  assert( szN
36e70 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  ew==cellSizePtr(
36e80 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20  pPage, newCell) 
36e90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e  );.  assert( szN
36ea0 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  ew<=MX_CELL_SIZE
36eb0 28 70 42 74 29 20 29 3b 0a 20 20 69 64 78 20 3d  (pBt) );.  idx =
36ec0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
36ed0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28  r->iPage];.  if(
36ee0 20 6c 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75   loc==0 ){.    u
36ef0 31 36 20 73 7a 4f 6c 64 3b 0a 20 20 20 20 61 73  16 szOld;.    as
36f00 73 65 72 74 28 20 69 64 78 3c 70 50 61 67 65 2d  sert( idx<pPage-
36f10 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
36f20 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
36f30 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
36f40 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
36f50 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
36f60 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d  nd_insert;.    }
36f70 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66  .    oldCell = f
36f80 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
36f90 64 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  dx);.    if( !pP
36fa0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
36fb0 20 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c     memcpy(newCel
36fc0 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a  l, oldCell, 4);.
36fd0 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20      }.    szOld 
36fe0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
36ff0 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20  age, oldCell);. 
37000 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c     rc = clearCel
37010 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c  l(pPage, oldCell
37020 29 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28  );.    dropCell(
37030 70 50 61 67 65 2c 20 69 64 78 2c 20 73 7a 4f 6c  pPage, idx, szOl
37040 64 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  d, &rc);.    if(
37050 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69   rc ) goto end_i
37060 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 20 69  nsert;.  }else i
37070 66 28 20 6c 6f 63 3c 30 20 26 26 20 70 50 61 67  f( loc<0 && pPag
37080 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20  e->nCell>0 ){.  
37090 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
370a0 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 69 64 78  >leaf );.    idx
370b0 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78   = ++pCur->aiIdx
370c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
370d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
370e0 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  rt( pPage->leaf 
370f0 29 3b 0a 20 20 7d 0a 20 20 69 6e 73 65 72 74 43  );.  }.  insertC
37100 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20  ell(pPage, idx, 
37110 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20  newCell, szNew, 
37120 30 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 61 73  0, 0, &rc);.  as
37130 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
37140 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 43  _OK || pPage->nC
37150 65 6c 6c 3e 30 20 7c 7c 20 70 50 61 67 65 2d 3e  ell>0 || pPage->
37160 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 0a  nOverflow>0 );..
37170 20 20 2f 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72    /* If no error
37180 20 68 61 73 20 6f 63 63 75 72 65 64 20 61 6e 64   has occured and
37190 20 70 50 61 67 65 20 68 61 73 20 61 6e 20 6f 76   pPage has an ov
371a0 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20 63 61 6c  erflow cell, cal
371b0 6c 20 62 61 6c 61 6e 63 65 28 29 20 0a 20 20 2a  l balance() .  *
371c0 2a 20 74 6f 20 72 65 64 69 73 74 72 69 62 75 74  * to redistribut
371d0 65 20 74 68 65 20 63 65 6c 6c 73 20 77 69 74 68  e the cells with
371e0 69 6e 20 74 68 65 20 74 72 65 65 2e 20 53 69 6e  in the tree. Sin
371f0 63 65 20 62 61 6c 61 6e 63 65 28 29 20 6d 61 79  ce balance() may
37200 20 6d 6f 76 65 0a 20 20 2a 2a 20 74 68 65 20 63   move.  ** the c
37210 75 72 73 6f 72 2c 20 7a 65 72 6f 20 74 68 65 20  ursor, zero the 
37220 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 2e 6e 53  BtCursor.info.nS
37230 69 7a 65 20 61 6e 64 20 42 74 43 75 72 73 6f 72  ize and BtCursor
37240 2e 76 61 6c 69 64 4e 4b 65 79 0a 20 20 2a 2a 20  .validNKey.  ** 
37250 76 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  variables..  **.
37260 20 20 2a 2a 20 50 72 65 76 69 6f 75 73 20 76 65    ** Previous ve
37270 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
37280 20 63 61 6c 6c 65 64 20 6d 6f 76 65 54 6f 52 6f   called moveToRo
37290 6f 74 28 29 20 74 6f 20 6d 6f 76 65 20 74 68 65  ot() to move the
372a0 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 62 61 63   cursor.  ** bac
372b0 6b 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  k to the root pa
372c0 67 65 20 61 73 20 62 61 6c 61 6e 63 65 28 29 20  ge as balance() 
372d0 75 73 65 64 20 74 6f 20 69 6e 76 61 6c 69 64 61  used to invalida
372e0 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  te the contents.
372f0 20 20 2a 2a 20 6f 66 20 42 74 43 75 72 73 6f 72    ** of BtCursor
37300 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 42 74  .apPage[] and Bt
37310 43 75 72 73 6f 72 2e 61 69 49 64 78 5b 5d 2e 20  Cursor.aiIdx[]. 
37320 49 6e 73 74 65 61 64 20 6f 66 20 64 6f 69 6e 67  Instead of doing
37330 20 74 68 61 74 2c 0a 20 20 2a 2a 20 73 65 74 20   that,.  ** set 
37340 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
37350 20 74 6f 20 22 69 6e 76 61 6c 69 64 22 2e 20 54   to "invalid". T
37360 68 69 73 20 6d 61 6b 65 73 20 63 6f 6d 6d 6f 6e  his makes common
37370 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f   insert operatio
37380 6e 73 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79  ns.  ** slightly
37390 20 66 61 73 74 65 72 2e 0a 20 20 2a 2a 0a 20 20   faster..  **.  
373a0 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 73 75  ** There is a su
373b0 62 74 6c 65 20 62 75 74 20 69 6d 70 6f 72 74 61  btle but importa
373c0 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  nt optimization 
373d0 68 65 72 65 20 74 6f 6f 2e 20 57 68 65 6e 20 69  here too. When i
373e0 6e 73 65 72 74 69 6e 67 0a 20 20 2a 2a 20 6d 75  nserting.  ** mu
373f0 6c 74 69 70 6c 65 20 72 65 63 6f 72 64 73 20 69  ltiple records i
37400 6e 74 6f 20 61 6e 20 69 6e 74 6b 65 79 20 62 2d  nto an intkey b-
37410 74 72 65 65 20 75 73 69 6e 67 20 61 20 73 69 6e  tree using a sin
37420 67 6c 65 20 63 75 72 73 6f 72 20 28 61 73 20 63  gle cursor (as c
37430 61 6e 0a 20 20 2a 2a 20 68 61 70 70 65 6e 20 77  an.  ** happen w
37440 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20  hile processing 
37450 61 6e 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  an "INSERT INTO 
37460 2e 2e 2e 20 53 45 4c 45 43 54 22 20 73 74 61 74  ... SELECT" stat
37470 65 6d 65 6e 74 29 2c 20 69 74 0a 20 20 2a 2a 20  ement), it.  ** 
37480 69 73 20 61 64 76 61 6e 74 61 67 65 6f 75 73 20  is advantageous 
37490 74 6f 20 6c 65 61 76 65 20 74 68 65 20 63 75 72  to leave the cur
374a0 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
374b0 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
374c0 6e 0a 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65  n.  ** the b-tre
374d0 65 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 49  e if possible. I
374e0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
374f0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f  left pointing to
37500 20 74 68 65 20 6c 61 73 74 0a 20 20 2a 2a 20 65   the last.  ** e
37510 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
37520 65 2c 20 61 6e 64 20 74 68 65 20 6e 65 78 74 20  e, and the next 
37530 72 6f 77 20 69 6e 73 65 72 74 65 64 20 68 61 73  row inserted has
37540 20 61 6e 20 69 6e 74 65 67 65 72 20 6b 65 79 0a   an integer key.
37550 20 20 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e    ** larger than
37560 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 69   the largest exi
37570 73 74 69 6e 67 20 6b 65 79 2c 20 69 74 20 69 73  sting key, it is
37580 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 69 6e 73   possible to ins
37590 65 72 74 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77  ert the.  ** row
375a0 20 77 69 74 68 6f 75 74 20 73 65 65 6b 69 6e 67   without seeking
375b0 20 74 68 65 20 63 75 72 73 6f 72 2e 20 54 68 69   the cursor. Thi
375c0 73 20 63 61 6e 20 62 65 20 61 20 62 69 67 20 70  s can be a big p
375d0 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74  erformance boost
375e0 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 69  ..  */.  pCur->i
375f0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
37600 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
37610 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d   = 0;.  if( rc==
37620 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
37630 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b  ge->nOverflow ){
37640 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63  .    rc = balanc
37650 65 28 70 43 75 72 29 3b 0a 0a 20 20 20 20 2f 2a  e(pCur);..    /*
37660 20 4d 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20   Must make sure 
37670 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 73  nOverflow is res
37680 65 74 20 74 6f 20 7a 65 72 6f 20 65 76 65 6e 20  et to zero even 
37690 69 66 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29  if the balance()
376a0 0a 20 20 20 20 2a 2a 20 66 61 69 6c 73 2e 20 49  .    ** fails. I
376b0 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72  nternal data str
376c0 75 63 74 75 72 65 20 63 6f 72 72 75 70 74 69 6f  ucture corruptio
376d0 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 6f 74  n will result ot
376e0 68 65 72 77 69 73 65 2e 20 0a 20 20 20 20 2a 2a  herwise. .    **
376f0 20 41 6c 73 6f 2c 20 73 65 74 20 74 68 65 20 63   Also, set the c
37700 75 72 73 6f 72 20 73 74 61 74 65 20 74 6f 20 69  ursor state to i
37710 6e 76 61 6c 69 64 2e 20 54 68 69 73 20 73 74 6f  nvalid. This sto
37720 70 73 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  ps saveCursorPos
37730 69 74 69 6f 6e 28 29 0a 20 20 20 20 2a 2a 20 66  ition().    ** f
37740 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 73 61  rom trying to sa
37750 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ve the current p
37760 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  osition of the c
37770 75 72 73 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 70  ursor.  */.    p
37780 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
37790 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66  ->iPage]->nOverf
377a0 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  low = 0;.    pCu
377b0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
377c0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a  OR_INVALID;.  }.
377d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
377e0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
377f0 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  ge]->nOverflow==
37800 30 20 29 3b 0a 0a 65 6e 64 5f 69 6e 73 65 72 74  0 );..end_insert
37810 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
37820 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
37830 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
37840 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  e cursor is poin
37850 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75  ting to.  The cu
37860 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20  rsor.** is left 
37870 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 61 72  pointing at a ar
37880 62 69 74 72 61 72 79 20 6c 6f 63 61 74 69 6f 6e  bitrary location
37890 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
378a0 42 74 72 65 65 44 65 6c 65 74 65 28 42 74 43 75  BtreeDelete(BtCu
378b0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42  rsor *pCur){.  B
378c0 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e  tree *p = pCur->
378d0 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72  pBtree;.  BtShar
378e0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
378f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a  ;              .
37900 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
37910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37920 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
37930 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 50 61   code */.  MemPa
37940 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20  ge *pPage;      
37950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37960 2f 2a 20 50 61 67 65 20 74 6f 20 64 65 6c 65 74  /* Page to delet
37970 65 20 63 65 6c 6c 20 66 72 6f 6d 20 2a 2f 0a 20  e cell from */. 
37980 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
37990 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pCell;          
379a0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
379b0 20 74 6f 20 63 65 6c 6c 20 74 6f 20 64 65 6c 65   to cell to dele
379c0 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  te */.  int iCel
379d0 6c 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  lIdx;           
379e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
379f0 49 6e 64 65 78 20 6f 66 20 63 65 6c 6c 20 74 6f  Index of cell to
37a00 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74   delete */.  int
37a10 20 69 43 65 6c 6c 44 65 70 74 68 3b 20 20 20 20   iCellDepth;    
37a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a30 20 20 2f 2a 20 44 65 70 74 68 20 6f 66 20 6e 6f    /* Depth of no
37a40 64 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 43  de containing pC
37a50 65 6c 6c 20 2a 2f 20 0a 0a 20 20 61 73 73 65 72  ell */ ..  asser
37a60 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
37a70 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
37a80 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
37a90 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
37aa0 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
37ab0 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e  rt( !pBt->readOn
37ac0 6c 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ly );.  assert( 
37ad0 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 3b 0a  pCur->wrFlag );.
37ae0 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
37af0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
37b00 6b 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  k(p, pCur->pgnoR
37b10 6f 6f 74 2c 20 70 43 75 72 2d 3e 70 4b 65 79 49  oot, pCur->pKeyI
37b20 6e 66 6f 21 3d 30 2c 20 32 29 20 29 3b 0a 20 20  nfo!=0, 2) );.  
37b30 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61 64  assert( !hasRead
37b40 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 70 43 75  Conflicts(p, pCu
37b50 72 2d 3e 70 67 6e 6f 52 6f 6f 74 29 20 29 3b 0a  r->pgnoRoot) );.
37b60 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 75  .  if( NEVER(pCu
37b70 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
37b80 50 61 67 65 5d 3e 3d 70 43 75 72 2d 3e 61 70 50  Page]>=pCur->apP
37b90 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
37ba0 2d 3e 6e 43 65 6c 6c 29 20 0a 20 20 20 7c 7c 20  ->nCell) .   || 
37bb0 4e 45 56 45 52 28 70 43 75 72 2d 3e 65 53 74 61  NEVER(pCur->eSta
37bc0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
37bd0 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
37be0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  n SQLITE_ERROR; 
37bf0 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61   /* Something ha
37c00 73 20 67 6f 6e 65 20 61 77 72 79 2e 20 2a 2f 0a  s gone awry. */.
37c10 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
37c20 73 20 69 73 20 61 20 64 65 6c 65 74 65 20 6f 70  s is a delete op
37c30 65 72 61 74 69 6f 6e 20 74 6f 20 72 65 6d 6f 76  eration to remov
37c40 65 20 61 20 72 6f 77 20 66 72 6f 6d 20 61 20 74  e a row from a t
37c50 61 62 6c 65 20 62 2d 74 72 65 65 2c 0a 20 20 2a  able b-tree,.  *
37c60 2a 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79  * invalidate any
37c70 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72   incrblob cursor
37c80 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 72 6f  s open on the ro
37c90 77 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e  w being deleted.
37ca0 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d    */.  if( pCur-
37cb0 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 7b 0a  >pKeyInfo==0 ){.
37cc0 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 49 6e      invalidateIn
37cd0 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 70 2c  crblobCursors(p,
37ce0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
37cf0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 43 65  , 0);.  }..  iCe
37d00 6c 6c 44 65 70 74 68 20 3d 20 70 43 75 72 2d 3e  llDepth = pCur->
37d10 69 50 61 67 65 3b 0a 20 20 69 43 65 6c 6c 49 64  iPage;.  iCellId
37d20 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  x = pCur->aiIdx[
37d30 69 43 65 6c 6c 44 65 70 74 68 5d 3b 0a 20 20 70  iCellDepth];.  p
37d40 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
37d50 61 67 65 5b 69 43 65 6c 6c 44 65 70 74 68 5d 3b  age[iCellDepth];
37d60 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  .  pCell = findC
37d70 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
37d80 49 64 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Idx);..  /* If t
37d90 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 69  he page containi
37da0 6e 67 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20  ng the entry to 
37db0 64 65 6c 65 74 65 20 69 73 20 6e 6f 74 20 61 20  delete is not a 
37dc0 6c 65 61 66 20 70 61 67 65 2c 20 6d 6f 76 65 0a  leaf page, move.
37dd0 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20    ** the cursor 
37de0 74 6f 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  to the largest e
37df0 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65  ntry in the tree
37e00 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 65 72   that is smaller
37e10 20 74 68 61 6e 0a 20 20 2a 2a 20 74 68 65 20 65   than.  ** the e
37e20 6e 74 72 79 20 62 65 69 6e 67 20 64 65 6c 65 74  ntry being delet
37e30 65 64 2e 20 54 68 69 73 20 63 65 6c 6c 20 77 69  ed. This cell wi
37e40 6c 6c 20 72 65 70 6c 61 63 65 20 74 68 65 20 63  ll replace the c
37e50 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
37e60 64 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20  d.  ** from the 
37e70 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 20 54  internal node. T
37e80 68 65 20 27 70 72 65 76 69 6f 75 73 27 20 65 6e  he 'previous' en
37e90 74 72 79 20 69 73 20 75 73 65 64 20 66 6f 72 20  try is used for 
37ea0 74 68 69 73 20 69 6e 73 74 65 61 64 0a 20 20 2a  this instead.  *
37eb0 2a 20 6f 66 20 74 68 65 20 27 6e 65 78 74 27 20  * of the 'next' 
37ec0 65 6e 74 72 79 2c 20 61 73 20 74 68 65 20 70 72  entry, as the pr
37ed0 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 73 20  evious entry is 
37ee0 61 6c 77 61 79 73 20 61 20 70 61 72 74 20 6f 66  always a part of
37ef0 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 2d 74 72   the.  ** sub-tr
37f00 65 65 20 68 65 61 64 65 64 20 62 79 20 74 68 65  ee headed by the
37f10 20 63 68 69 6c 64 20 70 61 67 65 20 6f 66 20 74   child page of t
37f20 68 65 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65  he cell being de
37f30 6c 65 74 65 64 2e 20 54 68 69 73 20 6d 61 6b 65  leted. This make
37f40 73 0a 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67  s.  ** balancing
37f50 20 74 68 65 20 74 72 65 65 20 66 6f 6c 6c 6f 77   the tree follow
37f60 69 6e 67 20 74 68 65 20 64 65 6c 65 74 65 20 6f  ing the delete o
37f70 70 65 72 61 74 69 6f 6e 20 65 61 73 69 65 72 2e  peration easier.
37f80 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67    */.  if( !pPag
37f90 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69  e->leaf ){.    i
37fa0 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20  nt notUsed;.    
37fb0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
37fc0 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
37fd0 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69  &notUsed);.    i
37fe0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
37ff0 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76  c;.  }..  /* Sav
38000 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  e the positions 
38010 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72  of any other cur
38020 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69  sors open on thi
38030 73 20 74 61 62 6c 65 20 62 65 66 6f 72 65 0a 20  s table before. 
38040 20 2a 2a 20 6d 61 6b 69 6e 67 20 61 6e 79 20 6d   ** making any m
38050 6f 64 69 66 69 63 61 74 69 6f 6e 73 2e 20 4d 61  odifications. Ma
38060 6b 65 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  ke the page cont
38070 61 69 6e 69 6e 67 20 74 68 65 20 65 6e 74 72 79  aining the entry
38080 20 74 6f 20 62 65 20 0a 20 20 2a 2a 20 64 65 6c   to be .  ** del
38090 65 74 65 64 20 77 72 69 74 61 62 6c 65 2e 20 54  eted writable. T
380a0 68 65 6e 20 66 72 65 65 20 61 6e 79 20 6f 76 65  hen free any ove
380b0 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f  rflow pages asso
380c0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
380d0 0a 20 20 2a 2a 20 65 6e 74 72 79 20 61 6e 64 20  .  ** entry and 
380e0 66 69 6e 61 6c 6c 79 20 72 65 6d 6f 76 65 20 74  finally remove t
380f0 68 65 20 63 65 6c 6c 20 69 74 73 65 6c 66 20 66  he cell itself f
38100 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 70  rom within the p
38110 61 67 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 72 63  age.  .  */.  rc
38120 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
38130 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  s(pBt, pCur->pgn
38140 6f 52 6f 6f 74 2c 20 70 43 75 72 29 3b 0a 20 20  oRoot, pCur);.  
38150 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
38160 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
38170 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
38180 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
38190 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
381a0 72 63 3b 0a 20 20 72 63 20 3d 20 63 6c 65 61 72  rc;.  rc = clear
381b0 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
381c0 6c 29 3b 0a 20 20 64 72 6f 70 43 65 6c 6c 28 70  l);.  dropCell(p
381d0 50 61 67 65 2c 20 69 43 65 6c 6c 49 64 78 2c 20  Page, iCellIdx, 
381e0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
381f0 65 2c 20 70 43 65 6c 6c 29 2c 20 26 72 63 29 3b  e, pCell), &rc);
38200 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
38210 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 66 20  rn rc;..  /* If 
38220 74 68 65 20 63 65 6c 6c 20 64 65 6c 65 74 65 64  the cell deleted
38230 20 77 61 73 20 6e 6f 74 20 6c 6f 63 61 74 65 64   was not located
38240 20 6f 6e 20 61 20 6c 65 61 66 20 70 61 67 65 2c   on a leaf page,
38250 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
38260 0a 20 20 2a 2a 20 69 73 20 63 75 72 72 65 6e 74  .  ** is current
38270 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ly pointing to t
38280 68 65 20 6c 61 72 67 65 73 74 20 65 6e 74 72 79  he largest entry
38290 20 69 6e 20 74 68 65 20 73 75 62 2d 74 72 65 65   in the sub-tree
382a0 20 68 65 61 64 65 64 0a 20 20 2a 2a 20 62 79 20   headed.  ** by 
382b0 74 68 65 20 63 68 69 6c 64 2d 70 61 67 65 20 6f  the child-page o
382c0 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20  f the cell that 
382d0 77 61 73 20 6a 75 73 74 20 64 65 6c 65 74 65 64  was just deleted
382e0 20 66 72 6f 6d 20 61 6e 20 69 6e 74 65 72 6e 61   from an interna
382f0 6c 0a 20 20 2a 2a 20 6e 6f 64 65 2e 20 54 68 65  l.  ** node. The
38300 20 63 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 6c   cell from the l
38310 65 61 66 20 6e 6f 64 65 20 6e 65 65 64 73 20 74  eaf node needs t
38320 6f 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68  o be moved to th
38330 65 20 69 6e 74 65 72 6e 61 6c 0a 20 20 2a 2a 20  e internal.  ** 
38340 6e 6f 64 65 20 74 6f 20 72 65 70 6c 61 63 65 20  node to replace 
38350 74 68 65 20 64 65 6c 65 74 65 64 20 63 65 6c 6c  the deleted cell
38360 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
38370 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
38380 4d 65 6d 50 61 67 65 20 2a 70 4c 65 61 66 20 3d  MemPage *pLeaf =
38390 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
383a0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
383b0 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 50  int nCell;.    P
383c0 67 6e 6f 20 6e 20 3d 20 70 43 75 72 2d 3e 61 70  gno n = pCur->ap
383d0 50 61 67 65 5b 69 43 65 6c 6c 44 65 70 74 68 2b  Page[iCellDepth+
383e0 31 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 75 6e  1]->pgno;.    un
383f0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 54 6d  signed char *pTm
38400 70 3b 0a 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20  p;..    pCell = 
38410 66 69 6e 64 43 65 6c 6c 28 70 4c 65 61 66 2c 20  findCell(pLeaf, 
38420 70 4c 65 61 66 2d 3e 6e 43 65 6c 6c 2d 31 29 3b  pLeaf->nCell-1);
38430 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 63 65 6c  .    nCell = cel
38440 6c 53 69 7a 65 50 74 72 28 70 4c 65 61 66 2c 20  lSizePtr(pLeaf, 
38450 70 43 65 6c 6c 29 3b 0a 20 20 20 20 61 73 73 65  pCell);.    asse
38460 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  rt( MX_CELL_SIZE
38470 28 70 42 74 29 3e 3d 6e 43 65 6c 6c 20 29 3b 0a  (pBt)>=nCell );.
38480 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d  .    allocateTem
38490 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
384a0 20 70 54 6d 70 20 3d 20 70 42 74 2d 3e 70 54 6d   pTmp = pBt->pTm
384b0 70 53 70 61 63 65 3b 0a 0a 20 20 20 20 72 63 20  pSpace;..    rc 
384c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
384d0 69 74 65 28 70 4c 65 61 66 2d 3e 70 44 6